Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

봄디의 개발일지

[HTTP] HTTP 헤더 - 일반 헤더 (표현/협상) 본문

HTTP

[HTTP] HTTP 헤더 - 일반 헤더 (표현/협상)

bomdy 2024. 10. 6. 23:54

1️⃣ 개요

HTTP 표준 RFC2616 이 폐기된 후 RFC7230~7235 가 등장하면서 바뀐 것들이 있습니다. 

엔티티 (Entity) ➡ 표현 (Representation) 이라고 명칭이 들어오게 되고, 

표현 (Representation) 은 표현 메타 데이터 + 표현 데이터 를 합쳐서 부르게 됩니다.

 

HTTP BODY - RFC7230 (최신)

 

메시지 본문을 통해서 표현 데이터를 전달합니다. 메시지 본문은 페이로드 (payload) 라고도 부릅니다.  

표현은 요청이나 응답에서 전달할 실제 데이터라고 합니다. 

표현 헤더는 데이터 유형(html, json) , 데이터 길이, 압축 정보 등등 표현 데이터를 해석할 수 있는 정보를 제공합니다. 

(표현 헤더는 표현 메타데이터와 페이로드 메시지를 구분해야 하지만, 여기서는 생략하도록 하겠습니다.)


2️⃣ 표현

표현은 크게 4가지로 나뉠 수 있고, 표현 헤더는 전송, 응답 둘 다 사용합니다.  

  • Content-Type : 표현 데이터의 형식
  • Content-Encoding : 표현 데이터의 압축 방식
  • Content-Language : 표현 데이터의 자연 언어
  • Content-Length : 표현 데이터의 길이

✅ Content-Type : 표현 데이터의 형식 설명

Content-Type

 

Content-Type 은 Content Body 에 들어가는 내용이 무엇인지 알려주며, 미디어 타입과 문자 인코딩을 포함합니다. 

위의 그림에서 첫 번째 그림은 text/html 로 보낼 것이고, 인코딩은 utf-8 이라는 것을 알려줍니다. 

json 으로 내용을 보내는 경우 Content-Type 은 application/json 이 됩니다. 

이와 같이 Content-Type 은 text/html; charset=utf-8 , applicaion/json, image/png 등이 있습니다. 

 

✅ Content-Encoding : 표현 데이터의 압축 방식

Content-Encoding

 

Content-Encoding 은 표현 데이터를 압축하기 위해 사용됩니다. 

데이터를 전달하는 곳에서 압축 후 인코딩 헤더에 추가하고, 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축을 해제하게 됩니다. 

Content-Encoding 에는gzip , deflate, identity 등이 있습니다. 

참고로 identity 는 똑같다, 압축을 안 한다는 뜻입니다. 

 

✅ Content-Language : 표현 데이터의 자연 언어

Content-Language

 

Content-Language 는 표현 데이터의 자연 언어를 표현하는 것입니다.

예를 들어 Content-Language 가 ko 인 경우, 본문에는 한국어가 들어가있음을 알 수 있습니다.

Content-Language 가 en 인 경우, 본문에는 영어가 들어가있음을 알 수 있습니다. 

 

✅ Content-Length : 표현 데이터의 길이

Content-Length

 

Content-Length 는 표현 데이터의 길이를 바이트 단위로 나타냅니다. 

참고로, 전송 코딩 (Transfer-Encoding) 을 사용하면 Content-Length 를 사용하면 안됩니다. 


3️⃣ 협상 (컨텐츠 네고시에이션 Content Negotiation)

협상, 컨텐츠 네고시에이션은 클라이언트가 선호하는 표현을 요청하는 것을 말합니다. 

협상도 크게 4가지로 나눌 수 있고, 협상 헤더는 요청 시에만 사용합니다. 

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

✅ Accept-Language : 클라이언트가 선호하는 자연 언어

클라이언트가 요청하는 언어가 있을 경우

 

한국어 브라우저를 사용하는 클라이언트가 Accept-Language: ko 를 요청 할 경우,

다중 언어를 지원하는 서버는 기본으로는 영어를 지원하지만 클라이언트의 요청을 보고 한국어로 지원해서 응답할 수 있습니다. 

클라이언트가 요청하는 언어가 없을 경우

 

반면, 위의 예시는 클라이언트가 Accept-Language: ko 를 요청했는데 서버에서는 한국어를 지원하지 않기 때문에 

기본인 독일어로 응답하는 것을 볼 수 있습니다. 

클라이언트는 한국어를 원했지만, 독일어 보다는 영어를 원하기 때문에

이 경우에서는 우선순위를 사용해서 Accept-Language 를 구체화 시킬 수 있습니다. 

 

✅ 협상과 우선순위 (Accept-Language)

Accept-Language 에 우선순위 적용

 

위와 같이 Quality Values (q) 를 사용하여 우선순위를 적용할 수 있습니다. 

0~1 사이의 값을 가지며, 숫자가 클수록 높은 우선순위를 갖고 생략이 되어 있을 경우 1의 값을 갖습니다. 

위의 예에서는 ko-KR 에서 q 의 값이 생략되었으므로 1의 값으로 제일 높은 우선순위를 갖고

그 다음은 ko;q=0.9, en-US;q=0.8, en;q=0.7 의 우선순위를 갖게 됩니다. 

Accept-Language 우선순위 부여

 

위와 같이 Accept-Language 에 우선순위를 부여하여 클라이언트가 제일 먼저 원하는 우선순위의 언어가 지원되지 않더라도,

우선순위에 따라서 서버로부터 응답받을 수 있습니다. 

 

✅ 협상과 우선순위 (Accept)

협상과 우선순위 - Accept

 

Accept 는 클라이언트가 선호하는 미디어 타입을 전달하는 것을 말합니다. 

Accept 에 여러가지가 적혀있을 경우 구체적인 것을 우선합니다. 

위의 예시에서는 text/plain;format=flowed , text/plain, text/* , */* 의 순서로 우선순위를 갖습니다. 


🔍 참고글

인프런 김영한 강사님의  [모든 개발자를 위한 HTTP 웹 기본 지식] 섹션 8. HTTP 헤더1 - 일반 헤더 강의를 참고하여 작성했습니다.