하루에 0.01%라도 성장하자

Develop/Android

안드로이드 http 통신 이슈 - Error : java.net.ConnectException: Failed to connect to

뚠님 2019. 11. 14. 14:15
반응형

안드로이드 네트워크 통신을 할 때 기본적으로 매니페스트(manifest) 퍼미션(permission)을 설정해 준다.

 

AndroidManifest.xml

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

 

이후에 http에 보안이슈가 확인되면서 https가 아닌 프로토콜에 대하여 기본적으로 동작하지 못하게 되었다.

이것은 설정을 통해 해결이 가능한데 아래 설정을 공유 하려고 한다.

 

설정 하는 방법

http를 가능하도록 설정하는 방법은 여러가지 방법이 있고, 이를 모두 공유하려고 한다.

 

1. usesCleartextTraffic="true"

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

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

 

manifest application 설정에 usesCleartexTraffic 값을 true로 설정해주면 된다.

이는 flag를 설정 하는 것으로, 이것을 설정하지 않으면 default로 false 값으로 설정된다.

 

네트워크 트래픽을 사용할지 여부를 나타내는 것으로 일반 텍스트 트래픽 사용을 위해 요청하는 앱을 거부한다.

따라서 flag의 값을 true로 변경해주면 된다.

 

2. networkSecurityConfig 파일 설정

 

음.. 우선 파일 명을 어떻게 만들어도 상관 없을 것 같은데, 우선 network-security-config를 설정하는 것이니 비슷하게 만들었다..

 

res/xml/network_security_config.xml 파일을 만들어 준다. 

( 아마 res파일 밑에 xml 리소스 디렉토리가 없을 수 있으니, 만들어 주고 해당 경로에 맞추어 생성해주면 된다. )

 

res/xml/network_security_config.xml


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
    </base-config>
</network-security-config>

 

이렇게 만들어 주고 아래 manifest 설정을 해준다.

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                        ... >
            ...
        </application>
    </manifest>

 

이렇게 network-security-config 파일 내용을 적어주면 된다. 보면 1번 방법에서 사용한 설정값이 포함되어 있다.

따라서 1번 방법과 다른점은 1번의 경우 manifest에 직접 설정을 해준 것이고, 2번 방법은 xml 파일을 만들어서 거기에 config 설정값을 작성한 후 그 xml 파일을 manifest에 적용하는 방식이라고 보면 된다.

 

2번 방법이 더 좋다고 생각하는데 이유는 network에 대한 설정을 몰아서 확인 할 수 있다는 점과, 이후에 정책 혹은 요구사항에 따라 변화하는 네트워크 설정을 추가, 삭제하는데 용이하기 때문이다.

 

<TMI>

 

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

이렇게 domain으로 설정하면 해당 사이트에 요청하는 것은 https가 아니어도 가능하다 ( http 가능 )

 

 

3. targetSandboxVersion 변경

 

SandboxVersion의 값이 높을 수록 보안 수준이 높아진다.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    ...

 

위에서 말한 cleartextTrafficPermitted의 기본값이 false로 처리되는 것은 SandboxVersion값이 2일 경우다.

 

따라서 SandboxVersion을 1로 처리하면 API 25 이하로는 문제없이 처리가 가능하다, 다만 API 26 이상은 SandboxVersion을 꼭 2로 설정을 해야 한다. 

 

개인적으로 현재 안드로이드 업데이트는 빠른속도로 진행 중이기 때문에 이 방법을 추천하지 않는다. ( 특별한 사정이 있는 앱의 경우는 예외 )

반응형