[Book - 그림으로 배우는 Http & Network Basic] 6. HTTP 헤더
HTTP 메시지 헤더
HTTP 프로토콜의 Request와 Response에는 반드시 메시지 헤더가 포함되어 있다.
Request의 HTTP 메시지 구성
메소드, URI, HTTP 버전, HTTP 헤더 필드 등
Response의 HTTP 메시지 구성
HTTP 메시지와 HTTP 버전, 상태 코드(코드와 설명), HTTP 헤더 필드 등
헤더 필드는 Request와 Response 양쪽 모두 존재하는데 HTP 메시지에 관한 정보를 가지고 있다.
HTTP 헤더 필드
중요한 정보 전달
HTTP 헤더 필드는 HTTP 메시지를 구성하는 요소의 하나이고, 부가적으로 중요한 정보를 전달하는 역할을 담당하고 있다.
HTTP 헤더 필드의 구조
헤더 필드 명 : 필드 값
HTTP 헤더 필드가 중복된 경우 브라우저에 따라 최초의 헤더 필드를 우선적으로 처리하거나, 마지막 헤더 필드를 우선적으로 처리한다.
4종류의 HTTP 헤더 필드
HTTP 헤더 필드는 용도에 따라 4종류로 분류된다.
일반적 헤더 필드 (General Header Fields)
Request 메시지와 Response 메시지 둘 다 사용되는 헤더이다.
리퀘스트 헤더 필드 (Request Header Fields)
클라이언트에서 서버로 송신된 Request 메시지에 사용되는 헤더이다.
리스폰스 헤더 필드 (Response Header Fields)
서브에서 클라이언트로 송신한 Response 메시지에 사용되는 헤더이다.
엔티티 헤더 필드 (Entity Header Fields)
Request메시지와 Response 메시지에 포함된 엔티티에 사용되는 헤더이다.
콘텐츠 갱신 시간 등의 엔티티에 관한 정보를 부가한다.
End-to-end 헤더와 Hop-by-hop 헤더
HTTP 헤더 필드는 캐시와 비캐시 프록시의 동작을 정의하기 위해서 두 가지 카테고리로 분류되어 있다.
End-to-end 헤더
Request나 Response의 최종 수신자에게 전송된다.
캐시에서 구축된 Response 중 보존되어야 하고, 다시 전송되지 않으면 안되도록 되어 있다.
Hop-by-hop 헤더
한 번 전송에 대해서만 유효하고, 캐시와 프록시에 의해서 전송되지 않는 것도 있다.
HTTP/1.1과 그 이후에서 사용되는 Hop-by-hop 헤더는 Connection 헤더 필드에 열거해야 한다.
아래 8개의 헤더 필드는 Hop-by-hop 헤더에 분류되지만, 이외에는 모두 End-by-end 헤더에 분류된다.
Connection
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
Trailer
TE
Transfer-Encoding
Upgrade
HTTP/1.1 일반 헤더 필드
일반 헤더 필드는 Request 메시지와 Response 메시지 양쪽에서 사용되는 헤더이다.
헤더 필드 명 | 설명 |
---|---|
Cache-Control | 캐싱 동작 지정 |
Connection | Hop-by-hop 헤더, 커넥션 관리 |
Date | 메시지 생성 날짜 |
Pragma | 메시지 제어 |
Trailer | 메시지의 끝에 있는 헤더의 일람 |
Transfer-Encoding | 메시지 바디의 전송 코딩 형식 지정 |
Upgrade | 다른 프로토콜에 업그레이드 |
Via | 프록시 서버에 관한 정보 |
Warning | 에러 통지 |
Cache-Control
디렉티브로 불리는 명령을 사용하여 캐싱 동작을 지정한다.
Cache-Control 디렉티브
- Cache Request
- Cache Response
캐시가 가능한지 여부를 나타내는 디렉티브
public 디렉티브
Cache-Control: public
다른 유저에게도 돌려줄 수 있는 캐시를 해도 좋다는 것을 명시적으로 나타낸다.
private 디렉티브
Cache-Control: private
Response는 특정 유저만을 대상으로 하고 있다는 것을 나타낸다.
no-cache 디렉티브
Cache-Control: no-cache
캐시로부터 오래된 리소스가 반환되는 것을 막기 위해 사용된다.
캐시된 Response를 클라이언트가 받아 들이지 않고, 중간 캐시 서버가 오리진 서버까지 Request를 전송해야 한다.
Cache-Control: no-cache=Location
지정된 헤더 필드 이외에는 캐시하는 것이 가능하다.
이 파라미터는 Response 디렉티브만 사용 가능하다.
캐시로 보존 가능한 것을 제어하는 디렉티브
no-store 디렉티브
Cache-Control: no-store
Request 혹은 Response에 기밀 정보가 포함되어 있음을 나타낸다.
따라서 캐시는 Request, Response의 일부분을 로컬 스토리지에 보전해서는 안 되도록 지정한다.
캐시 기한이나 검증을 지정하는 디렉티브
s-maxage 디렉티브
Cache-Control: s-maxage=604800 (단위: 초)
max-age 디렉티브와 기능은 같지만, 여러 유저가 이용 할 수 있는 공유 캐시 서버에만 적용된다는 것이 다르다.
같은 유저에 반복해서 Response를 반환하는 캐시 서버는 무효한 디렉티브이다.
s-maxage 디렉티브 사용 시 Expires 헤더 필드와 max-age 디렉티브는 무시된다.
max-age 디렉티브
Cache-Control: max-age=604800 (단위: 초)
클라이언트의 Request에서 사용된 경우, 지정되었던 값 보다 새로운 경우에는 캐시되었던 리소스를 받아들일 수 있다.
서버의 Response에서 사용된 경우, 캐시 서버가 유효성의 재확인을 하지 않고 리소스를 캐시에 보존해 두는 최대 시간을 나타낸다.
동시에 Expires 헤더 필드가 달린 경우
HTTP/1.1 캐시 서버: max-age 디렉티브의 지정 우선, Expires 헤더 필드 무시
HTTP/1.0 캐시 서버: 위와 반대min-fresh 디렉티브
Cache-Control: min-fresh=60 (단위: 초)
캐시된 리소스가 적어도 지정된 시간은 최신 상태의 것을 반환하도록 캐시 서버에 요구한다.
max-stale 디렉티브
Cache-Control: max-stale=3600 (단위: 초)
캐시된 리소스의 유효 기한이 끝났더라도 받아들일 수 있음을 나타낸다.
only-if-cached 디렉티브
Cache-Control: only-if-cached
캐시 서버에서 Response의 리로드와 유효성을 재확인하지 않도록 요구한다.
캐시 서버가 로컬 캐시로부터 응답할 수 없는 경우에는 “504 Gateway Timeout” 상태를 반환한다.
must-revalidate 디렉티브
Cache-Control: must-revalidate
Response의 캐시가 현재도 유효한지 아닌지의 여부를 오리진 서버에 조회를 요구한다.
프록시가 오리진 서버에 도달할 수 없고, 리소스를 다시 요구할 수 없는 경우에는 캐시는 클라이언트에 504(Gateway Timeout)를 반환한다.
Request에서 max-stale 디렉티브를 사용하고 있더라도 무시한다.proxy-revalidate 디렉티브
Cache-Control: proxy-revalidate
모든 캐시 서버에 대해서 이후의 Request로 해당 Response를 반환할 때는 반드시 유효성 재확인을 하도록 요구한다.
no-transform 디렉티브
Cache-Control: no-transform
캐시가 엔티티 바디의 미디어 타입을 변경하지 않도록 지정한다.
Cache-Control 확장
cache-extension 토큰
Cache-Control: private, community="UCI"
디렉티브를 확장할 수 있다.
Connection
Connection 헤더 필드의 역할
- 프록시에 더 이상 전송하지 않는 헤더 필드를 지정
- 지속적 접속 관리
프록시에 더 이상 전송하지 않는 헤더 필드를 지정
Connection: 더 이상 전송하지 않는 헤더 필드 명
프록시 서버에 더 이상 전송하지 않는 헤더 필드(hop-by-hop 헤더)를 지정할 수 있다.
지속적 접속 관리
클라이언트가 Request를 보낸 경우 서버에서 Connection 헤더 필드를 Response 한다.
서버 측에서 명시적으로 접속을 끊고 싶을 경우
Connection: Close
오래된 버전의 HTTP에서 지속적 접속을 하고 싶은 경우
Connection: Keep-Alive
Date
HTTP 메시지를 생성한 날짜를 나타낸다.
Pragma
HTTP/1.0 와의 후방 호환성만을 위해서 정의되어 있는 헤더 필드이다.
Pragma: no-cache
클라이언트의 Request에서만 사용되고, 클라이언트는 캐시된 리소스의 Response를 원하지 않음을 모든 중간 서버에 알리기 위해 사용된다.
모든 중간 서버가 HTTP/1.1을 기준으로 구성되어 있다면 캐시 동작 지정은 Cache-Control: no-cache를 사용하는 것이 바람직하다.
Trailer
메시지 바디의 뒤에 기술되어 있는 헤더 필드를 미리 전달할 수 있다.
HTTP/1.1에 구현되어 있는 청크 전송 인코딩을 사용하고 있는 경우에
사용 가능하다.
Transfer-Encoding
메시지 바디의 전송 코딩 형식을 지정하는 경우에 사용된다.
Upgrade
HTTP 및 다른 프로토콜의 새로운 버전이 통신에 이용되는 경우에 사용된다.
Upgrade 헤더 필드에 의해서 업그레이드 되는 대상은 클라이언트와 인접한 서버 사이뿐이기 때문에 Upgrade 헤더 필드를 사용하는 경우는
Connection: Upgrade
도 지정할 필요가 있다.
Via
클라이언트와 서버 간의 Request 혹은 Response 메시지의 경로를 알기 위해서 사용된다.
전송된 메시지의 추적과 Request 루프의 회피 등에 사용되기 때문에 프록시를 경유하는 경우에는 반드시 부가할 필요가 있다.
Warning
Response에 관한 추가 정보를 전달한다. (기본적으로 캐시에 관한 문제의 경로를 유저에 전달한다.)
Warning: [경고 코드] [경고한 호스트:포트 번호]"[경고문]" ([날짜])
리퀘스트 헤더 필드
Accept
Accept: text/html, application/xhtml+xml, application/xml/xml;q=0.9, */*;q=0.8
유저 에이전트에 처리할 수 있는 미디어 타입과 미디어 타입의 상대적인 우선 순위를 전달하기 위해서 사용된다.
텍스트 파일
text/html, text/plain, text/css, …
application/xhtml+xml, application/xml, …
이미지 파일
image/jpeg, image/gif, image/png, …
동영상 파일
video/mpeg, video/quicktime, …
애플리케이션용 바이너리 파일
application/octet-stream, application/zip, …
Accept-Charset
Accept-Charset:iso-8859-5, unicode-1-1:q+0.8
유저 에이전트에서 처리할 수 있는 문자셋으로, 문자셋의 상대적인 우선 순위를 전달하기 위해서 사용된다.
서버 구동형 네고시에이션에 이용된다.
Accept-Encoding
Accept-Encoding: gzip, deflate
유저 에이전트가 처리할 수 있는 콘텐츠 코딩과 콘텐츠 코딩의 상대적인 우선 순위를 전달하기 위해서 사용된다.
gzip
파일 압축 프로그램 gzip(GNU zip)에서 생성된 인코딩 포맷
compress
UNIX 파일 압축 프로그램 “compress”에 의해서 만들어진 인코딩 포맷
deflate
Zlib 포맷과 deflate 압축 알고리즘에 의해서 만들어진 인코딩 포맷을 조합한 것
identity
압축과 변형을 하지 않는 디폴트 인코딩 포맷
Accept-Language
Accept-Language: ko-kr, en-us;q=0.7, en;q=0.3
유저 에이전트가 처리할 수 있는 자연어의 세트(한국어와 영어라는 의미)와 자연어 세트의 상대적인 우선 순위를 전달하기 위해서 사용된다.
Authorization
Athorization: Basic [인증 정보]
서버에 인증을 받으려 하는 유저 에이전트는 상태 코드 401 Response 뒤에 Request에 Authorization 헤더 필드를 포함한다.
Expect
Expect: 100-continue
클라이언트가 서버에 특정 동작 요구를 전달한다.
From
From: [email 주소]
유저 에이전트를 사용하고 있는 유저의 메일 주소를 전달한다.
Host
Host: [도메인 주소]
Request한 리소스의 인터넷 호스트와 포트 번호를 전달한다.
Host 헤더 필드가 존재하는 이유는 1대의 서버에서 복수의 도메인을 할당할 수 있는 가상 호스트의 구조와 매우 깊은 관련이 있다.
If-Match
조건부 Request라고 부른다.
서버는 If-Match의 필드 값과 리소스의 ETag 값이 일치한 경우에만 Request를 받아들일 수 있다.
If-Modified-Since
리소스가 갱신 날짜가 필드 값보다 새롭지 않다면 Request를 받아들이겠다는 뜻을 전달한다.
If-None-Match
If-None-Match 필드 값고 ETag가 일치하지 않은 경우만 Request를 받아들인다.
If-Match 헤더 필드와는 반대로 동작을 한다.
이 헤더 필드를 사용함으로써 최신의 리소스를 요구한다.
If-Range
조건부 Request의 하나로 If-Range로 지정한 필드값(ETag 값, 혹은 날짜를 지정)과 지정한 리소스의 ETag 값 혹은 날짜가 일치하면 Range Request로서 처리하고 싶다는 것을 전달한다.
일치하지 않는 경우에는 리소스 전체를 반환한다.
If-Unmodified-Since
지정된 리소스가 필드 값에 지정된 날짜 이후에 갱신되어 있지 않는 경우에만 Request를 받아들이도록 전달한다.
Max-Forwards
받아넘길 때마다 Max-Forwards 값을 1씩 뺀다.
값이 0이 되면 Response를 반환한다.
Proxy-Authorization
Proxy-Authorization: Basic [인증 정보]
프록시 서버에서의 인증 요구를 받아들인 때에 인증에 필요한 클라이언트의 정보를 전달한다.
클라이언트와 프록시 사이에서 인증이 이루어진다.
Range
Range: ytes=5001-10000
리소스의 일부분만 취득하는 Range Request를 할 때 지정 범위를 전달한다.
Referer
Referer: [URI]
Request가 발생한 본래 리소스의 URI를 전달한다.
TE
TE: gzip, deflate;q=0.5
Response로 받을 수 있는 전송 코딩의 형식과 상대적인 우선 순위를 전달한다.
TE: trailers
전송 코딩의 지정 이외에 Trailer를 동반하는 청크 전송 인코딩 형식을 지정하는 것이 가능하다.
User-Agent
Request를 생성한 브라우저와 유저 에이전트의 이름 등을 전달하기 위한 필드이다.
리스폰스 헤더 필드
Accept-Ranges
Accept-Ranges: bytes
서버가 리소스의 일부분만 지정해서 취득할 수 있는 Range Request를 접수할 수 있는지 여부를 전달한다.
지정 가능한 경우에는 “bytes”, 수신 불가능한 경우에는 “none”이라고 기록한다.
Age
Age: 600
얼마나 오래 전에 오리진 서버에서 Response가 생성되었는지를 전달한다.
ETag
ETag: "[ETag 값]"
엔티티 태그라고 불리며, 일의적으로 리소스를 특정하기 위한 문자열을 전달한다.
강한 ETag 값
ETag: "[ETag 값]"
엔티티가 아주 조금 다르더라도 반드시 값은 변화한다.
약한 ETag 값
ETag: W/"[ETag 값]"
리소스가 같다는 것만을 나타낸다.
의미가 다른 리소스로 그 차이가 있는 경우에만 ETag 값이 변화한다.
값의 앞부분에 “W/” 가 붙는다.
Location
Response의 수신자에 대해서 Request-URI 이외의 리소스 액세스를 유도하는 경우에 사용된다.
강제로 리다이렉트 하는 곳의 리소스에 액세스를 시도한다.
Proxy-Authenticate
Proxy-Authenticate: Basic realm="[realm]"
프록시 서버에서의 인증 요구를 클라이언트에 전달한다.
클라이언트와 프록시 사이에서 인증이 이루어진다.
Retry-After
Retry-After: 120
클라이언트가 일정 시간 후에 Requeest를 다시 시행해야 하는지를 전달한다.
Server
서버에 설치되어 있는 HTTP 서버의 소프트웨어를 전달한다.
Vary
Vary: Accept-Language
캐시를 컨트롤하기 위해서 사용한다.
오리진 서버가 프록시 서버에 로컬 캐시를 사용하는 방법에 대한 지시를 전달한다.
WWW-Authenticate
WWW-Authenticate: Basic realm=”[realm]”
HTTP 액세스 인증에 사용되는데 Reqeust-URI에 지정했던 리소스에 적용할 수 있는 인증 스키마(”Basic, “Digest”)와 파라이커를 나타내는 challenge를 전달한다.
상태 코드 401 Unauthorized Response에 반드시 포함된다.
엔티티 헤더 필드
콘텐츠의 갱신 시간 같은 엔티티에 관한 정보를 포함한다.
Allow
Allow: GET, HEAD
Request-URI에 지정된 리소스가 제공하는 메소드의 일람을 전달한다.
Content-Encoding
Content-Encoding: gzip
서버가 엔티티 바디에 대해서 실시한 콘텐츠 코딩 형식을 전달한다.
4가지 콘텐츠 코딩 형식
Gzip
Compress
Deflate
Identity
Content-Language
Content-Language: en
엔티티 바디에 사용된 자연어를 전달한다.
Content-Length
Content-Length: 15000
엔티티 바디의 크기(단위는 bytes)를 전달한다.
Content-Location
메시지 바디로 반환된 리소스의 URI를 나타낸다.
Content-MD5
메시지 바디가 변경되지 않고 도착했는지 확인하기 위해 MD5 알고리즘에 의해서 생성된 값을 전달한다.
유효성을 확인하기 위해서는 수신한 클라이언트 측에서 메시지 바디에 같은 MD5 알고리즘을 실행한다. 이렇게 해서 도출한 값과 필드 값을 비교하여 메시지 바디가 올바른지 여부를 알 수가 있다.
악의를 가진 변조는 검출할 수 없다.
Content-Range
Content-Range: bytes 5001-10000/10000
범위를 지정해서 일부분만을 Request하는 Range Request에 대해서 Response를 할 때에 사용된다.
Content-Type
Content-Type: text/html; charset=UTF-8
엔티티 바디에 포함되는 오브젝트의 미디어 타입을 전달한다.
Expires
리소스의 유효 기한 날짜를 전달한다.
Last-Modified
리소스가 마지막으로 갱싱되었던 날짜 정보를 전달한다.
쿠키를 위한 헤더 필드
쿠키는 유저 식별과 상태 관리에 사용되고 있는 기능이다.
- 쿠키의 사양서
넷스케이프사에 의한 사양
쿠키를 고안한 넷스케이프 커뮤니케이션스 사의 사양으로 현재 널리 보급되어 있는 쿠키 방식의 근원이다.
- RFC2109
- RFC2965
RFC6265
넷스케이프사에 의한 사양을 디 펙토 스탠다드로서 쿠키의 사양을 재정의한 것이다.
넷스케이프사의 사양을 근간으로 확장한 것이다.
쿠키를 위한 헤더 필드
헤더 필드 명 설명 헤더 종별 Set-Cookie 상태 관리 개시를 위한 쿠키 정보 Response Cookie 서버에서 수신한 쿠키 정보 Request
Set-Cookie
서버가 클라이언트에 대해서 상태 관리를 시작할 때 다양한 정보를 전달한다.
Expires 속성
브라우저가 쿠키를 송출할 수 있는 유효 기한을 지정할 수 있다.
Path 속성
쿠키를 송출하는 범위를 특정 디렉토리에 한정할 수 있다.
Domain 속성
쿠키의 domain 속성에 의해서 지정된 도메인 명은 후방 일치가 된다.
명시적으로 여러 도메인에 대해서 쿠키를 송출하는 경우를 제외하고 domain 속성은 지정하지 않는 쪽이 안전하다.
Secure 속성
웹 페이지가 HTTPS에서 열렸을 때에만 쿠키 송출을 제한하기 위해서 지정한다.
Set-Cookie: name=value; secure
위의 경우 HTTPS일때만 쿠키를 반송한다.
secure 속성을 생략한 경우에는 HTTP와 HTTPS 모두에서 쿠키를 반송한다.
HttpOnly 속성
XSS으로부터 쿠키의 도청을 막는 것이 목적이다.
Set-Cookie: name=value; HttpOnly
js의 [document.cookie]에서는 읽어 들일 수 없게 된다.
Cookie
Cookie: status=enable
클라이언트가 HTTP의 상태 관리 지원을 원할 때 서버로부터 수신한 쿠키를 이후의 Request에 포함해서 전달한다.
그 이외의 헤더 필드
HTTP 헤더 필드는 독자적으로 확장할 수 있다.
X-frame-Option
X-Frame-Option: DENY
다른 웹 사이트의 프레임에서 표시를 제어하는 HTTP Response 헤더로, click jacking이라는 공격을 막는 것을 목적으로 하고 있다.
X-XSS-Protection
X-XSS-Protection: 1
XSS 대책으로서 브라우저의 XSS 보호 기능을 제어하는 HTTP Response 헤더이다.
DNT
개인 정보 수집을 거부하는 의사를 나타내는 HTTP Request 헤더이다.
P3P
웹 사이트 상의 프라이버시 정책에 사용하는 것으로, 프로그램이 읽을 수 있는 형태로 나타내기 위한 HTTP Response 헤더이다.