웹 프락시 서버는 클라이언트의 입장에서 트랜잭션을 수행하는 중개인이다.
웹 프락시 서버는 웹 서버이기도하고 웹 클라이언트이기도 함
개인 프락시와 공유 프락시
개인 프락시
하나의 클라이언트만을 위한 프락시
공유 프락시
여러 클라이언트가 함께 사용하는 프락시로 사용자가 많을 수록 유리하다. → 여러 사용자들의 공통된 요청에서 이득을 취할 수 있기 때문!
프락시 대 게이트웨이
프락시: 같은 프로토콜을 사용하는 둘 이상의 애플리케이션 연결
브라우저 <-HTTP-> 웹 프락시 <-HTTP-> 웹 서버
게이트웨이: 서로 다른 프로토콜을 사용하는 둘 이상을 연결
브라우저 <-HTTP-> 웹/이메일 게이트웨이 <-POP-> 웹 서버
그러나 프락시와 게이트웨이의 실질적인 차이점은 모호한데, 프락시가 때때로 약간의 프로토콜 변환을 하기도 하며, 상용 프락시 서버는 SSL 보안 프로토콜, SOCKS 방화벽, FTP 접근, 웹 기반의 어플리케이션 지원을 위해 게이트웨이 기능을 구현하기 때문이다.
위 3가지 뿐만아니라 아래와 같은 기능들을 제공하기도 함
프락시가 어디에 있고 언제 네트워크 아키텍처상에 배치되는지 이야기해보자.
프락시 배치 서버
어떻게 사용할지에 따라 프락시를 어디에든 배치할 수 있다.
프락시 계층
프락시들은 프락시 계층과 같은 연쇄를 구성할 수 잇는데, 프락시 서버들을 부모와 자식의 관계를 맺는다.
서버쪽에 가까운 쪽을 인바운드 프락시라고 하여 부모라고 하며, 클라이언트에 가까운 쪽은 아웃바운드 프락시라고 하여 자식이라고 부른다.
어떻게 프락시가 트래픽을 처리하는가
클라이언트 트래픽이 프락시로 가도록 만드는 방법 4가지
브라우저가 프락시를 설정하는 여러 가지 방법
function FindProxyForURL(url, host) {
if (url.substring(0,5) === 'http:') {
// 지정한 프록시를 사용해야함을 의미하는 PROXY host:port
return "PROXY http-proxy.mydomain.com:8080";
} else if (url.substring(0,4) === "ftp:" {
return "PROXY ftp-proxy.mydomain.com:8080";
} else {
// 프락시 없이 연결이 직접적으로 이루어져야함을 의미하는 DIRECT
return "DIRECT";
}
}
// 그외 SOCKS host:port -> 지정한 SOCKS 서버를 사용
웹 프락시 자동발견 프로토콜
을 제공한다.- PAC URI를 찾기 위해 WPAD를 사용
- 주어진 URI에서 PAC 파일을 가져온다.
- 프락시 서버를 알아내기 위해 PAC파일을 실행한다.
- 알아낸 프락시 서버를 이용해서 요청을 처리한다.
프락시 서버 요청의 미묘하고도 오해하기 쉬운 측면들에 대해 설명한다.
프락시 URI는 서버 URI와 다르다
클라이언트가 웹 서버로 요청을 보낼 때, 스킴과 호스트가 없는 부분 URI만을 보내지만, 프락시로 보낼 때는 완전한 URI를 보낸다.
가상 호스팅에서 일어나는 같은 문제
가상으로 호스팅 되는 웹 서버는 여러 웹사이트가 같은 물리적 웹 사이트를 공유한다. 이 부분이 프락시의 ‘스킴/호스트/포트번호 누락'과 같은 문제라고 볼 수 있는데 각각 다른 방법으로 해결되었다.
인터셉트 프락시는 부분 URI를 받는다
인터셉트 프락시나 대리 프락시와 같이 클라이언트가 자신이 프락시와 대화하고 있는 지 모르는 경우가 있다.
프락시는 프락시 요청과 서버 요청을 모두 다룰 수 있다
다목적 프락시는 요청 메시지의 완전한 URI와 부분 URI를 모두 지원해야한다.
그 규칙은 다음과 같다.
전송 중 URI 변경
URI의 변경은 다운스트림 서버와 상호 운용성에 문제를 일으킬 수 있기 때문에 신경을 써야한다.
일반적으로 프락시 서버는 가능한 한 관대하도록 애써야하며 URI의 변경을 최소한으로 하고, 유일한 예외는 빈 경로를 ‘/’로 교체하는 경우이다.
URI 클라이언트 자동확장과 호스트 명 분석(Hostname Resolution)
호스트가 발견되지 않는 경우 브라우저들은 자동화된 호스트 명의 ‘확장'을 제공하고자 한다.
ex)
www
와 같은 접두사 및 com
접미사를 붙인다.프락시 없는 URI 분석(URI Resolution)
프락시가 존재하지 않는 경우 부분 호스트명을 자동으로 확장한다.
명시적인 프락시를 사용할 때의 URI 분석
명시적인 프락시 사용시, 편리한 확장을 사용할 수 없고 부분 호스트 명을 자동확장하지 않는다. → 이러한 이유로 몇몇 프락시는 이러한 기능들을 흉내내려고 시도한다.
인터셉트 프락시를 이용한 URI 분석
프락시 없는 URI 분석과 크게 다르지 않지만, 서버로의 커넥션이 만들어졌을 때 아래와 같은 차이가 발생한다.
→ 브라우저에서 제공하는 것과 동등한 수준의 장애 허용을 제공하기 위해 프락시는 호스트 헤더에 들어 있는 호스트 명을 다시 분석하든 아니면 IP 주소에 대한 역방향 DNS 룩업을 해서든 다른 IP 주소를 시도한다.(명시적인 프락시와 인터셉트 프락시를 이용하는 경우 모두 죽은 서버의 DNS 분석에 대한 장애 허용을 지원하는 것이 프락시에 달려있기 때문에 중요하다!)
많은 회사들이 보안과 비용 절감을 위해 인터넷 접속 시 캐시 프락시 서버를 사용한다.
Via 헤더
이 헤더를 통해 몇 개의 프락시를 지나갔음을 알 수 있다. 또한 메시지의 전달을 추적하고 메시지의 루프를 진단하며 요청을 보내 그에 대한 응답을 돌려주는 과정에 관여하는 모든 메시지 발송자들의 프로토콜을 다루는 능력을 알아보기 위해 사용된다.
Via 문법
Via 헤더 필드는 쉼표로 구분된 경유지(waypoint)의 목록이다.
Via waypoint 4개 구성요소
Via 요청과 응답 경로
요청 메시지 응답 메시지 모두 프락시를 지나는 경우 Via 헤더를 가지며 둘이 언제나 반대가 된다.
Via와 게이트 웨이
몇몇 프락시는 비 HTTP 프로토콜을 사용할 수 있는 게이트 웨이 기능을 제공하고, Via 헤더는 프로토콜 변환을 기록하여 어떤 변환이 있었는지 알아챌 수 있다.
Server 헤더와 Via 헤더
Server 응답 헤더 필드는 원 서버에 의해 사용되는 소프트웨어를 알려준다.
Via가 개인정보 보호와 보안에 미치는 영향
정확한 호스트 명이 들어가기를 원하지 않는 몇 가지 경우가 있는 경우, 적당한 가명으로 교체해야 한다.
TRACE 메서드
요청 메시지를 프락시의 연쇄를 따라가면서 어떤 프락시를 지나가고 어떻게 각 프락시가 요청 메시지를 수정하는지 관찰/추적할 수 있도록 하여 프락시 흐름을 디버깅하는데 매우 유용하다.
Trace 응답의 Content-Type은 message/http 이다.
Max-Forwards
요청의 프락시 홉(hop) 개수를 제한하기 위해 사용할 수 있다.
프락시는 접근 제어 장치로서 제공될 수 있다. 이를 통해 클라이언트가 프락시 접근 시, 이 콘텐츠에 대한 접근 자격을 물어보고 클라이언트는 응답 받은것을 통해 Proxy-Authorization
헤더 필드에 담아서 요청을 다시 보낸다. 이후 자격이 유효하면 이 요청을 통과시킨다.
지원하지 않는 헤더와 메서드 다루기
프락시는 이해할 수 없는 헤더 필드는 반드시 그대로 전달해야 한다.
OPTIONS: 어떤 기능을 지원하는지 알아보기
특정 리소스가 어떤 기능을 지원하는지 클라이언트가 알아볼 수 있게 해준다. 성공하면 Allow 헤더를 통해 어떤 메서드가 지원되는지 알려준다.
Allow 헤더
이 필드는 요청 URI에 의해 식별되는 자원에 대해 지원되는 메서드들이나 서버가 지원하는 모든 메서드를 열거한다.
Allow: GET, HEAD, PUT
Allow 헤더는 리소스가 지원했으면 하는 메서드를 추천하기 위해 요청 헤더로 사용될 수 있으며, 프락시가 지정된 모든 메서드를 이해할 수 없다고 해도 이 필드를 수정할 수 없다.(클라이언트는 원 서버와 대화하는 다른 경로를 갖고 있을 수도 있기 때문)