증상

안드로이드 9 파이 부터는 보안상의 문제로 HTTP 통신을 방지한다.

마치 CORS 설정이 안되어있을 때 처럼 통신 자체가 불가하다.

1. 근본적인 해결책

HTTPS 통신만을 사용한다.

하지만 만약 외부 API를 통신하는 상황에서 HTTP 프로토콜만을 제공하고 있는 상황이라면 클라이언트 단에서 통신을 허용하도록 변경해야 한다.

2. 안드로이드에서 HTTP 통신을 허용하는 방법

2-1 userCleartextTraffic 설정

AndroidManifext.xml <application> 부분에

android:usesCleartextTraffic="true" 속성을 넣어준다.

기본 속성은 false 로 안드로이드 9 버전을 타켓으로 해서 빌드하는 경우 HTTP 통신이 필터링 된다.

가장 사용하기 간단한 반면 보안적인 측면에서는 가장 취약 할 수 있다.

2-2 네트워크 보안 설정 문서를 독립시켜서 whiteList 를 생성하는 방법

network-security-config 파일을 작성한다.

<?xml version="1.0" encoding="utf-8"?>
 <network-security-config>
   <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">도메인1 (예 domain1.com)</domain>
        <domain includeSubdomains="true">도메인2 (예 domain2.com)</domain>
        <domain includeSubdomains="true">도메인3 (예 domain3.com)</domain>
   </domain-config>
  </network-security-config>

<application> 부분에 android:networkSecurityConfig="설정파일경로" 를 넣어준다.

리소스 폴더에 res/xml/network.xml 파일을 생성하는 경우 다음과 같이 작성한다.

<application android:networkSecurityConfig="@xml/network">

결론

백엔드 서비스를 https를 필수로 설정해야 되는 시기가 온 것 같다.

외부 라이브러리의 경우 https 프로토콜을 지원하지 않는 다면 해당 도메인만 설정하고

자체적으로 운영하는 API 라면 미리 세팅해놓는편이 여러모로 좋은 것 같다.

참조

Android Developers Document

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