[HTTP] HTTP 헤더 - 표현과 협상
대부분의 내용은 인프런 김영한 강사님의 모든 개발자를 위한 HTTP 웹 기본 지식을 참고했습니다.
HTTP 헤더의 구조

RFC7230에서 표현이라는 것이 나오는데, 표현은 요청이나 응답에서 전달할 실제 데이터를 말하며
표현은 표현 메타데이터 + 표현 데이터로 이루어져 있습니다.
위 사진에서는 본문(페이로드, payload)이 표현데이터, 표현 헤더가 표현 메타데이터입니다.
표현 헤더
표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공하는데, 아래와 같은 정보를 제공합니다.
(요청과 응답 모두에서 사용합니다.)
Content-Type
표현 데이터의 형식에 대한 정보를 제공합니다.
예: text/html; charset=utf-8, application/json, image/png...
Content-Encoding
표현 데이터의 압축 방식에 대한 정보를 제공합니다.
데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가합니다.
데이터를 읽는 쪽에서는 전송자가 입력한 인코딩 헤더의 정보로 압축 해제 데이터를 처리합니다.
예: gzip, deflate, identity...
Content-Language
표현 데이터의 자연 언어에 대한 정보를 제공합니다.
예: ko, en, en-US...
Content-Length
표현 데이터의 길이에 대한 정보를 제공합니다.
즉, 메시지 본문의 크기를 나타내는 정보입니다.
바이트 단위로 표현됩니다.
추가적으로, Transfer-Encoding(전송 인코딩) 헤더를 사용하면 Content-Length를 사용하지 않습니다.
콘텐츠 인코딩과 전송 인코딩 헤더는 메시지의 본문을 전송하는 방식을 정의하는 헤더입니다.
전송 인코딩은 주로 큰 데이터를 전송할 때나, 데이터가 압축되어 전송될 때 사용되는데,
일반적으로 메시지를 작은 조각(chunk)으로 나누어 전송하는 청크 전송 인코딩과 함께 사용됩니다.
이때, 메시지의 크기는 미리 알 수 없으며 마지막 청크를 알리기 위한 특별한 표시를 추가합니다.
결과적으로 메시지 본문을 전송하는 방식을 정의하는 헤더이기 때문에 전송하는 방식이 충돌이 나서 사용할 수 없습니다.
협상과 우선순위
협상
협상은 클라이언트가 선호하는 표현을 서버에 요청하는 것을 말합니다.
(서버가 선호하는 표현을 못줄수도 있음, 협상 헤더는 요청 시에만 사용)
협상을 위해 사용되는 주요 헤더는 아래와 같습니다.
Accept
클라이언트가 선호하는 미디어 타입을 전달하는 헤더입니다.
예: text/html, application/json
Accept-Language
클라이언트가 선호하는 언어를 지정합니다.
서버에서는 이 헤더를 기반으로 언어에 따른 콘텐츠를 제공할 수 있습니다.
Accept-Encoding
클라이언트가 선호하는 인코딩 방식을 지정합니다.
예: gzip, deflate...
Accept-Charset
클라이언트가 선호하는 문자 인코딩 방식을 지정합니다.
이 헤더에 따라서 서버는 적절한 문자 인코딩 방식을 선택할 수 있습니다.

Accept-Language 적용하지 않고 그냥 이벤트 페이지를 요청했을 때는
서버의 기본값인 영어로 된 페이지를 응답해 줍니다.

클라이언트가 한글로 된 페이지를 원해서 Accept-Language헤더를 ko로 설정해서 요청을 하면
서버에서 해당 언어를 지원한다면 이에 맞춰서 응답을 해줍니다.

마지막으로 위처럼 영어와 독일어를 지원하는 서버에 ko로 요청을 보냈을 때의 예시인데
이런 상황에서는 기본으로 설정한 독일어를 서버에서 응답해 줄 것이다.
하지만, 이런 상황에서 클라이언트가 ko를 지원하지 않는다면 en으로 응답을 받고 싶을 수 있습니다.
이럴 때 필요한 것이 "협상의 우선순위"입니다.
우선순위
우선순위를 결정하기 위해서는 Quality Values를 사용합니다.
0~1 사이의 숫자를 사용하며, 클수록 높은 우선순위입니다.
위의 예시에서 우선순위를 정한다면 아래와 같습니다.
아래처럼 Accept-Language을 요청했을 때
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
우선순위는 다음과 같다면,
1. ko-KR;q=1 (q생략)
2. ko;q=0.9
3. en-US;q=0.8
4. en;q=0.7
위와 같은 상황에서 Accept-Language에 독일어(de)는 없고 en이 있기때문에 영어로된 페이지를 리턴해줍니다.
추가로 숫자로 우선순위를 정하지 않는다면 구체적인 것이 우선순위가 높습니다.
아래처럼 Accept(미디어 타입)를 요청했을 때
Accept: text/*, text/plain, text/plain;format=flowed, */*
우선순위는 다음과 같습니다.
1. text/plain;format=flowed
2. text/plain
3. text/*
4. */*