안드로이드 에뮬레이터 -http-proxy 옵션과 80 포트 이외의 호스트명 문제

안드로이드 에뮬레이터 실행 시 -http-proxy 옵션으로 프록시를 설정할 수 있다.

emulator -avd {장치명} -http-proxy {프록시 IP}:{프록시 포트}

개발 머신에 구축한 프록시 서버를 구축하고 안드로이드 에뮬레이터에 개발 머신의 프록시 서버를 설정해주면 개발 머신에 127.0.0.1로 설정된 호스트명(도메인 네임)에도 접근이 가능해진다.

하지만 큰 문제가 있다. 안드로이드 에뮬레이터에서 HTTP 80 포트 이외의 포트로 접속하면 프록시에 호스트명으로 요청하지 않는다.

예를 들어 개발 머신에 foobar.com을 127.0.0.1로 설정했다고 했을때 안드로이드 에뮬레이터에서 http://foobar.com 으로 접속하면 프록시 서버에 GET http://foobar.com 과 같은 HTTP GET 요청하게 되고 프록시는 개발 머신의 처리 결과를 응답하며 아무 문제가 없다.

하지만 http://foobar.com:8080과 같은 80 포트 이외의 포트로 접속하면 DNS로부터 foobar.com에 대한 IP 주소를 받아서 프록시 서버에 CONNECT 121.111.222.123:8080 과 같은 TCP CONNECT 요청을 한다. 때문에 개발 서버의 127.0.0.1로 연결하지 않는 문제가 발생한다.

이 문제를 해결하고자 많은 자료를 조사해봤지만 방법을 찾지 못했다.

그래서 결국 개발 머신에 프록시 서버 대신에 dnsmsq로 DNS 서버를 구축하고 -dns-server 옵션을 사용했다.

emulator -avd {장치명} -dns-server {DNS IP}

그리고 당연히 foobar.com 도메인에는 127.0.0.1 대신에 개발 머신의 IP로 연결되도록 DNS 설정을 해줘야 한다.

나는 개발 머신이 안드로이드 에뮬레이터를 실행하는 호스트 컴퓨터였기 때문에 10.0.2.2(안드로이드 에뮬레이터 호스트 루프백 인터페이스의 특수 별칭, 개발 머신의 127.0.0.1)를 설정했다.

안드로이드 에뮬레이터가 개발 머신의 개발중인 서비스에 연결하기 위해 안드로이드 에뮬레이터의 /etc/hosts 변경도 해보고 프록시 설정도 해봤지만 결국 DNS 서버 구축이 모든 면에서 가장 문제 없이 깔끔했다.