프록시가 무슨 역할을 하는 것인지는 알았는데, 클라이언트가 서버로 보낸 요청을 어떻게 프록시가 받아 중개할 수 있는걸까?🤔
HTTP 트래픽이 프락시로 향하는 길을 찾아내는 방법❓
클라이언트가 수동 혹은 자동으로 프락시를 사용할 것을 설정해주는 방법이다.
크롬 등의 브라우저에 프락시를 설정하는 것이 이 방법이다.
클라이언트는 프록시의 존재와 위치를 알고 있으므로 모든 요청을 프락시로 가게하는 것이 가능하다.
클라이언트가 프록시의 존재를 알지못하는 경우는?
HTTP트래픽을 감시하다가 요청을 가로채어 트래픽을 프락시로 보낼수 있다.
스위칭 장치와 라우팅 장치를 필요로 하며 이렇게 동작하는 프록시를 인터셉트 프록시라 한다.
리버스 프록시의 경우 웹서버의 ip와 port를 자신이 직접 사용한다.
클라이언트가 웹서버인줄 알고 보냈던 모든 요청은 사실 프락시의 주소로 보낸것이다.
웹서버는 클라이언트의 요청에 대한 응답을 리다이렉션(HttpStatus 305) 명령으로 돌려준다.
클라이언트는 해당 응답을 보고 프락시와의 커넥션을 맺게 된다.
맨 처음 방법에서 클라이언트는 프록시를 수동으로 설정할수도 있고, pac 파일을 정의해 상황에 따라 동적으로 프락시를 설정해줄수도 있다. 나머지 3개의 경우에 대한 자세한 내용은 뒤에 글에 설명하겠다.
클라이언트는 서버로 요청을 보낼때 불필요한 정보 발송을 피하기 위해 부분 url을 보내는 것을 확인할 수 있다.

정확한 url은 http://43.200.187.56/test 인데 요청헤더를 보면 /test 로 요청을 보낸걸 확인할 수 있다.
클라이언트가 서버로 요청을 보낼때는 부분url을 보내지만, 클라이언트가 프록시로 요청을 보낼때는 완전한url을 보낸다.
http가 정의된게 옛날이기 때문에 그때는 단일서버로 통신을 해서 스킴,호스트,포트번호를 굳이 보내줄 필요가 없었다. 하지만 프락시가 등장하면서 프락시는 목적지의 서버와 커넥션을 맺어야하기 때문에 부분url만으로는 서버를 찾을 수 없는 문제가 생겼다.
프락시가 명시적으로 설정이 되어있다면(클라이언트가 프록시를 설정했다면)
❗프록시의 존재를 알기 때문에 완전한 url을 보낼수 있다.
클라이언트가 프록시의 존재를 알수없는 경우라면
클라이언트는 웹서버와 직접 통신한다고 착각해 부분url만 보내게 된다.
❗이때 host헤더가 있다면 host를 보고 목적지 서버의 주소를 알 수 있다.
host헤더도 없다면
❗리버스 프록시라면 프록시에 실제 서버의 주소가 저장되어있을수 있다.
❗인터셉트 프록시라면 이전에 가로챘던 트래픽이 서버의 주소를 저장해뒀을수 있다.
결국 서버의 주소를 못찾았다면
❗클라이언트에게 에러 메세지를 반환하게 된다.
요청헤더를 다시보면
GET 뒤의 /test가 부분 url로 host와 합쳐서 http://43.200.187.56/test 의 완전한 url을 얻을 수 있다.
프록시를 통과하는 메세지를 추적하기 위해 via헤더가 있다.
요청이 서버까지 가는데 거쳐가는 프록시나 게이트웨이 등의 정보를 나열한다.
via: 1.0 proxy1.com 1.1 proxy2.com
보안상 호스트의 이름을 명시할 수 없다면 가명을 이용하거나 일련의 경유지들을 축약하여 나타낼 수 있다.
참고
[HTTP 완벽 가이드] 저. 데이빗 고올리, 브라이언 토티