Content Negotiation이란 동일한 URI에서 리소스의 서로 다른 버전을 지원하기 위해 사용되는 메커니즘이다. 사용자 에이전트가 사용자에게 제일 잘 맞는 것이 무엇인지를 명시할 수 있다.
원칙
클라이언트가 리소스를 내려받길 원하는 경우, 그것을 URL을 사용하여 요청한다. 서버는 리소스를 선택하기 위해 이런 URL을 사용하며 클라이언트에게 해당 리소스의 특정 프레젠테이션을 반환한다. 이때 프레젠테이션은 리소스가 제공하는 변형을 뜻한다.
리소스가 URL을 통해 호출되었을 때 특정 프레젠테이션을 선택하는 방법은 Content Negotiation에 의해 결정되며 클라이언트와 서버 간의 협상에는 다음 두 개의 메커니즘 중 하나를 통해 이뤄진다.
- 클라이언트가 보내는 특정 HTTP 헤더를 이용하는 방법. 가장 보편적인 방법이다. (서버 주도)
- 서버에 의해 전달되는 300, 406 Status Code를 사용하는 방법. 폴백 메커니즘으로써 사용된다. (에이전트 주도)
서버 주도 Content Negotiation
HTTP/1.1 표준은 서버 주도 협상을 시작하는 헤더 목록인 Accept, Accept-Charset, Accept-Encoding, Accept-Language를 정의하고 있다.
서버는 실제로 Content Negotiation에 있어 어떤 헤더가 사용될 지 가리키기 위해 Vary헤더를 사용한다. 때문에 캐시는 최적으로 동작한다.
Vary
참고: https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Vary
Vary는 캐시 된 응답을 향후 요청시 서버로 새로운 요청을 하는 대신 사용할 수 있는지 여부를 결정하는데 사용한다. 즉, 서버에서 Content Negotiation 알고리즘에 어떤 리소스를 선택할 것인지 가리킨다.
Vary는 다음과 같이 사용한다.
-
Vary: *
각 요청에 대해 유일하며 캐시할 수 없는 요청으로 간주하게 만드는 방법.
참고로 캐시를 할 수 없다를 표시할 때는 Cache-Control 헤더로 no-store를 사용하는 것이 더 명시적이다.
-
Vary: <header-name>, <header-name>....
캐시된 응답을 사용할 수 있는지 결정하는 데 사용한다. 여러 헤더가 올 수 있는데 각 헤더는 쉼표로 구분한다.
Accept 헤더
에이전트가 처리하고자 하는 미디어 소스의 MIME 타입을 나열한 헤더. MIME 타입을 쉼표로 구분한 목록으로 각각 품질 인자와 함께 나열되어 있으며, 다른 MIME 타입 사이의 상대적인 선호도를 나타내는 파라미터이다.
-
품질 인자?
품질 인자는 각 MIME 타입에 대해 에이전트에서 선호하는 정도를 의미한다. 품질 인자는 MIME 타입 뒤에 ;q={weight} 형식으로 붙게된다.
일반적인 브라우저의 Accept 헤더 참고: https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values
Accept-Charset 헤더
에이전트가 어떤 종류의 캐릭터 인코딩을 이해할 수 있는지 서버에게 알려주는 헤더. 보통 브라우저에게 각 지역에 서로 다른 값을 설정하기 위해 사용해왔다. 예를 들어 서부 유럽 지역은 ISO-8859-1,utf-8;q=0.7,*;q=0.7와 같이 설정했다.
현재는 UTF-8이 보편화 되었고 더 적은 설정 기반의 엔트로피를 통해 더 나은 개인정보보호를 보장하기 위해서 대부분의 브라우저는 위 헤더를 생략하고 있다. 이미 IE 8, Safari 5, Opera 11, Firefox 10은 이 헤더를 폐기했다.
Accept-Encoding 헤더
에이전트가 압축 가능한 컨텐츠 인코딩을 정의하고 있다. Accept-Encoding도 q 인자를 가지고 인코딩 우선순위를 매긴다.
만약 Accept-Encoding이 설정되어있지 않다면 기본값인 identity로 요청아게 된다. 존재하지 않는 경우에도 identity만은 항상 수용 가능하다고 여겨지기 때문. identity는 인코딩하지 않겠다는 의미로 압축, 수정을 하면 안된다.
Accept-Language 헤더
에이전트가 선호하는 언어를 가리키는데 사용한다. 위 헤더도 품질 인자를 가진다.
User-Agent 헤더
참고로 Content Negotiation으로 위 헤더를 사용하는 것은 나쁜 습관으로 간주된다.
참고 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent
이는 웹 브라우저에 따라 다른 서비스를 제공한다는 의미가 되므로 사용자의 브라우저나 장비에 상관없이 누구나 사용가능하다는 웹의 철학에 위반하기 때문이다.
에이전트 주도 Content Negotiation
서버에서 사용가능한 대체 리소스에 대한 링크를 포함하는 페이지를 회신하면 에이전트가 해당 리소스를 표시하고 사용하려는 리소스를 선택하는 협상방식이다.
단, HTTP 표준은 사용 가능한 리소스 중에서 선택하도록 허용하는 페이지의 형식을 명시하지 않는다. 또한, 실제 리소스를 가져오는데 한 개 이상의 요청이 필요하기 때문에 사용자에 대한 리소스 효용성이 떨어진다. 따라서, 에이전트 주도 Content Negotiation은 거의 사용되지 않는다.
'Web Basic > HTTP' 카테고리의 다른 글
CORS (0) | 2019.10.13 |
---|---|
HTTP Redirect (0) | 2019.10.13 |
HTTP 압축 (Compression) (1) | 2019.10.13 |
HTTP 캐싱 (0) | 2019.10.06 |
HTTP 세션 (0) | 2019.10.06 |