본문 바로가기
Languages

Android에서 HTTP URL 허용 설정

by lucidiz 2023. 4. 4.
반응형

 

Android
Android

안드로이드 앱에서 네트워크 통신을 할 시 Retrofit 라이브러리를 많이 사용합니다. 저 같은 경우, Retrofit 라이브러리를 사용하는 중에 "retrofit error not permitted by network security policy" 에러가 발생해서 Retrofit 라이브러리 문제인 줄 알았습니다. 하지만 Retrofit 라이브러리 문제가 아닌 Network Security Config 설정의 문제인 것을 알았고 다음과 같이 해결하였습니다.

 

안드로이드 앱을 개발 시, 안전한 앱 개발을 위해서 HTTPS를 사용하는 게 맞지만 때로는 어쩔 수 없이 HTTP를 허용해 줘야 하는 경우도 있습니다.

 

안드로이드 앱 개발 시, HTTP URL을 사용하게 되면 "retrofit error not permitted by network security policy" 에러가 발생합니다. 이런 에러가 발생하는 원인은 Android 9.0부터 HTTPS를 사용하도록 강제화 하고 있기 때문입니다.

 

Android 9.0(Pie)부터는 모든 앱에서 네트워크 보안을 강화하기 위해 HTTPS를 강제화하고 있습니다. 이는 앱이 HTTP를 통해 데이터를 전송하는 것을 막아 보안에 취약한 상황을 방지하기 위한 것입니다.

HTTPS는 HTTP와 달리, 데이터 전송 과정에서 암호화를 수행하여, 중간에 제3자가 데이터를 가로채더라도 데이터를 해독할 수 없도록 보호합니다. 이를 통해 사용자의 개인정보와 데이터를 보호할 수 있습니다.

Android 9.0부터는 이러한 HTTPS 강제화를 통해, 개인정보 보호와 보안성을 강화하고, 데이터 유출 등의 보안 이슈를 예방할 수 있습니다. 이를 위해, Android 시스템에서는 안드로이드 9.0(Pie)부터는 기본적으로 android:usesCleartextTraffic 속성을 false로 설정하여 HTTP 통신을 차단하고, HTTPS 프로토콜을 사용하도록 요구합니다.

하지만, HTTPS 강제화는 앱 개발자들에게도 영향을 미칩니다. 앱에서 HTTP 통신을 사용하는 경우, 해당 앱에서는 Android 9.0 이상의 버전에서는 HTTP 통신이 차단됩니다. 따라서, 앱에서 사용하는 모든 네트워크 통신은 HTTPS를 사용해야 합니다. 이를 위해, 네트워크 보안 설정이나 HTTPS를 사용하는 라이브러리(Retrofit, OkHttp 등) 등을 이용하여 개발을 진행해야 합니다.

 

 

따라서 HTTP 를 사용하게 되면  "retrofit error not permitted by network security policy" 에러가 발생하게 됩니다.

어쩔 수 없이 HTTP URL을 허용하여 안드로이드 앱을 개발 시에는 다음과 같이 하시면 됩니다.

1. 'AndroidManifest.xml'에서 네트워크에 대한 접근권한을 허용해 줍니다. 

 

<HTTPS 만 사용 시>

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

 <HTTP 사용 시>

 </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

 

2.  Network Security Config를 설정합니다.

 

'xml/network_security_config.xml'을 수정합니다.

 

<특정 주소만 허용하기>

 

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

 

<모든 URL 허용하기>

 

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/main_title"
        ...
        android:cleartextTrafficPermitted="true"
 
 

 

반응형