봄디의 개발일지
[HTTP] HTTP 헤더 - 일반 헤더 (표현/협상) 본문
1️⃣ 개요
HTTP 표준 RFC2616 이 폐기된 후 RFC7230~7235 가 등장하면서 바뀐 것들이 있습니다.
엔티티 (Entity) ➡ 표현 (Representation) 이라고 명칭이 들어오게 되고,
표현 (Representation) 은 표현 메타 데이터 + 표현 데이터 를 합쳐서 부르게 됩니다.
메시지 본문을 통해서 표현 데이터를 전달합니다. 메시지 본문은 페이로드 (payload) 라고도 부릅니다.
표현은 요청이나 응답에서 전달할 실제 데이터라고 합니다.
표현 헤더는 데이터 유형(html, json) , 데이터 길이, 압축 정보 등등 표현 데이터를 해석할 수 있는 정보를 제공합니다.
(표현 헤더는 표현 메타데이터와 페이로드 메시지를 구분해야 하지만, 여기서는 생략하도록 하겠습니다.)
2️⃣ 표현
표현은 크게 4가지로 나뉠 수 있고, 표현 헤더는 전송, 응답 둘 다 사용합니다.
- Content-Type : 표현 데이터의 형식
- Content-Encoding : 표현 데이터의 압축 방식
- Content-Language : 표현 데이터의 자연 언어
- Content-Length : 표현 데이터의 길이
✅ 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 에는gzip , deflate, identity 등이 있습니다.
참고로 identity 는 똑같다, 압축을 안 한다는 뜻입니다.
✅ Content-Language : 표현 데이터의 자연 언어
Content-Language 는 표현 데이터의 자연 언어를 표현하는 것입니다.
예를 들어 Content-Language 가 ko 인 경우, 본문에는 한국어가 들어가있음을 알 수 있습니다.
Content-Language 가 en 인 경우, 본문에는 영어가 들어가있음을 알 수 있습니다.
✅ 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)
위와 같이 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)
Accept 는 클라이언트가 선호하는 미디어 타입을 전달하는 것을 말합니다.
Accept 에 여러가지가 적혀있을 경우 구체적인 것을 우선합니다.
위의 예시에서는 text/plain;format=flowed , text/plain, text/* , */* 의 순서로 우선순위를 갖습니다.
🔍 참고글
인프런 김영한 강사님의 [모든 개발자를 위한 HTTP 웹 기본 지식] 섹션 8. HTTP 헤더1 - 일반 헤더 강의를 참고하여 작성했습니다.
'HTTP' 카테고리의 다른 글
[HTTP] HTTP 헤더 - 쿠키 (1) | 2024.10.13 |
---|---|
[HTTP] HTTP 헤더 - 일반 헤더 (전송 방식 / 일반 정보 / 특별한 정보) (3) | 2024.10.13 |
[HTTP] HTTP 메서드 활용 (2) | 2024.09.29 |
[HTTP] HTTP 상태코드 (100~500대 상태코드 총정리) (0) | 2024.09.29 |
[HTTP] HTTP 메서드 (GET, POST, PUT, PATCH, DELETE) (0) | 2024.09.29 |