[TIL] 250827_Network: HTTP 헤더 - 일반 헤더(2)

지코·2025년 8월 27일
0

Today I Learned

목록 보기
90/94
post-thumbnail

✴️ 컨텐츠 협상

영어로 Content Negotiation이라고 하는 협상 헤더는 클라이언트가 원하는 표현으로 줄 것을 서버에게 요청하기 위해 사용한다.
➡️ 반드시 요청 시에만 사용한다!

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

예를 들어 Accept-Language 필드 적용에 대해 살펴보자.
한국어 브라우저를 사용하는 클라이언트👩🏻‍💻가 다중 언어를 지원하며 영어가 기본 언어로 설정되어 있는 사이트🛜에 접속 요청을 보냈을 때, Accept-Language 필드를 사용하지 않았기 때문에 자신의 기본 언어인 영어로 제공하게 된다.

이번에는 Accept-Language 필드를 사용해 "클라이언트가 선호하는 언어" 에 대한 정보를 제공한다. 이 경우, 다중 언어를 지원하는 사이트가 협상 헤더를 확인한 후 클라이언트가 설정한 언어로 응답 메세지를 보내게 된다.

하지만 클라이언트가 선호하는 언어를 서버가 지원하지 않는 경우가 있을 수 있다. 위와 같은 경우가 그렇다. 이럴 경우, 다중 언어를 지원하는 서버에 기본으로 설정되어 있는 언어로 제공된다.

이 때문에 우선순위 설정이 필요하다❗️

우선순위 1️⃣

우선순위를 적용한 요청 메세지 내 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 필드를 사용한 협상 헤더를 제공한다고 해보자. 이때 서버는 클라이언트의 우선순위에 따라 영어로 제공하게 된다.

우선순위 2️⃣

이번에는 Accept 필드를 살펴보자. 이때는 구체적으로 기재된 것이 높은 우선순위를 갖는다.

  1. text/plain;format=flowed
  2. text/plain
  3. text/*
  4. */ *

우선순위 3️⃣



✴️ 전송 방식

  • 단순 전송
  • 압축 전송
  • 분할 전송
  • 범위 전송

💌 단순 전송

단순 전송은 서버의 응답 메세지에 Content-Length 를 지정한다. 고로 컨텐츠의 길이를 정확히 알고 있을 때 사용한다.

💌 압축 전송

압축 전송은 메세지 내용을 압축해서 첨부하며, 압축 방식을 Content-Encoding 필드에 기재한다. 위 예시 같은 경우는 압축 시 gzip 방식을 사용했다는 의미이다.
이 방식을 사용하면 용량이 꽤 크게 줄어든다.

💌 분할 전송

분할 전송은 말 그대로 데이터를 분할해서 전송하는 방식이다. 보내는 데이터의 바이트 수와 데이터를 함께 보낸다. 전송의 끝은 \n으로 표현한다.

분할 전송은 데이터를 한 번에 전송하는 단순 전송에 비해, 분할된 데이터를 받을 때마다 서버에서 바로 바로 처리할 수 있다.

또한 서버 응답 메세지에서 Transfer-Encoding: chunked 를 기재함을 통해 분할 전송임을 나타낼 수 있으며, 컨텐츠 길이를 예상할 수 없기 때문에 Content-Length를 표시할 수 없다.

💌 범위 전송

범위 전송은 클라이언트가 전송받길 원하는 데이터의 범위를 요청해서 받는 방식이다. Range 필드를 통해 클라이언트 요청 메세지를 전달하며, Content-Range 필드를 통해 서버가 응답한다.

Reference

🎥 모든 개발자를 위한 HTTP 웹 기본 지식

profile
꾸준함이 무기

0개의 댓글