Development/Golang

httputil.ReverseProxy 사용시 Host Header 적용 문제

ANTEGRAL 2022. 10. 24. 23:12
반응형

발단

필자는 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차 요청시 그대로 사용한다는 점을 간과하였다.

 

반응형