본문 바로가기

서버지식/웹 서비스

[HTTP]표현 헤더(Representation Headers)와 콘텐츠 협상(Content negotiation)

표현은 무엇일까?

표현은 요청이나 응답에서 전달할 실제 데이터를 뜻한다.

따라서 표현 데이터는 실제 데이터를 의미하고 페이로드(payload)라고도 한다.

표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공한다.

 

표현 헤더는 어떻게 쓸까?

표현 헤더는 HTTP 헤더의 일종으로, 형식이 같다.

<field-name>:<field-value> //field-name은 대소문자 구분없음 주의!

 

표현 헤더에는 어떤게 있을까?

위 예시와 같이 표현 헤더에는 `Cotent-Type`과 `Content-Length`같은 부가정보를 담는다.

이 외에도 메시지 바디의 내용, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등등이 있다. 

임의의 헤더 추가도 가능하다!

그저 데이터의 부가정보를 담는 헤더이므로 요청, 응답 둘 다 사용한다.

  • Content-Type: 표현 데이터의 형식
    • 미디어 타입, 문자 인코딩을 표현한다.
Content-Type: Text/html;charset=utf-8
Content-Type: application/json
Content-Type: Image/png
Content-Encoding: gzip
Content-Encoding: deflate
Content-Encoding: identity
  • Content-Language: 표현 데이터의 자연 언어
    • 표현 데이터의 자연 언어를 표현
Content-Language: ko
Content-Language: en
Content-Language: en-US
  • Content-Length: 표현 데이터의 길이
    • 바이트 단위
    • Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안됨. 왜냐? chuncked 방식으로 데이터를 분할하여 보내기 때문에 전체 데이터의 크기를 알 수 없기 때문이다.
Content-Length: 5

콘텐츠 협상은 무엇일까?

쉽게 말하면 사용자가 원하는 데이터의 종류를 서버에 요청할 수 있게 지정해 놓은 헤더이다.

예를 들어 난 한국어로 된 문서가 읽기 편하다고 했을때 "웬만하면 웹페이지는 한국어로 주세요~"라고 서버에게 말하는 것이다.

당연히 클라이언트의 입맛에 맞게 요청하는 것이므로 요청시에만 사용한다.

 

콘텐츠 협상 헤더는 어떻게 쓸까?

이 또한 HTTP 헤더이므로 형식은 같다.

 

콘텐츠 협상에는 어떤게 있을까?

  • Accept: 클라이언트가 선호하는 미디어 타입 전달
  • Accept-charset: 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
  • Accept-Language: 클라이언트가 선호하는 자연 언어

콘텐츠 협상 우선순위 설정?

나는 한국어를 선호하기에 `Accept-Language: ko`를 헤더로 서버에 요청했다. 

그러나 서버가 독일어와 영어밖에 지원하지 않는다.

그런데 나는 독일어를 하나도 모르니 차라리 영어로 받고싶을 때, 우선순위를 적용할 수 있다.

Get /event
Accept-Language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

우선순위 q 값은 0~1 값을 가지고 클수록 높은 우선순위에 있음을 나타낸다. 따라서 위의 헤더를 분석하면

1. ko-KR;q=1

2. ko;q=0.9

3. en-US;q=0.8

4. en;q=0.7

 

1,2,3,4 순으로 클라이언트가 해당 언어를 선호하는 것을 알 수 있다.

 

컨텐츠 협상에 대하여 더 알아보기

 

Content negotiation - HTTP | MDN

HTTP에서, 컨텐츠 협상이란 동일한 URI에서 리소스의 서로 다른 버전을 서브하기 위해 사용되는 메커니즘으로, 사용자 에이전트가 사용자에게 제일 잘 맞는 것이 무엇인지(예를 들어, 문서의 언어

developer.mozilla.org