Android/study_til

[Android Studio] Http protocol 접속 시, 발생하는 예외발생 조치하기

Heon_9u 2020. 12. 30. 00:10
728x90
반응형

지난 포스팅에서 공공데이터의 Open API를 활용하다가 아래와 같은 에러코드로 인해 4시간을 해맸습니다.

 

I/System.out: Cleartext HTTP traffic to ws.bus.go.kr not permitted

 

또한, AVD에서는 아래와 같이 나왔습니다.

 

 

처음에는 Unexpected token만 보고 Open API에 응답 결과를 Stream형태로 바꾸는 과정에 문제가 있다고 판단하고 접근했습니다. 하지만 에러코드를 확인하고는 바로 문제를 해결할 수 있었습니다.

 


Permission

 해당 문제를 해결하면서 안드로이드는 자동으로 INTERNET에서 접속할 수 없음을 알았습니다. Open API로 요청을 보내거나 서버로 Http Request를 보낼 때, 다음 설정을 Manifest에 추가해야 합니다.

 

<uses-permission android:name="android.permission.INTERNET" />

 이는 안드로이드가 INTERNET에 접속할 수 있도록 허가해주는 설정입니다.

 

HTTP 프로토콜 접속 제한

 안드로이드 9 Pie부터 강화된 네트워크 보안 정책으로 발생하는 문제가 있습니다. 바로 HTTPS가 아닌 HTTP 프로토콜은 안드로이드가 보안상의 이유로 접속을 제한하고 있다는 것입니다. API28 버전부터는 HTTP 프로토콜을 통신하게 되면 맨 위에 작성한 에러코드가 발생하게 됩니다.

 이를 해결하는 방법은 4가지가 있습니다.

 

1. AndroidManifest.xml 파일 수정

 <application>태그에 다음 코드를 추가합니다.

 

android:usesCleartextTraffic="true"

 

2. networkSecurityConfig 파일 생성

 res/xml/network_security_config.xml 파일 생성

 

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">test.com</domain>
        <domain includeSubdomains="true">moretest.com</domain>
    </domain-config>
</network-security-config>

 

 의미는 test.com이나 moretest.com일 경우, 예외적으로 http를 허용하는 코드입니다. 그리고 Manifest에 다음을 추가합니다.

android:networkSecurityConfig="@xml/network_security_config"

 

3. 빌드 타겟을 Pie미만으로 설정

 단순히 빌드를 Pie 미만으로 설정해서 강제로 접속 제한을 피하는 방법입니다.

 

 

4. Manifest에 targetSandboxVersion을 변경

 

<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET"/>
</mainfest>

 

SandboxVersion의 속성값이 높을수록 보안 수준이 높아집니다. Pie로 빌드할 경우 2가 되어 usesCleartextTraffic의 기본 값이 false가 되기 때문에 이를 1로 변경합니다.

 그러나 이 때, InstantApp을 할 경우, Android 8이상일 경우에는 2로 설정해야 한다고 합니다. 이는 다른 보안 사항들도 같이 적용되기 때문에 추천드리지 않습니다. 

 

 

 

왠만하면 HTTPS를 사용하는게 좋겠지만, 꼭 필요한 경우에는 2번처럼 예외 사이트를 등록해 사용하는 것을 추천드립니다. (예를 들면 공부 목적이나 test 서버)

 

android-developers.googleblog.com/2018/04/protecting-users-with-tls-by-default-in.html

 

Protecting users with TLS by default in Android P

Posted by Chad Brubaker, Senior Software Engineer Android Security Android is committed to keeping users, their devices, and their da...

android-developers.googleblog.com

 

728x90
반응형