IDE/Android Studio

[AndroidStudio][Kotlin] 안드로이드 스튜디오 로컬 서버 연결 security 설정, localhost가 안되는 이유, UnknownServiceException

  • -

배경

스프링으로 API를 만들고, 로컬 서버를 열어서 레트로핏으로 get 요청을 보내보려고 했습니다.

근데 제대로 요청을 보내지 못하고 onFailure()가... 

t.toString() 로 무슨 에러인지 알아보았습니다.

UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy





security 설정

챗gpt와 구글링을 통해 저 security 설정 문제임을 알게되었습니다.

UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy

위 에러 메세지는 네트워크 보안 정책으로 인해 앱이 네트워크 보안을 준수하지 않아 발생하는 문제라고 하네요

 

로컬서버라 프로토콜이 https 가 아닌 http라 이런 에러가 발생했습니다.

 

그래서 이 에러를 해결하기 위해 두 가지 방법을 시도했습니다.

 

 

 

 

 

안드로이드 네트워크 보안 설정 변경

프로젝트에 res/xml/network_security_config.xml 파일을 생성하고 다음과 같이 설정해주세요.

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

이렇게하면 앱은 Cleartext 통신을 허용합니다. 다만, 이 방법은 보안 측면에서는 안좋다고 합니다...

 

 하지만!! 저는 이 방법이 통하지 않았어요... 바로 다음 방법을 시도해봤습니다.

 

 

 

 

 

AndroidManifest.xml에서 Cleartext 허용 설정 변경

AndroidManifest.xml 파일에 다음과 같이 설정을 추가했습니다.

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

이 방법을 시도했더니 드디어! get 요청을 성공적으로 보냈습니다...!

하지만 이 역시 보안상 좋지 않으니 되도록이면 https를 사용하시길!

 

 

 

 

localhost, 10.0.2.2

위 방법을 다 시도했는데 안되시는 분들은

base url이 localhost인지 확인하셔야 합니다.

 

ip주소가 localhost 또는 127.0.0.1이신 분들은 아마 다음과 같은 에러 메세지를 마주하셨을겁니다

java.net.ConnectException: Failed to connect to localhost/127.0.0.1:8080

 

보통 로컬 서버는 localhost나 127.0.0.1 주소로 접근합니다.

하지만 안드로이드 스튜디오에서의 localhost는 애뮬레이터의 로컬이기 때문에 

localhost:포트번호가 아닌 http://10.0.2.2:포트번호 로 base url을 설정해야합니다!

 

 

제 글이 한 사람에게라도 도움이 되었으면 좋겠네요

글 읽어주셔서 감사합니다!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.