HTTP는 내용 협상(content-negotiation) 방법을 제공한다. 이 방법을 이용해서 하나의 URL이 여러 가지 리소스 중 적합한 것에 대응되도록 할 수 있다. (예: 같은 웹페이지의 프랑스어와 영어 버전), 서로 다른 버전을 배리언트(variant)라고 한다.
#1. 내용 협상 기법
기법 | 어떻게 동작하는가 | 장점 | 단점 |
클라이언트 주도 | 클라이언트가 요청을 보내면 서버는 클라이언트에게 선택지를 주고 클라이언트는 선택한다. | 서버 입장에서 가장 구현하기 쉽다. 클라이언트는 최선의 선택을 할 수 있다. | 대기시간이 증가한다. 올바른 콘텐츠를 얻으려면 최소 두 번의 요청이 필요하다. |
서버 주도 | 서버가 클라이언트의 요청 헤더를 검증해서 어떤 버전을 제공할지 결정한다. | 클라이언트 주도 협상보다 빠르다. 서버가 다운스트림 장치에게 요청이 어떻게 평가되는지 말해줄 수 있도록 하기 위해 Vary헤더를 제공한다. | 만약 헤더에 맞는 것이 없으면 서버는 추측을 해야만 한다. |
투명 | 투명한 중간 장치(주로 프락시 캐시)가 서버를 대신하여 협상을 한다. | 웹 서버가 협상을 할 필요가 없다. 클라이언트 주도 협상보다 빠르다. | 투명 협상을 어떻게 하는지에 대한 정형화된 명세가 없다. |
#2. 클라이언트 주도 협상
- 서버가 클라이언트에 요청을 받았을 때 가능한 페이지 목록을 돌려주어 클라이언트에게 선택하게 한다.
- 서버 입장에서 가장 구현하기 쉽고 최선의 사본이 선택될 것이다.
- 단점은 각 페이지에 두 번의 요청이 필요하다.
#3. 서버 주도 협상
서버 주도 협상은 서버가 어떤 페이지를 돌려줄 것인지 결정하는 것이다. 이렇게 하려면 클라이언트는 반드시 자신이 무엇을 선호하는지에 대한 충분한 정보를 서버에게 주어야 한다.
서버는 이 정보를 클라이언트의 요청 헤더에서 얻는다.
- 서버는 내용 협상 헤더들을 살펴본다. 클라이언트의 Accept 관련 헤더를 보고 알맞은 응답 헤더를 준비한다.
- 내용 협상 헤더 외 다른 헤더들을 본다. 서버는 클라이언트의 User-Agent 헤더에 기반하여 응답을 줄 수도 있다.
내용 협상 헤더
Accept 관련 헤더들
헤더 | 설명 |
Accept | 서버가 어떤 미디어 타입으로 보내도 되는지 알려준다. |
Accept-Language | 서버가 어떤 언어로 보내도 되는지 알려준다. |
Accept-Charset | 서버가 어떤 차셋으로 보내도 되는지 알려준다. |
Accept-Encoding | 서버가 어떤 인코딩으로 보내도 되는지 알려준다. |
Accept 관련 헤더들과 짝을 이루는 엔터티 헤더들
Accept 관련 헤더들 | 엔터티 헤더 |
Accept | Content-Type |
Accept-Language | Content-Language |
Accept-Charset | Content-Type |
Accept-Encoding | Content-Encoding |
서버는 클라이언트의 Accept 관련 헤더들을 적절한 엔터티 헤더들과 짝을 지어준다.
내용 협상 헤더의 품질값
HTTP 프로토콜은 클라이언트가 각 선호의 카테고리마다 여러 선택 가능한 항목을 선호도와 함께 나열할 수 있도록 품질 값을 정의하였다.
Accept-Language: en;q=0.5, fr;q=0.0, nl;q=1.0, tr;q=0.0 |
q 값은 0.0부터 1.0까지의 값을 가질 수 있고 숫자가 높을수록 높은 선호도를 갖는다.
그 외 헤더들에 의해 결정
서버는 User-Agent와 같은 클라이언트의 다른 요청 헤더들을 이용해 알맞은 요청을 만들어내려고 시도할 수 있다. 예를 들어 서버가 오래된 버전의 웹브라우저는 자바스크립트를 지원하지 않는다는 것을 알고 있다면 자바스크립트를 포함하지 않은 페이지를 돌려줄 수도 있다.
캐시는 반드시 캐시 된 문서의 올바른 '최선의' 버전을 제공해주려 해야 하기 때문에 HTTP 프로토콜은 서버가 응답에 넣어 보낼 수 있는 Vary 헤더를 정의한다. Vary헤더는 캐시에게 서버가 내줄 응답의 최선의 버전을 결정하기 위해 어떤 요청 헤더를 참고하고 있는지 말해준다.
아파치의 내용 협상
아파치 웹 서버가 내용 협상을 지원하는 방법은 다음과 같다.
- 웹 사이트 디렉터리에서 배리언트(variant)를 갖는 웹 사이트의 각 URI를 위한 type-map파일을 만든다. 그 type-map 파일은 모든 배리언트와 그들 각각에 대응하는 내용 협상 헤더들을 나열한다.
- 아파치가 그 디렉터리에 대해 자동으로 type-map 파일을 생성하도록 하는 MultiView 지시어를 켠다.
서버 측 확장
마이크로소프트의 액티브 서버 페이지(ASP)와 가이 서버 쪽에서 확장을 하는 방법
#4. 투명 협상
투명 협상은 클라이언트 입장에서 협상하는 중개자 프락시를 둠으로써 클라이언트와의 메시지 교환을 최소화하는 동시에 서버 주도 협상으로 인한 부하를 서버에서 제거한다.
투명한 내용 협상을 지원하기 위해 서버는 클라이언트의 요청에 가장 잘 맞는 것이 무엇인지 판별하려면 어떤 요청 헤더를 검사해야 하는지 프락시에게 반드시 전달할 수 있어야 한다.
서버는 응답에 Vary 헤더를 포함시켜 보냄으로써 중개자에게 내용 협상을 위해 어떤 헤더를 사용하고 있는지 알려줄 수 있다.
#5. 트랜스코딩
서버가 클라이언트의 요구에 맞는 문서를 아예 갖고 있지 않은 경우 서버는 클라이언트가 사용할 수 있는 다른 형태로 변환할 수 있다. 이 옵션을 트랜스코딩이라고 한다.
포맷 변환
포맷 변환은 데이터를 클라이언트가 볼 수 있도록 다른 포맷으로 변환하는 것이다.
- HTML 문서에서 WML문서로 변환
- 고해상도 이미지에서 저해상도 이미지 변환
정보 합성
문서에서 정보의 요점을 추출하는 것을 정보 합성이라고 한다.
- 각 절의 제목에 기반한 문서의 개요 생성
- 페이지에서 광고 및 로고 제거
콘텐츠 주입
웹 문서의 양을 늘리는 내용 주입 트랜스코딩이다.
- 자동 광고 생성
- 사용자 추적 시스템
참고 자료
- HTTP완벽가이드 , 인사이트
'HTTP' 카테고리의 다른 글
[HTTP] 리다이렉션과 부하 균형 (0) | 2020.05.07 |
---|---|
[HTTP] 웹 호스팅 (0) | 2020.05.07 |
[HTTP] 국제화 : 문자집합 인코딩 (0) | 2020.05.06 |
[HTTP] 엔터티와 인코딩 (0) | 2020.05.05 |
[HTTP] 보안 HTTPS (0) | 2020.05.05 |