HTTP 헤더

6 분 소요

Introduction

오늘은 HTTP headers에 대해 알아보려 한다.

보통 블로그 포스팅 혹은 면접 준비를 위해 여러 블로그를 참조하는데, 최근에 한 포스트에서 인상적인 문구를 봤다.

결국, 어떤 프로토콜을 이해하려면 프로토콜의 헤더만 알면 된다는 얘기었다.
특정 프로토콜의 헤더의 내용은 특정 프로토콜의 기능을 제공하기 위해 담고 있는 최소한의 정보기 때문이다.
출처: https://jeong-pro.tistory.com/181 [기본기를 쌓는 정아마추어 코딩블로그]

HTTP 프로토콜에 대한 전반적인 이해를 위해 이 포스트를 작성한다.

HTTP headers

HTTP headers let the client and the server pass additional information with an HTTP request or response

말 그대로 통신 중 이를 해석하기 위한 추가적인 정보다.

보통 헤더는 콜론(:)으로 fieldvalue를 구분하며 field는 대소문자를 구분하지 않고, value 앞에 나오는 공백을 무시한다.

헤더는 아래와 같이 4가지 분류로 나뉜다.

  • General headers: 요청과 응답에 모두 포함되는 헤더지만 body에서 전송되는 데이터와는 관련이 없다.
  • Request headers: 가져올 리소스와 이를 요청하는 클라이언트에 대한 자세한 정보를 가진다.
  • Response header: 리소스를 제공하는 서버, 위치 등 응답에 대한 추가적인 정보를 가지고 있다.
  • Entity heders: 콘텐츠 데이터 길이, MIME type과 같은 리소의 본문에 대한 정보를 가진다.

또한, 프록시가 어떻게 아래 헤더를 다루냐에 따라 분류할 수 있다.

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade (see also Protocol upgrade mechanism).

  • End-to-end headers: 이 헤더는 반드시 최종 메세지 수신자에게 전송되야 하는 헤더다. 중간 프록시는 반드시 이를 캐싱해야하며, 어떤 수정도 하면 안 된다.
  • Hop-by-hop headers: single transport-level connection에서 유의미한 헤더다. 반드시 재전송 혹은 캐싱될 필요 없다. Connection general header 를 사용하여 hob-by-hob header만 설정할 수 있다는 점을 유의하자.

General headers

요청 및 응답 메세지 모두에서 사용 가능한 기적인 헤더다.

Cache-Control

이후 다른 포스트로 이전할 수도 있는 항목입니다.

syntax

모든 캐싱시스템이 따라야할 지시사항을 지정한다. 문법은 아래와 같다

Cache-Control : cache-request-directive|cache-response-directive

서버와 클라이언트는 캐시에서 특정 문서를 요청하거나 캐싱하기 위해 특정 파라미터를 이용하여 이 헤더를 사용할 수 있다.

클라이언트가 사용가능한 캐싱 요청 directive

Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached

서버가 사용가능한 캐싱 응답 디렉티브다.

Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>

Directive

Cacheability
directive description
public 어떤 요청에 대해서든 캐싱한다.
private 타인과 공유되는 프록시 서버에는 캐싱하지 않는다. end-user에만 브라우저에 캐싱한다.
no-cache 캐싱된 값을 사용하기 위해선 반드시 서버에서 유효한지 확인해야한다.
no-store 어떤 요청도 캐시로 저장하지 않는다.
Expiration
directive description
max-age= 신선도(?)를 설정한다. 이는 캐시가 언제 생성됐는지와 연관있으며 이 후에는 304 Modifed를 받아야만 사용가능하다. Expires와는 다르게 상대 시간을 설정한다.
max-stale[=] Indicates the client will accept a stale response. An optional value in seconds indicates the upper limit of staleness the client will accept.
min-fresh= Indicates the client wants a response that will still be fresh for at least the specified number of seconds.
Revalidation and reloading
directive description
must-revalidate 리소스가 오래됐을 경우 캐시가 반드시 원 서버의 유효성 검사이후 사용해야한다.
proxy-revalidate must-revalidate와 비슷하지만 공유 캐시에 이용된다.
immutable Indicates that the response body will not change over time. The resource, if unexpired, is unchanged on the server and therefore the client should not send a conditional revalidation for it (e.g. If-None-Match or If-Modified-Since) to check for updates, even when the user explicitly refreshes the page. Clients that aren’t aware of this extension must ignore them as per the HTTP specification. In Firefox, immutable is only honored on https:// transactions. For more information, see also this blog post.
Other
directive description
no-transform 중간 캐시 혹은 프록시가 응답 본문, Content-Encoding, Content-Range, Cotent-Type을 수정할 수 없다.

Connection

Connection 헤더는 클라이언트와 서버의 연결방식을 설정하는 헤더다. HTTP/1.1에서 keep-alive가 디폴트다.

HTTP/2에선 아예 사라져버렸다. 사실상 의미가 없다는 이야기를 들었다.

Connection: keep-alive

Date

HTTP가 만들어진 시각. 자동으로 생성된다.

모든 HTTP는 타임스탬프를 반드시 가지고 있어야 하며, 기준은 Greenwich Mean Time(GMT)이다. 아래 세 가지 템플릿을 허용하니 알아두자.

Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format

Pragma

Pragma는 캐시제어 (no-cache), HTTP/1.0에서 쓰던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.

Pragma: no-cache

Transfer-Encoding

발신자와 수신자 사이에 안전한 메세지 압축을 위해 본문 내용의 압축 방식을 지정한다.

chunked면 본문 내용이 동적으로 생성되어 길이를 모르기 때문에 나눠서 보낸다는 의미다.

Transfer-Encoding: chunked

Trailer

트레일러 헤더는 메세지 무결성 검사, 디지털 서명 또는 처리 상태와 같이 메세지 본문이 전송되는 동안 생성될 수 있는 메타데이터를 제공하기 위해 보낸 사람이 chunked 된 메세지의 끝에 추가 필드를 포함시킬 수 있다.

Upgrade

프로토콜 변경을 위해 사용한다.

Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

Via

중계 프록시 서버의 이름, 버전, 호스트 명을 나타낸다.

Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)

Warning

메세지에 반영되지 않은 상태 또는 압축에 대한 추가적인 정보를 보내기 위해 사용한다. 응답은 하나 이상의 Waring header를 보낸다.

Request headers

Accept

클라이이언트가 응답에서 처리가능한 모든 미디어 타입을 명시한다.

Accept: type/subtype [q=qvalue]

Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c

qvalue는 0과 1사이 스케일 값을 가지며, 허용가능한 미디어 타입의 퀄리티 레벨을 표시한다.

Accept-charset

클라이언트가 지원가능한 문자열 인코딩 방식을 명시한다.

Accept-Charset: character_set [q=qvalue]

Accept-Charset: iso-8859-5, unicode-1-1; q=0.8

qvalue는 0과 1사이 스케일 값으로 선호되지 않는 문자열 집합에 대해 허용되는 품질 수준을 나타낸다.

* 와일드 카드가 존재 시 모든 인코딩 방식을 허용하고, 위 헤더가 존재하지 않을 시 기본값이다.

Accept-Encoding

Accept와 비슷하지만 클라이언트가 해석가능한 압축 방식을 지정.

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

Accept-Language

클라이언트가 지원가능한 언어를 나열한다.

Accept-Language: language [q=qvalue]

Accept-Language: da, en-gb;q=0.8, en;q=0.7

qvalue는 비선호 언어에 대한 스케일을 0과 1사이로 나타낸다.

Authorization

토큰 기반 엑세스를 지원하는 경우 위 헤더를 통해 토큰을 보낸다.

Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM=

쿠키 값을 보내며 key-value로 표현된다.

Cookie: name1=value1;name2=value2;name3=value3

Expect

Expect는 클라이언트가 요구하는 특정 서버 동작을 나타낸다.

서버가 지원하지 않는 방식의 Expect 헤더를 전달받았을 경우 417 Expaectation Failed를 전송한다.

Host

요청하려는 서버 호스트 이름과 포트 번호를 나타낸다.

GET /pub/WWW/ HTTP/1.1
Host: www.w3.org

명시하지 않을 경우 default로 80 포트를 설정한다.

If-Match

The If-Match request-header field is used with a method to make it conditional. This header requests the server to perform the requested method only if the given value in this tag matches the given entity tags represented by ETag. The general syntax is:

If-Match : entity-tag

An asterisk (*) matches any entity, and the transaction continues only if the entity exists. Following are possible examples:

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

If-Modifed-Since

현재 필드에 입력된 값 이후로 수정되지 않았다면 본문 없는 304 not modified를 서버에서 전송한다.

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Proxy-Authorization

인증을 필요로 하는 프록시에게 권한을 포함한 값을 전달.

Proxy-Authorization : credentials

Referer

이 페이지 이전 페이지 주소가 담겨있다. 이 헤더를 사용하면 페이지 이동에 대해 확인 가능하다. 보통 데이터 애널리스틱스 같은 데 많이 사용한다. CORS 관련해서 이 헤더를 사용하는 방법을 해결 방법으로 제시하긴 하는데, 헤더를 조작하는 방법이 존재해 그렇게 큰 의미를 가지지 않는 것으로 안다.

User-Agent

클라이언트 프로그램 정보를 나타낸다.

User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

Response headers

Access-Control-Allow-Origin

여기로 이동

Age

max-age 시간내 얼마나 지났는지를 나타내는 추정치

Location

300번대 응답 혹은 201 Created 상태 코드일 때 볼 수 있는 헤더로 서버가 응답이 다른 곳에 있다고 알려주며, URI를 지정함.

Location: http://www.tutorialspoint.org/http/index.htm

Server

웹 서버의 종류를 나타낸다.

Server: Apache/2.2.14 (Win32)

이름-밸류 쌍의 형식으로 되어있으며, 쿠키를 설정한다.

Set-Cookie: name1=value1,name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

옵션은 아래와 같다.

options description
Comment=comment 쿠키와 관련된 코멘트 작성
Domain=domain 쿠키가 유효한 도메인을 명시
Expires=Date-time 쿠키 만료시간을 나타냄. 만약 공백일 경우 방문자가 나갈경우 쿠키가 만료됨.
Path=path 쿠키가 사용될 URL Path
Secure secure connection 밑에 있을 경우에만 사용가능한

Proxy-Authenticate

407 Proxy Authentication Required와 함께 나타나며 요청한 서버가 프록시 서버인 겨웅 유저 인증을 위한 값을 나타낸다.

Proxy-Authenticate  : challenge

WWW-Authenticate

401 Unauthorized와 관려있으며 사용자 인증이 필요한 자원을 요구할 시, 서버가 제공하는 인증방식.

Entity headers

Allow

허용 가능한 메소드를 명시한다.

Allow: GET, HEAD, PUT

Content-Encoding

컨텐츠 압축 방식이다. 응답 컨텐츠를 br, gzip, deflate 등의 알고리즘으로 압축해서 보내면 브루아주거 알아서 해제 후 사용한다.

Content-Encoding: gzip

Content-Language

사용자의 언어를 뜻 한다. 응답이 무슨 언어인지와는 관련이 없다.

Content-Language: mi, en

Content-Length

요청과 응답 메세지의 본문 크기를 나타낸다. 자동으로 만들어짐.

Content-Length: 3495

Content-MD5

메세지 무결성을 위해 포함하며, 해싱한 값이다

Content-MD5  : 8c2d46911f3f5a326455f0ed7a8ed3b3

Content-Type

컨텐츠의 타입과 문자열 인코딩을 명시할 수 있다. Accept, Accept-Charset과 대응된다.

Content-Type: text/html; charset=ISO-8859-4

Expires

지원의 만료 일자. 응답이 신선하지 않은지를 확인할 수 있는 기준.

Expires: Thu, 01 Dec 1994 16:00:00 GMT

Last-Modified

최근에 수정된 날짜를 나타낸다.

현재 리소스가 수정된 날짜를 나타낸다. 여러 버전의 같은 리소스를 비교할 때 사용.

ETag 보단 부정확하지만, 계산이 쉽다.

마무리하며..

헤더를 작성 후 다른 HTTP 관련 포스트를 작성했을 때 더 빠른 이해를 돕지 않을까 싶다.

CORScache 관련한 섹션은 따로 빼서 포스트를 작성할 것이다. 수정이 안 되어 있다면 작성자가 게으른 것.

Refernce
  • https://feel5ny.github.io/2019/10/05/HTTP_007-2/#cacheflow
  • http://www.ktword.co.kr/abbr_view.php?m_temp1=3790
  • https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
  • https://www.tutorialspoint.com/http/http_header_fields.htm
  • https://www.zerocho.com/category/HTTP/post/5b3ba2d0b3dabd001b53b9db
  • https://feel5ny.github.io/2019/10/05/HTTP_007-2/