발단
필자는 net/http/httputil
패키지에 포함된 httputil.ReverseProxy
를 사용하여,
간이 역방향 프록시 프로그램을 개발 중에 있었다. 하지만, https://www.google.com
으로 프록싱 시켰는데 다음과 같은 오류를 반환 받았다.
404. That’s an error.
The requested URL / was not found on this server. That’s all we know.
/ 이라는 경로에 접근하는데, not found라는 에러를 반환 받았다.
어떤 사람으로부터 Host Header가 존재하지 않아, Google 측의 LB에서 인식하는데에 문제가 있을 것이라는 의견을 받았다. 따라서 다음과 같은 코드를 추가하였지만, 같은 문제가 반복 되었다.
r.Header.Set("Host", ProxyUrl.Hostname())
전제는 다음과 같다.
var r *http.Request
var ProxyUrl *url.URL
해결 방법
다음과 같은 코드를 추가하여 해결하였다.
r.Host = ProxyUrl.Hostname
원인
다음은 http.HandleFunc
에 삽입 되는 Handler Function의 코드이다.
기존에는 26번째 줄을 삽입하지 않고 실행했더니 문제 상황이 계속 발생하였다.
하지만, 디버거를 통해 헤더가 제대로 삽입되었는 지의 여부를 확인하는 과정에서 다음 사실을 확인 할 수 있었다.
r
의 요소 중 Host
라는 Variable이 따로 존재한다.
따라서 다음을 변경 함으로써, 대상 서버에게 Host를 제대로 알려 줄 수 있는 것이다.
왜 문제가 발생하였는가?
ServeHTTP()
의 인수가 되는 *http.Request
은 클라이언트가 역방향 프록시 서버에 보내는 HTTP 요청 정보를 담고 있다. 하지만, 역방향 프록시 서버가 타겟으로 하는 서버에게 HTTP 요청 정보를 보낼때 ServeHTTP()
의 인수가 되는 *http.Request
를 2차 요청시 그대로 사용한다는 점을 간과하였다.