웹뷰를 사용하다 보면 'ERR_CLEARTEXT_NOT_PERMITTED' 를 볼 수 있다.
원인은 앱이 cleartext를 허용하지 않았기 때문인데,
앱이 안드로이드 9(Pie, API 28)이상을 타겟팅하는 경우 기본적으로 usesCleartextTraffic 속성 기본값이 false이다.
따라서 TLS를 사용하지 않는 도메인의 경우, 네트워크 통신이 기본적으로 불가능하다.
아래의 방법 중 하나를 사용해서 처리를 해주면 정상적으로 통신이 가능하다.
1. useCleartextTraffic 속성값 변경
AndroidManifest.xml에서 <application>의 useCleartextTraffic 속성값을 true로 변경한다.
해당 방법은 매우 간단하지만 Android Developer에서는 추천하지 않는 방법이다. 모든 도메인에 대한 접근이 가능하도록 설정하는 것은 보안상 적절하지 않다는 뜻이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
...
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
2. networkSecurityConfig 설정
해당 속성은 AndroidManifest.xml에서 <application>의 속성으로 접근을 허용할 도메인에 대한 설정을 해줄 수 있는 방법으로 Android 7.0(Nougat, API 24)에 추가되었다.
config파일을 생성한 후에 AndroidManifest.xml에 속성값으로 추가해주면 된다.
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your domain</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="...">
...
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
참고 링크:
https://developer.android.com/about/versions/pie/android-9.0-changes-28
https://developer.android.com/training/articles/security-config.html