본 내용은 "HTTP 완벽 가이드" 내용을 참고하여 기록한 정리본입니다.
프록시 - 웹 중개자
프록시란?
- 트랜잭션을 수행하는 중개자이다.
- 프록시 서버에 추가적인 서비스를 삽입할 수 있다.
- 웹 서버이자 웹 클라이언트의 역할을 동시에 수행한다.
- 따라서, HTTP 클라이언트와 HTTP 서버 양쪽의 규칙을 모두 준수해야 한다.
프록시의 분류
개인 프록시와 공유 프록시
- 공용 프록시
- 여러 클라이언트가 함께 사용하는 프록시이다.
- 캐시 프록시로 동작할 수 있다.
- 개인 프록시
- 단일 클라이언트를 위해 사용되는 프록시이다.
- SSH 터널링을 지원할 때 사용하거나,
- 섀도삭스와 같은 프로그램에서 사용한다.
프록시 vs 게이트웨이
- 프록시
- 동일한 프로토콜을 사용하는 두 개 이상의 애플리케이션을 연결한다.
- 단순 중개자의 역할을 수행한다.
- 게이트웨이
- 서로 다른 프로토콜을 사용하는 두 개 이상의 애플리케이션을 연결한다.
- 프로토콜 변환기의 역할을 수행한다.
- 실제로 두 개념 간의 차이는 모호하다.
- 프록시도 약간의 프로토콜 변환을 수행한다.
- 프록시가 SSL 보안 프로토콜을 지원하기도 한다.
- 프록시가 SOCKS 방화벽으로 동작한다.
- 프록시가 FTP 접근을 가능하게 한다.
- 프록시도 약간의 프로토콜 변환을 수행한다.
프록시를 쓰는 이유
- 용례를 작성해둔 것이니, 가볍게 읽어보면 된다.
어린이 필터
- 유해 콘텐츠 차단기로 동작한다.
문서 접근 제어자
- 중앙화된 접근 제어 기능을 제공한다.
- 감사 추적을 수행한다.
- 예시
- 클라이언트 1에게는 제약 없이 서버의 뉴스 페이지 접근을 허용한다.
- 클라이언트 2에게는 제약 없이 인터넷 접근을 허용한다.
- 클라이언트 3이 서버 B에 접근하기 전에는 암호를 요구한다.
보안 방화벽
- 방화벽 기능을 수행하는 프록시이다.
- 바이러스 검사를 진행한다.
웹 캐시
- 웹 캐시 용도로 프록시를 사용한다.
대리 프록시
- 리버스 프록시로도 잘 알려져 있다.
- 웹 서버인 것처럼 위장한다.
- 원 서버에 데이터를 요청한다.
- 바로 아래의 콘텐츠 라우팅 기능과 결합된다.
- 주문형 복제 콘텐츠의 분산 네트워크를 구성하기 위해 사용된다.
콘텐츠 라우터
- 프록시가 트래픽 조건과 콘텐츠 종류에 따라 특정 웹 서버로 유도한다.
- 유료 구독자의 요청인 경우, 구독자에게 높은 성능을 제공하기 위해 복제 캐시로 요청을 전달한다.
- 맞춤형 콘텐츠 라우팅 기능을 수행한다.
트랜스코더
- 트랜스코딩이란?
- 데이터의 표현 방식을 자유롭게 변환하는 것
- 프록시를 이용해 콘텐츠를 클라이언트에게 전달하기 전에 본문의 포맷을 수정하기도 한다.
- 국제화(i18n) 시에도 사용된다.
익명화 프록시 (Anonymizer)
- 개인정보 보호와 익명성 보장을 위해 사용된다.
- User-Agent 헤더에서 사용자의 컴퓨터와 OS 정보를 제거한다.
- From 헤더에서 사용자의 이메일 주소 정보를 제거한다.
- Referer 헤더를 제거하여 어느 사이트를 거쳐 방문했는지 파악하기 어렵게 한다.
- Cookie 헤더를 제거하여 프로필과 신원 정보를 삭제한다.
프록시는 어디에 있는가?
프록시 서버 배치
출구 프록시
- 로컬 네트워크의 출구에 배치된다.
- 회사 외부의 악의적인 해커를 차단한다.
- 부적절한 콘텐츠를 필터링한다.
입구 프록시
- ISP 접근 지점에서 고객의 모든 요청을 처리한다.
- 캐시 프록시로 동작한다.
대리 프록시(리버스 프록시)
- 웹 서버 앞에서 필요할 때만 웹 서버에 자원 요청을 수행한다.
- 웹 서버에 보안 기능을 추가한다.
- 모든 요청을 대신 처리하는 프록시 서버이다.
네트워크 교환 프록시
- 인터넷 교차로의 혼잡을 완화한다.
- 트래픽 흐름을 감시한다.
- 현대 환경에서는 다음과 같은 특징을 가진다.
- 요즘에는 많이 사용되지 않는다.
- 예전만큼 대역폭 비용이 높지 않다.
- CDN으로 대체가 가능하다.
- HTTPS로 충분히 대응할 수 있다.
프록시 계층
- 부모 프록시
- 인바운드 프록시라고도 불린다.
- 서버에 가까운 방향의 프록시이다.
- 자식 프록시
- 아웃바운드 프록시로 알려진다.
- 클라이언트에 가까운 방향의 프록시이다.
프록시 계층 콘텐츠 라우팅
- 프록시 계층은 정적이다.
- 하지만, 반드시 정적으로 호출되어야 할 필요는 없다.
- 기존 계층을 건너뛰고, 부모 프록시가 아닌 즉시 원 서버로 라우팅할 수 있다.
- 이를 “동적 콘텐츠 라우팅” 이라고 한다.
- 동적 콘텐츠 라우팅의 예
- 로드 밸런싱을 수행한다.
- 지리적 인접성을 근거로 라우팅한다.
- 프로토콜 또는 타입에 따라 라우팅한다.
- URI 기반 라우팅을 수행한다.
- 특정 프로토콜 또는 타입으로 처리한다.
- 유료 서비스 가입자를 위한 라우팅을 실시한다.
프록시의 트래픽 처리 방법
클라이언트 수정
- 웹 클라이언트의 수동 또는 자동 프록시 설정을 사용한다.
- 하단의 "클라이언트 프록시 설정" 내용을 참고하자.
네트워크 수정
- 웹 트래픽을 스위칭 장비나 라우팅 장비 등 인프라 장비를 통해 클라이언트가 인지하지 못하는 방식으로 프록시로 라우팅한다.
DNS Name 수정
- 리버스 프록시(대리 프록시)가 웹 서버의 이름과 IP 주소를 대신 사용된다.
- 모든 요청은 서버 대신 리버스 프록시로 도착된다.
- 실제 서버의 IP 주소와 이름은 변경되며, 리버스 프록시가 해당 원본 IP 주소와 이름을 사용한다.
웹 서버 수정
- 웹 서버가 직접 프록시로 리다이렉트하는 방식이다.
- 305 Use Proxy 상태 코드가 사용된다.
- 클라이언트가 명시적으로 프록시 설정을 관리할 수 있도록 하는 방식이 선호되어 해당 기능은 사양되었다.
클라이언트 프록시 설정
수동 설정
- 프록시 사용을 명시적으로 설정한다.
- 브라우저 설정을 통해 구성할 수 있다.
브라우저 기본 설정
- 브라우저 벤더가 기본 프록시를 지정한다.
- 수동 설정이 없는 경우, 브라우저가 기본적으로 특정 프록시를 사용한다.
프록시 자동 설정(PAC)
- 수동 프록시 설정은 단순하지만 유연성이 떨어진다.
- 해당 한계를 극복하기 위해 나온 기능
- 자바스크립트로 작성된 PAC 파일의 URI를 제공한다.
- 자바스크립트 코드를 통해 적절한 프록시를 결정한다.
- 20장을 참고하자.
WPAD 프록시 발견
- Web Proxy AutoDiscovery Protocol을 사용한다.
- 웹 프록시 자동발견 프로토콜이다.
- "설정 서버"를 자동으로 찾는 프로토콜이다.
- 설정 서버는 자동 설정 파일을 다운로드할 수 있는 서버이다.
클라이언트의 WPAD를 이용한 프록시 탐색 과정
- PAC URI를 찾기 위해 WPAD를 사용한다.
- 지정된 URI에서 PAC 파일을 가져온다.
- PAC 파일을 실행한다.
- 확인된 프록시 서버를 통해 요청을 처리한다.
정식 WPAD 명세
- DHCP
- 동적 호스트 발견 규약이다.
- SLP
- 서비스 위치 규약이다.
- DNS의 잘 알려진 호스트 명을 사용한다.
- DNS SRV 레코드를 활용한다.
- DNS TXT 레코드 내의 서비스 URI를 사용한다.
- 20장을 참고하자.
프록시의 주요 특징
서버 요청과 프록시 요청의 URI 차이점
프록시 URI는 서버 URI와 다르다
- 클라이언트의 프록시 사용 여부에 따라 전송되는 요청의 URI가 달라진다.
- 클라이언트에서 서버로 전송하는 URI는 부분 URI이다.
- 클라이언트에서 프록시로 전송하는 URI는 완전한 URI이다.
- 그 이유는 다음과 같다.
- 클라이언트는 서버에 요청할 때 불필요한 정보를 생략하기 위해 스킴과 호스트가 없는 부분 URI만 사용한다.
- Host 헤더로 필요한 정보를 모두 전달할 수 있다.
- 기본 정보는 이미 정해져 있다.
- 클라이언트는 프록시에 요청을 보낼 때
- 프록시가 서버와 커넥션을 맺어야 하기 때문에
- 프록시와 원 서버가 연결될 수 있도록 완전한 URI를 전송한다.
- 클라이언트는 서버에 요청할 때 불필요한 정보를 생략하기 위해 스킴과 호스트가 없는 부분 URI만 사용한다.
이 문제는 가상 호스팅과 유사하다
- 프록시의 '스킴/호스트/포트번호 누락' 문제는 가상 호스팅된 웹 서버가 직면하는 문제와 동일하다.
- 접근하려는 웹 서버의 호스트명을 정확히 확인해야 한다.
- 5장의 docroot와 18장의 가상 호스팅을 참고하자.
인터셉트 프록시와 리버스 프록시는 서버 호스트 정보를 알아내기 어렵게 만든다
- 앞서 설명한 바와 같이, 프록시 URI는 원 서버 URI와 다르다.
- 그러나 리버스 프록시는 원 서버와 유사하게 부분 URI를 수신한다.
- 인터셉트 프록시 또한 원 서버와 유사하게 부분 URI를 수신한다.
- 이 내용이, 해당 챕터의 내용을 어렵게 만드는 요인이다.
프록시 요청과 서버 요청의 구분
다목적 프록시는 프록시 요청과 서버 요청을 모두 지원해야 한다
- 프록시는 완전한 URI와 부분 URI 모두를 지원할 수 있어야 한다.
정확한 프록시의 URI 사용 규칙
- 완전한 URI가 제공되면 프록시는 이를 그대로 사용해야 한다.
- 부분 URI가 제공되고 Host 헤더가 존재하면, Host 헤더를 통해 원 서버의 이름과 포트 번호를 확인해야 한다.
- 부분 URI가 제공되었으나 Host 헤더가 없는 경우, 다음 규칙에 따라 원 서버를 식별해야 한다.
- 프록시가 리버스 프록시인 경우,
- 프록시 설정에 실제 서버의 주소와 포트 번호가 포함될 수 있다.
- 과거에 인터셉트 프록시가 가로챈 트래픽인 경우,
- 인터셉트 프록시가 원 IP 주소와 포트 번호를 전달했을 것이다.
- 해당 IP 주소와 포트 번호를 사용해야 한다.
- 모든 방법이 실패하면,
- 원 서버를 식별할 수 없으므로 에러 메시지를 반환해야 한다.
- 프록시가 리버스 프록시인 경우,
URI 수정에 대한 규칙
- 프록시는 임의로 URI를 변경해서는 안 된다.
- 다운스트림과의 상호 운용성에 치명적인 문제가 발생할 수 있다.
- 프록시 서버는 HTTP 프로토콜에 대해 가능한 관대한 태도를 유지해야 한다.
- 프로토콜 경찰처럼 깐깐하게 동작해서는 안 된다.
- 특히, URI 전달 시 절대경로를 수정하는 것은 금지된다.
- 포트 번호 추가도 금지된다.
- 잘못된 예약 글자 이스케이프도 금지된다.
- 단, 빈 경로는 '/'로 대체하는 것은 허용된다.
프록시는 브라우저의 smart URI 자동완성 및 호스트명 확장 기능에 영향을 미친다
브라우저의 smart URI 자동완성 및 호스트명 확장
- 브라우저는 검색엔진에 직접 연결하는 것을 제외하고,
- ctrl + Enter를 누르면 www. 접두사와 .com 접미사를 자동으로 추가한다.
- 해석할 수 없는 URI는 서드파티 사이트로 전달된다.
- 시스템의 DNS 설정에 따라 단순 호스트명만 입력해도 도메인 이름이 자동 완성된다.
- 예를 들어, "oreilly.com" 도메인 환경에서는
- 단순히 "host7"만 입력해도,
- DNS는 이를 완전한 호스트명으로 인식하지 않고 기본 도메인인 "oreilly.com"을 뒤에 추가하여
- "host7.oreilly.com"으로 변환한다.
- 이 기능은 DNS 접미사 검색(DNS Suffix Search)이라 한다.
- 해당 접미사는 DHCP 서버에서 받아오거나 임의로 설정할 수 있다.
- 일반적으로 ISP가 임의로 설정한다.
cf. 도메인 환경이란?
- 회사 내에서 컴퓨터가 중앙 서버에 의해 관리받을 때 활용된다.
- 해당 도메인에 속하면 DNS 접미사가 자동으로 해당 도메인으로 변경된다.
프록시 없는 URI 분석 (URI Resolution)
- 프록시 설정이 없는 경우, 클라이언트는 다양한 호스트명 가능성을 탐색한다.
- 이는 앞서 설명한 호스트명 자동 확장 기능을 사용하는 것을 의미한다.
명시적인 프록시 사용 시의 URI 분석
- 명시적으로 프록시 사용이 설정되면 부분 호스트명 자동 확장이 발생하지 않는다.
- 일부 프록시는 자동 확장을 시도하나, 위에서 설명한 이유로 자동 확장은 허용되지 않는다.
인터셉트 프록시를 이용한 URI 분석
- 인터셉트 프록시는 실제 원 서버처럼 동작하여 URI 호스트명 자동 확장 기능을 사용한다.
- 이는 프록시가 장애 허용 측면에서 중요한 역할을 수행함을 의미한다.
- 인터셉트 프록시가 원 서버와 연결에 실패하면 직접 다른 IP 주소를 탐색하거나 잘못된 응답을 반환해야 한다.
메시지 추적 방법
메시지 추적이 필요한 이유
- 메시지 추적은 디버깅에 필요하다.
- IP 패킷의 흐름을 추적할 필요가 있다.
Via 헤더
Via 헤더란?
- 중간 노드를 순차적으로 기록하는 헤더이다.
- 관련 문법을 차례대로 이해해보자.
Via 문법
이렇게 봐서는 이해하기 어려울 것 같다. 각 요소를 하나씩 분석해보자.
- 프로토콜 이름
- 선택적으로 사용된다.
- 기본값은 HTTP이다.
- 프로토콜 버전
- 일반적으로 1.1 또는 1.0이다.
- 노드 이름
- 중개자의 호스트와 포트 번호를 나타낸다.
- 포트 번호가 없으면 현재 프로토콜의 기본 포트가 사용된다.
- 호스트명은 가명으로 대체할 수 있다.
- 노드 코멘트
- 주석처럼 사용된다.
- 괄호
()
를 통해 표현된다. - 벤더나 버전 정보, 장치에서 발생한 이벤트를 기록한다.
Via 요청과 응답 경로
- 요청과 응답 모두 Via 헤더를 포함한다.
- 응답의 Via 헤더는 보통 요청의 Via 헤더와 반대 방향으로 기록된다.
Via와 게이트웨이
- 게이트웨이는 프로토콜 변환을 수행할 가능성이 있다.
- Via 헤더는 프로토콜 변환 과정을 기록할 수 있다.
Server 헤더와 Via 헤더
- Server 헤더는 원 서버의 정보를 나타낸다.
- 프록시 소프트웨어 정보를 기록하려면 Via 헤더를 사용해야 한다.
Via가 개인정보 보호와 보안에 미치는 영향
- 프록시 서버가 네트워크 방화벽의 일부로 동작하는 경우,
- 프록시는 방화벽 뒤에 있는 호스트의 이름과 포트를 노출해서는 안 된다.
- 같은 도메인 내에서 프로토콜 값이 동일한 경우, 다음과 같이 가명으로 합칠 수 있다.
TRACE 메소드
특징
- TRACE 메소드는 프록시 흐름 디버깅을 위해 사용된다.
- 홉을 거칠 때마다 메시지 내용의 변화를 관찰한다.
- 모든 경로를 탐색한다.
Max-Forwards
- 모든 경로를 탐색하다 보니 무한 루프에 빠질 수 있다.
- 따라서 지나칠 수 있는 홉 수에 제한을 두어야 한다.
Trace 메소드가 사용되지 않는 이유
- TRACE 메소드는 보안 헤더가 노출될 위험이 있어 사용되지 않는다.
프록시 인증
- Proxy-Authenticate 헤더를 사용한다.
- 자격이 유효하면 요청을 통과시킨다.
- 자격이 유효하지 않으면 407 응답을 반환한다.
- 클라이언트가 407 응답을 수신하면, 필요한 자격을 수집해야 한다.
- 로컬 DB를 확인한다.
- 사용자에게 자격 정보를 요청한다.
프록시 상호운용성
지원하지 않는 헤더와 메소드 다루기 위한 방법
프록시
- 이해할 수 없는 헤더 필드는 반드시 그대로 전달해야 한다.
- 동일한 이름의 헤더 필드가 여러 개 존재할 경우, 그 순서를 반드시 유지해야 한다.
- 프록시가 특정 메소드에 익숙하지 않더라도, 해당 메시지를 다음 홉으로 전달하도록 시도해야 한다.
OPTIONS 메소드
OPTIONS * HTTP/1.1
은 서버 전체의 능력을 문의하는 방식이다.OPTIONS http://www.joes-hardware.com/index.html HTTP/1.1
은 특정 리소스에 대해 지원되는 기능을 문의하는 방식이다.
Allow 헤더
- 요청 시에는 새 리소스가 지원되었으면 하는 메소드를 권장한다.
- 응답 시에는 요청된 리소스에 대해 지원되는 메소드를 열거한다.
- 프록시는 여기서 지정된 메소드를 임의로 수정해서는 안 된다.
- 원 서버와 통신하는 다른 경로가 존재할 수 있다.
'CS Repo > HTTP 완벽 가이드' 카테고리의 다른 글
웹 캐시 (0) | 2025.04.09 |
---|---|
웹 서버 (0) | 2025.04.04 |
HTTP 커넥션 관리 최적화 기법 (0) | 2025.04.03 |
HTTP에서 바라본 TCP 커넥션 관리 방식 (0) | 2025.03.27 |
HTTP 메시지 (0) | 2025.03.25 |