콘텐츠 협상과 표현
콘텐츠 협상과 표현
웹 서비스를 이용하다 보면, 같은 URL 에 접속했는데도 사용자 언어나 지역에 따라 다른 언어 페이지가 표시되는 경험이 있을 것이다. 예를 들어, 한국에서 접속하거나 한국어 계정으로 특정 URL에 접속하면 한국어 페이지가, 다른 지역에서 접속하거나 영어 계정으로 접속하면 영어 페이지가 표시되는 식이다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
이 현상을 가능케 하는 것이 바로 HTTP의 콘텐츠 협상(Content Negotiation) 이다. 한 마디로, 하나의 URI 가 여러 '표현(Representation)' 형태를 가질 수 있으며, 클라이언트의 선호도를 고려해 서버가 가장 적합한 표현을 골라 제공하는 메커니즘을 의미한다.
1. 콘텐츠 협상(Content Negotiation)이란?
콘텐츠 협상은 클라이언트가 서버에 요청을 보낼 때, 특정 미디어 타입, 언어, 문자 인코딩, 압축 방식 등에 대해 선호도를 전달하고, 서버가 이를 참고하여 가장 적절한 형태의 자원을 반환하는 과정이다.
예시 상황:
- 클라이언트가 한국어 페이지를 선호하면, 서버는 한국어로 번역된 문서를 제공한다.
- 클라이언트가 영어 페이지를 선호하면, 서버는 영어 문서를 제공한다.
- 클라이언트가 HTML 문서를 선호하면, HTML로 표현된 자원을 내려준다.
- 만약 클라이언트가 XML이나 일반 텍스트를 수용할 수 있다고 우선순위를 표시하면, 서버는 그 정보에 따라 적절히 대응할 수 있다.
1.1 자원(URI)과 표현(Representation)
HTTP에서 자원(Resource) 은 URI로 식별된다. 하지만 자원은 여러 표현을 가질 수 있으며, 표현은 구체적으로 언어, 미디어 타입, 문자 인코딩 등이 달라질 수 있다.
- 예:
https://example.com/index
자원- HTML + 한국어
- HTML + 영어
- JSON + 영어
- ...
따라서 동일한 URI라 하더라도 콘텐츠 협상 결과에 따라 서버가 제공하는 표현은 달라질 수 있다.
2. GET 메서드의 엄밀한 정의
HTTP의 GET 메서드를 흔히 "자원을 가져오는" 메서드라고 설명하지만, 다양한 표현이라는 개념을 알게 된 이상, 좀 더 정확히 말하면 GET 메서드는 ‘자원의 특정 표현’을 가져오는 메서드라고 볼 수 있다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
즉, 클라이언트는 GET 요청 시 원하는 표현의 조건을 제시하고, 서버는 가능한 한 해당 조건에 부합하는 표현을 응답하게 된다.
3. 콘텐츠 협상 관련 HTTP 헤더
콘텐츠 협상은 클라이언트가 표현을 선택하도록 '힌트' 를 제공하고, 서버가 이를 반영하는 구조이다. 이 과정에서 쓰이는 주요 헤더는 아래와 같다.
Accept
- 선호하는 미디어 타입(MIME type)을 명시
- 예:
Accept: text/html, application/xml; q=0.9, */*; q=0.8
Accept-Language
- 선호하는 언어를 명시
- 예:
Accept-Language: ko-KR, ko; q=0.9, en-US; q=0.8
Accept-Charset
- 선호하는 문자 인코딩(예: UTF-8, ISO-8859-1 등)을 명시
Accept-Encoding
- 선호하는 압축 방식(예: gzip, deflate 등)을 명시
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
4. 우선순위와 q 값(Quality Value)
클라이언트가 여러 언어나 미디어 타입을 동시에 선호할 수 있는데, 이 때 우선순위를 표현하는 것이 q
파라미터(Quality Value)이다.
q
의 기본값은 1.0이며, 0 ~ 1 범위의 소수를 쓴다.- 값이 클수록 우선순위가 높다.
- 예:
Accept-Language: ko-KR, ko; q=0.9, en-US, en; q=0.8
→ 한국어를 더 선호하되, 영어도 가능Accept: text/html; q=0.9, application/xml; q=0.7, text/plain; q=0.5
→ HTML을 우선적으로 수용, 그 외 XML이나 일반 텍스트도 가능
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
이처럼 여러 표현을 가중치를 두어 나열하면, 서버는 클라이언트의 가장 높은 우선순위에 맞추어 적절히 자원을 제공한다.
5. 정리
- 콘텐츠 협상(Content Negotiation) 은 하나의 URI 가 여러 형태(언어, 미디어 타입, 인코딩 등)로 제공될 수 있음을 전제로, 클라이언트가 선호하는 표현을 서버에게 알려주고, 서버가 이를 반영하여 최적의 표현을 돌려주는 과정이다.
- GET 메서드도 사실 "자원(Resource)" 자체가 아닌 "자원의 특정 표현" 을 가져온다고 정의할 수 있다.
- 우선순위(q 값)를 활용하면, 다중 표현에 대한 가중치를 지정해 가장 원하는 형태로 자원을 받도록 조정할 수 있다.