박상권의 삽질블로그

[안드로이드]CLEARTEXT communication to XXXX not permitted by network security policy 본문

IT/Android-TIP (한글)

[안드로이드]CLEARTEXT communication to XXXX not permitted by network security policy

박상권 2018. 12. 9. 20:39

제가 운영하고 있는 유튜브 채널 '개발자 테드박'에도 많은 관심 부탁드려요.
스타트업/개발자/IT 관련된 여러 영상을 올리고 있습니다.
영상보러가기



블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기




"CLEARTEXT communication to XXXX not permitted by network security policy"


어느날 코드를 바꾼게 없는데도 위와 같은 오류가 발생하면서 앱이 실행이 안되는 일이 발생합니다.

그 이유는 여러분 혹은 사용자폰의 OS가 안드로이드 9.0 파이(Pie)이기 때문입니다.

그리고 여러분이 사용하는 API주소, 이미지주소 등 네트워크 경로가 https가 아닌 http로 되어 있기 때문입니다.


안드로이드 9.0 파이에서는 https를 사용하도록 강제합니다.

주소가 http인경우 위와같은 에러메세지가 발생하게 됩니다.

Protecting users with TLS by default in Android P


그외 안드로이드 9.0 파이에서 추가/변경된 내용 살펴보기



2018.12.09 기준으로 아직 안드로이드 9.0 파이버전이 정식배포되지 않아서 이 오류를 발견하신분들은 많지 않을것입니다.

지금까지 우리는 마시멜로우, 오레오 등으로 OS를 업데이트할때마다 여러 이슈들에 맞닥뜨린 경험이 많았습니다.

그래서 저는 파이버전이 미리 배포되기전에 직접 제 폰을 업데이트해서 앞으로 발생할 이슈가 없는지 체크해보았습니다.

(삼성 멤버스앱에서 베타 프로그램에 가입하면 파이버전으로 업데이트해서 테스트해볼 수 있습니다.)




해결방법1

아주 간단합니다.

현재 앱안에서 사용중인 네트워크 주소를 http -> https 로 변경하세요.

그럼 더이상 바꿀 코드가 없습니다.



해결방법2

물론 1번 방법으로 간단하게 변경할 수 없는 경우가 있습니다.

서버에서 아직 https로 구성되어 있지 않은경우에는 어쩔수없이 http로 사용해야합니다.


그럴때는 해당 서버주소를 http여도 실행되도록 허용해주도록 설정해줍니다.

res/xml 에 아래와 같은 xml파일을 만들어 줍니다.


res/xml/network_security_config.xml

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

그리고 Manifest에 이 xml파일을 config파일로 지정해줍니다.


<application
...
android:networkSecurityConfig="@xml/network_security_config">



해결방법 2-1

위의 방법은 특정 주소를 허용가능하도록 설정하지만 그렇지 않은 상황인 경우도 있습니다.
예를들면, 우리 서비스가 아닌 특정 사이트나 특정 이미지 경로를 외부를 통해서 가져오게 되는데 이는 우리가 컨트롤 할 수 없는 부분이기 때문에 어쩔수없이 http주소를 사용해야 하는 경우도 있습니다.

그럴땐 위의 res/xml/network_security_config.xml에서 모든 경로가 허용되도록 설정해줍니다.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>




해결방법3

위의 방법보다 더 간단한 방법도 있습니다.

Android Manfest에서 usesCleartextTraffic를 true로 설정합니다.

<application
...
android:usesCleartextTraffic="true">

이 방법이 2번의 방법보다 훨씬 간단한데 어떤점에서 안좋은게 있는것인지는 아직 알 수 없습니다.

혹시 3번의 방법의 단점을 아시는분은 댓글로 알려주시면 감사하겠습니다.




구글님 저희가 잘못했습니다.. 어린양을 괴롭히지 말아주세요..

안드로이드 기기의 파편화만으로도 대응하기 너무 힘든데 API레벨 OS별로 대응을 하도록 하지 않도록 도와주세요.

하지만 우린 답을 찾을것이다. 늘 그랬듯이

[IT/Android-TIP (한글)] - [안드로이드]Only fullscreen opaque activities can request orientation 과 중복주의)




그럼 모든 안드로이드 개발자분들의 정신건강을 응원합니다.

피쓰.

Comments