안드로이드와 스프링을 연동한 어플을 만들다가 간만에 이 에러를 만났다. 이 에러는 보안이 적용되지 않은 HTTP 프로토콜로 통신하려할 떄 만날 수 있는 에러이다. 에러 메시지를 살펴보면 "CLEAR TEXT"라는 단어가 등장하는데 이는 직역하면 "평문"이며 암호학에서 암호화되지 않은 정보를 의미한다. 에러 메시지는 말 그대로 "네트워크 보안 정책에 의거하여 로컬 호스트에 대한 평문 전송을 허용할 수 없다"는 의미다. 안드로이드는 9(Level 28)부터 HTTP에 대한 통신을 기본적으로 불허하고 있다. 앞에 한 말들은 HTTP, HTTPS에 대한 개념에 대해 알고 있다면 어렵지 않게 이해할 수 있다. 이해가 되지 않는다면 HTTPS 혹은 SSL(TLS)에 대해서 알아보고 오자.

 

 

 

 이 에러의 해결 방안을 검색하면 요청할 URL의 프로토콜을 HTTP에서 HTTPS로 바꾸어주라는 것을 볼 수 있다.

 

 

 

 데이터(API)를 요청하려는 서버가 공식적으로 API를 제공하고 있다면 프로토콜을 바꾸어주는 것으로 문제가 해결될 것이다. 하지만 요청하려는 서버가 개인(혹은 자신)이 만든 서버이고 보안 설정을 해두지 않았다면 다시 에러 메시지(Failed to connect to localhost/127.0.0.1:8012)를 마주하게 될 것이다. 처음 발생한 에러 메시지는 HTTP 말고 HTTPS를 사용하라는 의미이긴 하지만 서버 단에서 HTTPS에 대한 보안이 설정되어 있지 않다면 클라이언트인 안드로이드 측에서 HTTPS로 데이터를 요청해도 서버와 통신이 불가능한 것이다.

 

 

 기본적으로 서버는 보안이 제대로 적용되어 있어야 한다. 하지만 서버에 대해 익숙하지 않은 사람이나 스프링으로 과제물을 만드는 학생들, 단순히 공부 과정에서 테스트만 하고 싶은 사람에게 보안까지 적용하는 건 다소 무리일 수 있기에 HTTP를 사용할 수 있는 대안이 존재한다.

 

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

 manifests 파일의 <application> 태그 내에 위처럼 android:usesCleartextTraffic="true" 한줄을 추가해주면 통신을 할 때 HTTP 프로토콜을 사용할 수 있다.

 

 

 혼자 사용하는 내부 서버나 과제물같은 수준이라면 위와 같은 설정을 적용시켜 사용해도 문제없다. 필자가 이 에러를 처음 본 건 몇 년 전이지만 가끔 프로젝트를 새로 만들고 테스트할 때 이 에러를 만나기 때문에 뇌도 돌릴 겸 가볍게 포스팅해보았다. 스프링 프로젝트를 기준으로 HTTPS 보안 설정을 하는 포스팅을 할 기회가 있다면 여기에 추가하도록 하겠다.

 

 포스팅이 도움이 되었다면 좋겠습니다.

+ Recent posts