HTTP 프락시 서버는 웹 서버이기도 하고 웹 클라이언트이기도 합니다. 프락시는 HTTP 클라이언트의 요청을 받으며 동시에 프락시는 요청을 서버로 보내기도 합니다. 트랜잭션을 완료하는 것이 클라이언트라는 점은 변하지 않지만, 프락시 서버가 제공하는 좋은 서비스를 이용하게 됩니다.
프락시 서버는 하나의 클라리언트가 독점으로 사용할 수도 있고, 여러 클라이언트가 공유할 수도 있습니다. 하나의 클라이언트만을 위한 프락시를 개인 프락시라고 부릅니다. 여러 클라이언트가 함께 사용하는 프락시는 공용 프락시라 부릅니다.
엄밀하게 말하면, 프락시는 같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결하고, 게이트웨이는 서로 다른 프로토콜을 사용하는 둘 이상을 연결합니다. 게이트웨이는 클라이언트와 서버가 서로 다른 프로토콜을 말하더라도 서로 간의 트랜잭션을 완료할 수 있도록 해주는 프로토콜 변환기처럼 동작합니다. 하지만 실질적으로 프락시도 때때로 약간의 포로토콜 변환을 하기 때문에 프락시와 게이트웨이의 차이점은 모호합니다.
프락시 서버는 실용적이고 유용한 것이라면 무슨 일이든 합니다. 보안을 개선하고, 성능을 높여주며, 비용을 절약합니다. 그리고 프락시 서버는 모든 HTTP 트래픽을 들여다보고 건드릴 수 있기 때문에, 프락시는 부가적인 가치를 주는 여러 유용한 웹 서비스를 구현하기 위해 트래픽을 감시하고 수정할 수 있습니다.
로컬 네트워크와 더 큰 인터넷 사이를 오가는 트래픽을 제어하기 위해 프락시를 로컬 네트워크의 출구에 박아 넣을 수 있습니다. 프락시 서버는 조직 안에 들어오거나 나가는 응용 레벨 프로토콜의 흐름을 네트워크의 한 지점에서 통제합니다. 프락시는 웹 리소스에 대한 단일한 접근 제어 전략을 구현하고 감사 추적(Audit Trail)을 할 수 있으며, 종종 보안을 강화하기 위해 사용합니다.
클라이언트로부터의 모든 요청을 종합적으로 처리하기 위해 프락시는 ISP 접근 지점에 위치하기도 합니다. ISP는 사용자들의 다운로드 속도를 개선하고 인터넷 대역폭 비용을 줄이기 위해 캐시 프락시를 사용해 많이 찾는 문서들의 사본을 저장합니다.
대리 혹은 리버스 프락시로 불리는 이들은 네트워크의 가장 끝에 있는 웹 서버들의 바로 앞에 위치하여 웹 서버로 향하는 모든 요청을 처리하고 필요할 때만 웹 서버에게 지원을 요청할 수 있습니다. 또한 웹 서버에 보안 기능을 추가하거나 빠른 웹 서버 캐시를 느린 웹 서버의 앞에 놓음으로써 성능을 개선할 수도 있습니다. 대리 프락시는 일반적으로 웹 서버의 이름과 IP 주소로 스스로 가장하기 때문에, 모든 요청은 서버가 아닌 이 프락시로 가게 됩니다.
캐시를 이용해 인터넷 교차로의 혼잡을 완화하고 트래픽 흐름을 감시하기 위해 충분한 처리 능력을 갖춘 프락시가 네트워크 사이의 인터넷 피어링 교환 지점들에 놓일 수 있습니다.
프락시들은 프락시 계층이라고 불리는 연쇄를 구성할 수 있습니다. 다음번 인바운드 프락시(서버에 가까운 쪽)를 부모라고 부르고 다음번 아웃바운드 프락시(클라이언트에 가까운 쪽)는 자식이라고 부릅니다.
계층이 반드시 정적이어야 하는 것은 아닙니다. 프락시 서버는 여러 가지 판단 근거에 의해 메시지를 다양하고 유동적인 프락시 서버와 원 서버들의 집합에게 보낼 수 있습니다. 동적 부모 선택의 몇 가지 예를 들면 다음과 같습니다.
클라이언트 트래픽이 프락시로 가도록 만드는 방법에는 다음 네 가지가 있습니다.
많은 웹 클라이언트들은 수동 혹은 자동 프락시 설정을 지원합니다.
클라이언트는 알지도 못하고 간섭도 할 수 없는 상태에서, 네트워크 인프라를 가로채서 웹 트리픽을 프락시로 가도록 조정합니다. 일반적으로 HTTP 트래픽을 지켜보고 가로채어 클라이언트 모르게 트래픽을 프락시로 보내는 스위칭 장치와 라우팅 장치를 필요로 합니다. 이것을 인터셉트 프락시라고 부릅니다.
웹 서버 앞에 위치하는 프락시 서버인 대리 프락시는 웹 서버의 이름과 IP 주소를 자신이 직접 사용합니다. 그래서 모든 요청은 서버 대신 대리 프락시로 갑니다.
HTTP 리다이렉션 명령을 클라이언트에게 돌려줌으로서 클라이언트의 요청을 프락시로 리다이렉트 하도록 설정할 수 있습니다.
원래의 HTTP 설계에서, 클라이언트는 단일한 서버와 직접 대화했습니다. 단일 서버는 자신의 호스트 명과 포트번호를 알고 있으므로, 클라이언트는 불필요한 정보 발송을 피하기 위해 스킴과 호스트가 없는 부분 URI만 보냈습니다.
프락시가 부상하면서, 부분 URI는 문제가 되었습니다. 프락시는 목적지 서버와 커넥션을 맺어야 하기 때문에, 그 서버의 이름을 알 필요가 있었습니다. 그리고 프락시 기반 게이트웨이는 FTP 리소스나 혹은 그 외의 스킴과 연결하기 위해 URI의 스킴을 알 필요가 있었습니다. 그래서 우리는 서버로는 부분 URI를, 그리고 프락시로는 완전한 URI를 보낼 필요가 있습니다.
GET /index.html HTTP/1.0 (프락시 미사용)
GET http://www.marys-antiques.com/index.html HTTP/1.0 (프락시 사용)
이것으로 문제의 일부분은 해결되지만, 여전히 남은 문제가 있습니다. 몇몇 프락시는 클라이언트에게 보이지 않을 수 있습니다. 자신의 웹 서버와 대화하고 있다고 생각하고 완전한 URI를 보내지 않을 것입니다. 인터셉트 프락시는 클라이언트에서 서버로 가는 트래픽을 가로채기 때문에, 웹 서버로 보내는 부분 URI를 얻게 될 것입니다. 이를 위한 완전 URI와 부분 URI를 사용하는 규칙은 다음과 같습니다.
많은 브라우저들은 자동화된 호스트 명의 확장을 제공하고자 다음과 같이 몇 가지 시도를 합니다.
만약 프락시를 사용한다면, 브라우저는 이와 같이 편리한 확장들 중 어느 것도 더 이상 수행할 수 없습니다. 인터셉트 프락시와 명시적인 프락시는 모두 죽은 서버의 DNS 분석에 대한 장애 허용을 지원해야 한다는 것은 중요한데, 왜냐하면 브라우저가 프락시를 사용할 경우 장애 허용은 프락시에 달려있기 때문입니다.
프락시가 점점 더 흔해지면서, 서로 다른 스위치와 라우터를 넘나드는 IP 패킷의 흐름을 추적하는 것 못지않게 프락시를 넘나드는 메시지의 흐름을 추적하고 문제점을 찾아내는 것도 필요한 일이 되었습니다.
Via 헤더 필드는 메시지가 지나는 각 중간 노드(프락시나 게이트웨이)의 정보를 나열합니다. 메시지가 또 다른 노드를 지날 때마다, 중간 노드는 Via 목록의 끝에 반드시 추가되어야 합니다. 프락시는 요청을 보내기 전에 자신을 가리키는 유일한(Unique) 문자열을 Via 헤더에 삽입해야 하며 네트워크 라우팅 루프가 있는지 탐색하기 위해 이 문자열이 들어온 요청에 있는지 검사해야 합니다.
Via = ( waypoint) [", " ( waypoint )...]
waypoint = ( received-protocol received-by [ comment ] )
received-protocol = [protocol-name "/"] protocol-version
received-by = ( host [ ":" prot ] ) | pseudonym
Via 문자열 안에 정확한 호스트 명이 들어가기를 원하지 않는 경우가 있습니다. 보통 명시적으로 이 동작이 켜져 있지 않은 이상, 프락시 서버가 네트워크 방화벽의 일부인 경우 프락시는 방화벽 뒤에 숨어있는 호스트의 이름과 포트를 전달해서는 안됩니다. 반화벽 뒤의 네트워크 아키텍처에 대한 정보가 악의적인 집단에 의해 이용될 수 있기 때문입니다. 만약 Via 노드 이름 전달이 가능하지 않다면, 보안 경계석의 일부분인 프락시는 호스트 명을 그 호스트에 대한 적당한 가명으로 교체해야 합니다.
HTTP/1.1의 TRACE 메서드는 요청 메시지를 프락시의 연쇄를 따라가면서 어떤 프락시를 지나가고 어떻게 각 프락시가 요청 메시지를 수정하는지 관찰/추적할 수 있도록 해줍니다. TRACE 요청이 목적지 서버에 도착했을 때, 서버는 전체 요청 메시지를 HTTP 응답 메시지의 본문에 포함시켜 송신자에게 그대로 돌려보냅니다. TRACE 응답이 도착했을 때, 클라이언트는 서버가 받은 메시지와 그 메시지가 지나간 프락시들의 목록(Via 헤더 안에 있습니다)을 검사할 수 있습니다.
일반적으로 TRACE 메시지는 중간에 프락시들이 몇 개나 있든 신경 쓰지 않고 목적지 서버로의 모든 경로를 이행합니다. TRACE와 OPTIONS 요청의 프락시 홉(Hop) 개수를 제한하기 위해 Max-Forwards
헤더를 사용할 수 있는데, 이는 전달되는 메시지가 무한 루프에 빠지지 않는지 프락시 연쇄를 테스트하거나 연쇄 중간의 특정 프락시 서버들의 효과를 체크할 때 유용합니다.