본문 바로가기

HTTP

[HTTP] 내용 협상(Content-negotiation)과 트랜스코딩

 

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