이번에는 HTTP 헤더에 대해서 알아보려고 한다.
HTTP 헤더란?
HTTP 전송에 필요한 모든 부가정보를 넣는 부분이다.
예를 들어 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트 등등 많은 정보가 들어가게된다.
그렇기에 무수히 많은 필드가 존재하며, 필요시에는 임의의 필드를 만들 수도 있다.
헤더는 보통 다음과 같은 구조를 가지고 있다.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
-----------------------------------------------
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:3323
<html>
<body>...</body>
<html>
위 내용에서는 Content-Type: text/html;charset=UTF-8이 헤더가 되는 것이다.
그럼 먼저 이전에 사용되던 HTTP 헤더를 살펴보자.
RFC2616 (이전에 사용되던 HTTP 표준)
General 헤더
메시지 전체에 적용되는 정보가 들어있다.
ex_) Connection: close
Request 헤더
요청 정보에 대한 정보가 들어있다.
ex_) User-Agent: Mozilla/5.0 (Macintosh; ..)
Response 헤더
응답 정보에 대한 정보가 들어있다.
ex_) Server: Apache
Entity 헤더
엔티티 바디에 대한 정보가 들어있다.
엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보를 제공한다.
데이터 유형 html, json / 데이터 길이 / 압축 정보 등
ex_) Content-Type: text/html, Content-Length: 3323
엔티티 본문 (Entity body)
엔티티 본문은 요청이나 응답에서 전달할 실제 데이터를 뜻한다.
메시지 본문 (Message body) - 메시지 본문은 엔티티 본문(entity body)를 전달하는데 사용된다.
⇒ 최신 스펙인 RFC723x 버전이 나오면서 엔티티 본문의 개념이 바뀌게 된다.
RFC7230
엔티티(Entity)의 개념이 표현(Representation)이라는 개념으로 변경되었다.
명칭이 바뀌었다고 생각해도 무방하지만, 좀 더 Body 데이터에 걸맞게 변경되었다고한다.
표현(Representation) [표현 헤더(메타데이터) + 표현 데이터]
표현은 요청이나 응답에서 전달할 실제 데이터를 뜻한다.
메시지 본문 (Message body) = 페이로드 (payload)
메시지 본문은 표현 데이터를 전달하는데 사용된다.
표현 헤더 (Representation Header)
표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공한다.
전송과 응답에 둘 다 사용할 수 있다.
다음의 헤더들이 표현 헤더이다.
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을 사용하면 Length를 사용하면 안된다.
협상 헤더 (Content negotiation)
협상 헤더는 클라이언트가 선호하는 표현을 나타낸다.
요청 시에만 사용되는 헤더이다.
다음의 헤더들이 요청 헤더들이다.
Accept: 표현 데이터의 형식을 나타낸다.
Accept-Charset: 클라이언트가 선호하는 문자 인코딩
Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
Accept-Language: 표현 데이터가 선호하는 자연 언어
협상헤더가 사용되는 예시를 간단하게 들어보겠다.
request
Accept-Language: ko
-----------------------
response
Content-Language: ko
위 같이 클라이언트에서 요청할 때에 한국어를 선호한다고 요청하게 되면 서버에서 응답을 보내줄 때
Content-Language를 한국어로 보내게 된다.
만약 한국어를 지원하지 않으면?
그런 것을 감안하여, 우선순위를 적용하여 보낼 수 있다.
*** 우선순위 q (Quality Values)
우선순위를 적용하는 방법에는 몇가지가 있다.
먼저 첫번째로 0~1 사이 값으로 우선순위를 적용할 수 있다.
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
-----------------------------------------------------
Content-Laguage: en
기본 언어가 독일어이고, 서브 언어로 영어를 지원하는 사이트가 있을 때
위 같이 클라이언트에서 요청을 하게되면 선호언어 한국어를 지원하지 않아도 우선순위에 따라 영어를 통해 응답을 하게되는 것이다.
Accept: */*, text/*, text/plain, text/plain;format=flowed
두번째로는 구체적으로 적혀있는 요소를 우선시 한다.
위 예제를 보면 가장 구체적인 text/plain;format=flowed의 우선순위 가장 높다.
Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,text/html;level=2;q=0.4, */*;q=0.5
미디어 타입을 위 우선순위에 맞추는 경우도 있다.
예를 들자면 위 구문에서 text/plain의 우선순위는 text/*에 해당되므로 0.3이 되는 것이다.
***
다음으로는 전송방식을 결정하는 헤더들에 대해서 알아보겠다.
HTTP의 전송 헤더
단순 전송
Content-Length를 사용한다.
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length:3323
<html>
<body>...</body>
</html>
단순하게 요청을 통해 3323의 길이를 모두 받아오게 된다.
압축 전송
Content-Encoding를 사용한다.
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Encoding: gzip
Content-Length: 521
lkj2123jkljaejhkafndasksdjklvnjklewr...
gzip을 통해 압축을 하여 전송을 하게 된다.
확연하게 Content-Legnth가 줄어든 걸 볼 수 있다.
분할 전송
Transfer-Encoding를 사용한다.
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
5
Hello
5
World
0
\r\n
보낼 데이터를 분할하여서 보내게 된다.
위를 예로 들어보자면 5바이트씩 보내다가 끝나게되면 0을 통해 알려주게된다.
분할 전송은 Content-Length를 보내면 안된다.
처음에 크기가 가늠이 안될 뿐더러, 바이트 정보(길이)들이 다 있기 때문에 보낼 필요가 없다.
범위 전송
Range, Content-Range를 사용한다.
REQUEST
GET /event
Range: bytes=1001-2000
---------------------------
RESPONSE
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Range: bytes 1001-2000/2000
rkwerjksjlk213kl9hvm4n398v29nbkffslkk2123
데이터를 요청할 때에 원하는 범위를 지정할 수 있다.
응답은 데이터의 범위/끝 길이를 함께 나타내게 된다.
마지막으로 많이 사용되는 헤더들을 살펴보고 끝내도록하자.
HTTP 일반 정보성 헤더
From - 유저 에이전트의 이메일 정보
일반적으로 잘 사용되지 않지만, 검새엔진 같은 곳에서 요청시 사용한다.
ex_) 크롤링 같은 것을 너무 심하게 할 시 이를 통해 연락을 취할 수 있다.
Referer - 이전 웹 페이지 주소
현재 요청된 페이지의 이전 웹 페이지 주소를 뜻한다.
A → B로 이동하는 경우 B를 요청할 때 Referer: A를 포함하여 요청을 보내게 된다.
이를 통해서 사용자 유입 경로를 분석이 가능하다.
user-agent - 유저 에이전트 (클라이언트) 애플리케이션 (웹 브라우저) 정보
브라우저 사용에 대한 통계 산출 가능
어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
Server - 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
ORIGIN 서버 실제 애플리케이션에서 요청을 응답으로 표현 데이터를 만들어주는 서버
응답에서 사용된다.
Date - 메시지가 발생한 날짜와 시간
응답에서 사용된다.
HTTP 특별한 정보성 헤더들
Host - 요청한 호스트 정보 (도메인)
요청 시에 사용되는 필수 정보이다.
하나의 서버가 여러 도메인을 처리해야 할 때 (= 하나의 IP 주소에 여러 도메인이 적용되어 있을 때)
Host: www.xxx.com 와 같이 사용하여 해당 도메인을 찾아갈 수 있게 한다.
Location - 페이지 리다이렉션
응답으로 리다이렉션을 보내주기 위한 헤더이다.
201 (Created) 같은 경우는 요청으로 인해 생성된 URI를 담아 응답한다.
3xx (Redirection) 는 요청을 자동으로 리다이렉션하기 위한 대상이 된다.
Allow - 허용 가능한 HTTP 메서드
405 (Method Not Allowed) 에서 응답에 포함되는 헤더이다.
Allow: GET, HEAD, PUT 과 같이 사용된다.
Retry-After - 유저 에이전트(클라이언트)가 다음 요청을 하기까지 기다려야 하는 시간
503 (Service Unavailable) 와 응답으로 사용된다.
HTTP 인증과 관련된 헤더들
Authorization - 클라이언트 인증 정보를 서버에 전달한다.
클라이언트가 요청 할시에 인증정보를 서버에 전달한다.
WWW-Authenticate - 리소스 접근시 필요한 인증 방법을 정의한다.
401 Unauthorized 응답과 함께 사용해야 한다.
이렇게 헤더의 역할과 종류 그리고 어떻게 사용되는지 등에 대해서 알아보았다.
헤더의 존재를 모른 건 아니었지만 이렇게나 많은 종류가 있을 줄은 몰랐다.
특히 상태코드에 대해서 배우고 헤더를 정리하게 되니 엮이는게 많은 것 같아서 신기한 것 같다.
참고 -
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
'오늘의 공부 > WEB' 카테고리의 다른 글
캐시와 조건부 요청 (0) | 2022.04.03 |
---|---|
쿠키 (Cookie) (0) | 2022.03.29 |
HTTP 상태코드 (0) | 2022.03.20 |
HTTP 메서드의 활용 (0) | 2022.03.20 |
HTTP 메서드 (0) | 2022.03.20 |