Tech & Programming/모바일(Android, Flutter)

안드로이드 http 프로토콜 접속 시 예외발생 조치 (ERR CLEARTEXT NOT PERMITTED)

소스코드 요리사 2019. 1. 23. 12:03

어제 앱을 개발 중 glide v4를 사용하여 웹에 있는 그림을 load 하였는데, 아래와 같은 예외를 주며 동작을 하지 않았습니다.


com.bumptech.glide.load.engine.GlideException: Fetching data failed, class java.io.InputStream, REMOTE

There was 1 cause:

java.io.IOException(Cleartext HTTP traffic to ~~~~ not permitted)

 call GlideException#logRootCauses(String) for more detail


처음에는 glide 4로 버전업을 하면서 뭔가 바뀐 것이 있나 싶어서 glide 문서를 뒤지고, 관련 코드들을 보았는데 특별한 것이 없었습니다. 그림을 load 할 대상 주소를 보던 중 문득 예전에 안드로이드가 https 가 아닌 http 프로토콜 접속을 제한한다는 구글 블로그 내용이 떠올랐습니다.


  [그림1] google develops korea blog 내용 발췌


그래서 구글 검색을 해보니 실제로 이 예외는 안드로이드9(APL Lv 28) 부터 강화된 네트워크 보안정책으로 인한 오류였습니다.

몇몇 사이트를 돌아다니며, 확인해보니 3가지 해결방법이 있었습니다.

저는 1번의 방법으로 해결하였습니다. 다른 방법도 함께 소개하오니 많은 도움되셨으면 합니다.


1. AndroidManifest.xml 파일의 <application> 부분에 android:usesCleartextTraffic="true" 로 설정

cleartext HTTP와 같은 cleartext 네트워크 트래픽을 사용할지 여부를 나타내는 flag로 이 플래그가 flase 로 되어 있으면, 플랫폼 구성 요소 (예 : HTTP 및 FTP 스택, DownloadManager, MediaPlayer)는 일반 텍스트 트래픽 사용에 대한 앱의 요청을 거부하게 됩니다.

이 flag를 설정하게 되면 모든 cleartext 트래픽은 허용처리가 됩니다.


2. networkSecurityConfig 파일을 생성하고, AndroidManifest 에 등록


res/xml/network_security_config.xml 아래와 같이 추가합니다.

<domain includeSubdomains="true">ebookfrenzy.com</domain> 등록된 도메인은 https 가 아니어도 허용이 됩니다.


<?xml version="1.0" encoding="utf-8"?>

<network-security-config>

    <domain-config cleartextTrafficPermitted="true">

        <domain includeSubdomains="true">ebookfrenzy.com</domain>

    </domain-config>

</network-security-config>


그리고, 아래와 같이 추가할 경우는 secure.example.com 도메인만 항상 HTTPS를 통해서만 수행하게 됩니다.


<?xml version="1.0" encoding="utf-8"?>

<network-security-config>

    <domain-config cleartextTrafficPermitted="false">

        <domain includeSubdomains="true">secure.example.com</domain>

    </domain-config>

</network-security-config>


그 다음에 AndroidManifest.xml 파일의 <application> 부분에 networkSecurityConfig속성 추가

<application 

android:networkSecurityConfig="@xml/network_security_config" 

~~~ >

</application>


3.Android Manifest.xml 파일에서 targetSandboxVersion를 1로 설정

SandboxVersion 속성값이 높을수록 보안 수준이 높아지며, 2일 경우 usesCleartextTraffic의 기본값은 false 입니다.

따라서, 이 속성의 값을 1로 변경하면 문제를 해결할 수 있습니다.

다만 Android 8.0 (API 26) 이상을 타겟팅하는 Android Instant Apps의 경우 이 속성을 2로 설정해야합니다.


참고로 앱이 설치되면 이 속성값을 더 높은 값으로 만 업데이트 할 수 있다고합니다.

이 속성값을 다운 그레이드하려면 앱을 제거후 재설치 해야합니다.



[Reference]

Android Developers Blog - 

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


Stackoverflow -

https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted


Android Developers site -

https://developer.android.com/training/articles/security-config

https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted

https://developer.android.com/guide/topics/manifest/manifest-element#targetSandboxVersion


Blog -

https://nobase-dev.tistory.com/category/Android%EA%B0%9C%EB%B0%9C/Tips