Content Negotiation

Concepts

개요

콘텐츠 협상은 동일한 URL에 대해 클라이언트의 선호와 능력에 맞춰 서버가 가장 적절한 표현(representation)을 골라 응답하는 메커니즘입니다.

언어, 미디어 타입, 인코딩(압축), 문자셋 등을 협상해 하나의 리소스를 다양한 형태로 제공합니다.

자세히

가장 흔한 방식은 서버 주도 협상으로, 클라이언트가 `Accept`(원하는 MIME 타입), `Accept-Language`(언어), `Accept-Encoding`(gzip/br 압축) 같은 헤더로 선호를 알리고 각 항목에 품질값 `q`로 우선순위를 매깁니다. 예: `Accept: application/json, text/html;q=0.9`. 서버는 이를 참고해 JSON 또는 HTML을 반환하고, `Content-Type`·`Content-Language`·`Content-Encoding`으로 실제 선택을 밝힙니다.

캐시와의 상호작용이 중요합니다. 같은 URL이 헤더에 따라 다른 응답을 주므로, 서버는 `Vary` 헤더로 어떤 요청 헤더가 응답을 좌우하는지 알려야 합니다(예: `Vary: Accept-Encoding`). 이를 빠뜨리면 CDN이 압축된 응답을 압축을 못 받는 클라이언트에게 주는 식의 캐시 오염이 생깁니다. 그 밖에 협상 결과가 다르면 `300 Multiple Choices`를 쓰기도 하지만 실무에서는 드물고, 언어·포맷 구분을 URL 경로(`/en/`, `.json`)로 명시적으로 하는 방식도 병행됩니다.

관련 타입