배경
스프링으로 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을 설정해야합니다!
제 글이 한 사람에게라도 도움이 되었으면 좋겠네요
글 읽어주셔서 감사합니다!
'IDE > Android Studio' 카테고리의 다른 글
[Android Studio] 인텐트 알아보기 (0) | 2023.08.30 |
---|---|
[AndroidStudio][Kotlin] Retrofit, 레트로핏으로 api 사용하기 (0) | 2023.08.16 |
[AndroidStudio][Kotlin] WebView로 웹 페이지 안드로이드 앱으로 빌드하기 (0) | 2023.08.15 |
[AndroidStudio][Kotlin] 웹 뷰 에러 net::ERROR_CACHE_MISS, (0) | 2023.08.13 |
[AndroidStudio][Kotlin] EditText의 addTextChangedListener, TextWatcher, TextWatcherAdapter (0) | 2023.08.13 |