영어로 Content Negotiation이라고 하는 협상 헤더는 클라이언트가 원하는 표현으로 줄 것을 서버에게 요청하기 위해 사용한다.
➡️ 반드시 요청 시에만 사용한다!
예를 들어
Accept-Language
필드 적용에 대해 살펴보자.
한국어 브라우저를 사용하는 클라이언트👩🏻💻가 다중 언어를 지원하며 영어가 기본 언어로 설정되어 있는 사이트🛜에 접속 요청을 보냈을 때, Accept-Language
필드를 사용하지 않았기 때문에 자신의 기본 언어인 영어로 제공하게 된다.
이번에는
Accept-Language
필드를 사용해 "클라이언트가 선호하는 언어" 에 대한 정보를 제공한다. 이 경우, 다중 언어를 지원하는 사이트가 협상 헤더를 확인한 후 클라이언트가 설정한 언어로 응답 메세지를 보내게 된다.
하지만 클라이언트가 선호하는 언어를 서버가 지원하지 않는 경우가 있을 수 있다. 위와 같은 경우가 그렇다. 이럴 경우, 다중 언어를 지원하는 서버에 기본으로 설정되어 있는 언어로 제공된다.
우선순위를 적용한 요청 메세지 내
Accept-Language
필드를 살펴보자.
우선순위를 적용하기 위해서는 Quality Values(q)
값을 사용한다. 0부터 1 사이의 값을 사용하며, 클수록 높은 우선순위를 갖는다.
ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
1. ko-KR;q=1(생략) ➡️ 1은 생략 가능하다. 가장 높은 우선순위를 갖는다.
2. ko;q=0.9
3. en-US;q=0.8
4. en;q=0.7
따라서 아까 예시와 같은 상황에서, 우선순위를 적용한
Accept-Language
필드를 사용한 협상 헤더를 제공한다고 해보자. 이때 서버는 클라이언트의 우선순위에 따라 영어로 제공하게 된다.
이번에는 Accept
필드를 살펴보자. 이때는 구체적으로 기재된 것이 높은 우선순위를 갖는다.
- text/plain;format=flowed
- text/plain
- text/*
- */ *
단순 전송은 서버의 응답 메세지에 Content-Length
를 지정한다. 고로 컨텐츠의 길이를 정확히 알고 있을 때 사용한다.
압축 전송은 메세지 내용을 압축해서 첨부하며, 압축 방식을 Content-Encoding
필드에 기재한다. 위 예시 같은 경우는 압축 시 gzip 방식을 사용했다는 의미이다.
이 방식을 사용하면 용량이 꽤 크게 줄어든다.
분할 전송은 말 그대로 데이터를 분할해서 전송하는 방식이다. 보내는 데이터의 바이트 수와 데이터를 함께 보낸다. 전송의 끝은 \n
으로 표현한다.
분할 전송은 데이터를 한 번에 전송하는 단순 전송에 비해, 분할된 데이터를 받을 때마다 서버에서 바로 바로 처리할 수 있다.
또한 서버 응답 메세지에서 Transfer-Encoding: chunked
를 기재함을 통해 분할 전송임을 나타낼 수 있으며, 컨텐츠 길이를 예상할 수 없기 때문에 Content-Length
를 표시할 수 없다.
범위 전송은 클라이언트가 전송받길 원하는 데이터의 범위를 요청해서 받는 방식이다. Range
필드를 통해 클라이언트 요청 메세지를 전달하며, Content-Range
필드를 통해 서버가 응답한다.