6장 HTTP 헤더
6.1 HTTP 메시지 헤더
- 메시지 헤더: 클라이언트와 서버 처리에 필요한 주요 정보가 거의 다 여기에 있다.
- 메시지 바디: 사용자와 리소스를 필요로 하는 정보가 있다.
HTTP 프로토콜의 리퀘스트와 리스폰스에는 반드시 메시지 헤더가 포함되어 있다.
메시지 헤더는 클라이언트나 서버가 리퀘스트나 리스폰스를 처리하기위한 정보가 들어있다.
리퀘스트의 HTTP 메시지
메소드, URI, HTTP 버전, HTTP 헤더 필드 등으로 구성되어 있다.
리스폰스의 HTTP 메시지
HTTP 메시지와 HTTP 버전, 상태 코드(코드와 설명), HTTP 헤더 필드 등으로 구성되어 있다.
HTTP 요청에서 가장 다양한 정보를 가지고 있는 것이 HTTP 헤더 필드다.
6.2 HTTP 헤더 필드
6.2.1 HTTP 헤더 필드는 중요한 정보를 전달한다
HTTP 헤더 필드는 HTTP 메시지를 구성하는 요소중의 하나다, 부가적으로 중요한 정보를 전달하는 역할을 담당한다. 메시지 바디의 크기나 사용하고 있는 언어, 인증 정보 등을 제공하기 위해 사용한다.
6.2.2 HTTP 헤더 필드의 구조
헤더 필드 명과 필드 값으로 구성되어 있고 콜론으로 구분짓는다. (key-value 쌍과 같다)
HTTP 헤더 필드가 중복된 경우에는 브라우저마다 처리하는 우선순위가 다르다.
6.2.3 4종류의 HTTP 헤더 필드
일반적 헤더 필드(General Header Fields)
- 리퀘스트와 리스폰스 둘 다 사용되는 헤더
리퀘스트 헤더 필드(Request Header Fields)
- 리퀘스트에서 사용되는 헤더로 부가적인 정보와 클라이언트의 정보, 리스폰스의 콘텐츠에 관한 우선 순위등을 제공한다.
리스폰스 헤더 필드(Response Header Fields)
- 리스폰스에 사용되는 헤더로 리스폰스 정보와 서버의 정보, 클라이언트의 추가 정보 요구 등을 제공한다.
엔티티 헤더 필드(Entity Header Fields)
- 엔티티에 사용되는 헤더로 콘텐츠 갱신 시간 등의 엔티티에 관한 정보를 제공한다.
6.2.4 HTTP/1.1 헤더 필드 일람
일반 헤더 필드
- Cache-Control: 캐싱 동작 지정
- Connection: Hob-by-hop 헤더, 커넥션 관리
- Date: 메시지 생성 날짜
- Pragma: 메시지 제어
- Trailer: 메시지의 끝에 있는 헤더의 일람
- Transfer-Encoding: 메시지 바디의 전송 코딩 형식 지정
- Upgrade: 다른 프로토콜에 업그레이드
- Via: 프록시 서버에 관한 정보
- Warning: 에러 통지
리퀘스트 헤더 필드
- Accept: 유저 에이전트가 처리 가능한 미디어 타입
- Accept-Charset: 문자셋 우선 순위
- Accept-Encoding: 콘텐츠 인코딩 우선 순위
- Accept-Language: 언어(자연어) 우선 순위
- Authorization: 웹 인증을 위한 정보
- Expect: 서버에 대한 특정 동작의 기대
- From: 유저의 메일 주소
- Host: 요구된 리소스의 호스트
- If-Match: 엔티티 태그의 비교
- If-Modified-Since: 리소스의 갱신 시간 비교
- If-None-Match: 엔티티 태그의 비교
- If-Range: 리소스가 갱신되지 않은 경우에 엔티티의 바이트 범위의 요구를 송신
- …
- Referer: 리퀘스트중의 URI를 취득하는 곳
- User-Agent: HTTP 클라이언트의 정보
리스폰스 헤더 필드
- Accept-Ranges: 바이트 단위의 요구를 수신할 수 있는지 없는지 여부
- Age: 리소스의 지정 경과 시간
- Etag: 리소스 특정하기 위한 정보
- Location: 클라이언트를 지정한 URI에 리다이렉트
- …
- WWW-Authenticate: 서버의 클라이언트 인증을 위한 정보
엔티티 헤더 필드
- Allow: 리소스가 제공하는 HTTP 메소드
- Content-Language: 엔티티의 자연어
- Content-Type: 엔티티 바디의 미디어 타입
- Expires: 엔티티 바디의 유효기한 날짜
- Last-Modified: 리소스의 최종 갱신 날짜
6.2.5 HTTP/1.1 이외의 헤더 필드
HTTP 헤더 필드는 RFD2616에서 47종류가 정의 되어 있다.
비표준 헤더 필드는 RFC4229에 정리되어 있다.
6.2.6 End-to-end 헤더와 Hop-by-hop 헤더
HTTP 헤더 필드는 캐시와 비캐시 프록시의 동작을 정의하기 위해서 두 가지 카테고리로 분류되어 있다.
End-to-end 헤더
리퀘스트나 리스폰스의 최종 수신자에게 전송된다. 캐시에서 구축된 리스폰스 중 보존되야 하고, 다시 전송되지 않으면 안되도록 되어 있다.
Hop-by-hop 헤더
한 번 전송에 대해서만 유효하고 캐시와 프록시에 의해서 전송되지 않는 것도 있다.
HTTP/1.1에서 hop-by-hop 헤더에는 다음과 같은 것들이 있다.
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
6.3 HTTP/1.1 일반 헤더 필드
리퀘스트, 리스폰스 양쪽에서 사용되는 헤더다.
6.3.1 Cache-Control
캐싱 동작을 지정한다.
지정한 디렉티브에는 파라미터가 있는 것과 없는 것도 있고 여러 개의 디렉티브를 지정하는 경우에는 콤마로 구분한다.
캐시 리퀘스트 디렉티브
no-cache: 오리진 서버에 강제적인 재검증
no-store: 캐시는 리퀘스트, 리스폰스의 일부분을 보존해서는 안됨
max-age = [초]: 리스폰스의 최대 age값
max-state( =[초]): 기한이 지난 리스폰스를 수신
min-fresh = [초]: 지정한 시간 이후에 변경된 리스폰스를 보냄
no-transform: 프록시는 미디어 타입을 변환해서는 안됨
캐시 리스폰스 디렉티브
public: 어딘가에 리스폰스 캐시가 가능
private: 특정 유저에 대해서만 리스폰스
no-cache: 유효성의 재확인 없이는 캐시는 사용해서는 안됨
no-store: 캐시는 리퀘스트, 리스폰스의 일부분을 보존해서는 안됨
must-revalidate: 캐시는 가능하지만 오리진 서버에 리소스의 재확인을 요구
max-age = [초]: 리스폰스의 최대 age 값
Cache-Control: public
- 다른 유저에게도 돌려줄 수 있는 캐시를 해도 좋다는 것을 명시적으로 나타낸다.
Cache-Control: private
- 특정 유저만을 대상으로 캐시를 하고 있다는 것을 나타낸다.
Cache-Control: no-cache
- 캐싱은 하지만 모든 리퀘스트마다 오리진 서버에 확인하겠다는 것
Cache-Control: no-cache=Location
- 지정된 헤더 필드만 캐시할 수 없게 하고 나머지는 캐싱이 가능하다.
Cache-Control: no-store
- 캐싱이 되지 않도록 지정한다.
Cache-Control: s-maxage=604800
- 공유 캐시 서버(CDN)에 적용한다.
Cache-Control: max-age=604800
- 캐시 서버가 유효성의 재확인을 하지 않고 리소스를 캐시에 보존해 두는 최대 시간을 나타낸다.
- Expires vs max-age
- HTTP/1.1에서는 max-age가 우선이다.
- HTTP/1.0에서는 Expires가 우선이다.
Cache-Control: min-fresh=60
- 캐시된 리소스가 적어도 지정된 시간보다 캐싱 시간이 길어야 함을 의미한다.
Cache-Control: max-stale=3600
- 캐시된 리소스의 유효 기한이 끝났더라도 받아들일 수 있음을 나타낸다.
Cache-Control: only-if-cached
- 클라이언트는 캐시 서버에 대해서 목적한 리소스가 로컬 캐시에 있는 경우만 리스폰스를 반환하도록 요구한다. 캐시 서버가 로컬 캐시로부터 응답할 수 없는 경우에는 “504 Gateway Timeout” 상태를 반환한다.
Cache-Control: must-revalidate
- 리스폰스의 캐시가 현재도 유효한지 아닌지의 여부를 오리진 서버에 조회를 요구한다.
6.3.2 Connection
- 프록시에 더 이상 전송하지 않는 헤더 필드를 지정
- 지속적 접속 관리
Connection: 더 이상 전송하지 않는 헤더 필드 명
Connection: Close
- 서버 측에서 명시적으로 접속을 끊고 싶을 경우에는 Connection 헤더 필드에 Close라고 지정한다.
6.3.3 Date
Date 헤더 필드는 HTTP 메시지를 생성한 날짜를 나타낸다.
6.3.4 Pragma
HTTP/1.1보다 오래된 버전의 흔적으로 HTTP/1.0과의 후방 호환성을 위해서 정의되어 있는 헤더 필드다.
6.3.5 Trailer
메시지 바디의 뒤에 기술되어 있는 헤더 필드를 미리 전달할 수 있다.
6.3.6 Transfer-Encoding
메시지 바디의 전송 코딩 형식을 지정하는 경우에 사용한다.
HTTP/1.1에서 전송 코딩 형식으로 청크 전송만이 정의되어 있다.
6.3.7 Upgrade
HTTP 및 다른 프로토콜의 새로운 버전이 통신에 이용되는 경우에 사용된다.
6.3.8 Via
클라이언트와 서버 간의 리퀘스트 혹은 리스폰스 메시지의 경로를 알기 위해서 사용된다.
프록시 혹은 게이트웨이는 자신의 서버 정보를 Via 헤더 필드에 추가한 뒤에 메시지를 전송한다.
6.3.9 Warning
Warning 헤더는 리스폰스에 관한 추가 정보를 전달한다.
기본적으로 캐시에 관한 문제의 경고를 유저에 전달한다.
6.4 리퀘스트 헤더 필드
클라이언트 측에서 서버 측으로 송신된 리퀘스트 메시지에 사용되는 헤더다.
리퀘스트의 부가 정보와 클라이언트 정보, 리스폰스의 콘텐츠에 관한 우선 순위 등을 추가한다.
6.4.1 Accept
유저 에이전트에 처리할 수 있는 미디어 타입과 상대적인 우선 순위를 전달하기 위해서 사용된다.
Accept: text/html, text/plain; q=0.3, text/htm
6.4.2 Accept-Charset
유저 에이전트에서 처리할 수 있는 문자셋과 우선 순위를 전달하기 위해서 사용한다.
Accept-Charset: iso-8859-5, unicode-1-1:q+0.8;
6.4.3 Accept-Encoding
유저 에이전트가 처리할 수 있는 콘텐츠 코딩과 우선 순위를 전달한다.
콘텐츠 코딩: gzip, compress, deflate, identity
6.4.4 Accept-Language
유저 에이전트가 처리할 수 있는 자연어의 세트와 우선 순위를 전달하기 위해서 사용된다.
다국어 지원을 위해 사용한다.
6.4.5 Authorization
유저 에이전트의 인증 정보를 전달하기 위해서 사용된다.
6.4.6 Expect
클라이언트가 서버에 특정 동작 요구를 전달한다.
6.4.7 From
유저 에이전트를 사용하고 있는 유저의 메일 주소를 전달한다.
6.4.8 Host
리퀘스트한 리소스의 인터넷 호스트와 포트 번호를 전달한다.
Host 헤더 필드는 HTTP/1.1에서 유일한 필수 헤더 필드다.
6.4.9 If-Match
“If-XXX”라는 서식의 리퀘스트 헤더 필드는 조건부 리퀘스트라고 부른다.
조건부 리퀘스트를 받은 서버는 지정된 조건에 맞는 경우에만 리퀘스트를 받는다.
If-Match는 엔티티 태그 값을 전달한다.
6.4.10 If-Modified-Since
지정된 날짜 이후에 갱신된 리소스라면 리퀘스트를 받아들인다.
6.4.11 If-None-Match
엔티티 태그 값이 지정된 리소스의 ETag 값과 일치하지 않으면 리퀘스트를 받아들인다.
6.4.12 If-Range
엔티티 태그 값, 혹은 날짜가 일치하면 Range 리퀘스트로 처리하고 일치하지 않으면 리소스 전체를 반환한다.
6.4.13 If-Unmodified-Since
지정된 리소스가 필드 값에 지정된 날짜 이후에 갱신되어 있지 않는 경우에만 리퀘스트를 받아들인다.
6.4.14 Max-Forwards
리퀘스트를 받아서 넘길때마다 Max-Forwards 값을 1씩 빼고 값이 0이 되면 리스폰스를 반환한다.
6.4.15 Proxy-Authorization
프록시 서버에서의 인증 요구를 받아들일 때에 인증에 필요한 클라이언트의 정보를 전달한다.
6.4.16 Range
리소스의 일부분만 취득하는 Range 리퀘스트를 할 때 지정 범위를 전달한다.
6.4.17 Referer
리퀘스트가 발생한 본래 리소스의 URI를 전달한다.
6.4.18 TE
리스폰스로 받을 수 있는 전송 코딩의 형식과 우선 순위를 전달한다.
6.4.19 User-Agent
리퀘스트를 생성한 브라우저와 유저 에이전트의 이름 등을 전달하기 위한 필드다.
6.5 리스폰스 헤더 필드
Accept-Aanges
- range 리퀘스트를 접수할 수 있는지 여부를 전달한다.
Age
- 얼마나 오래 전에 오리진 서버에서 리스폰스가 생성되었는지를 전달한다.
ETag
- 엔티티 태그라고 불리며 리소스를 특정하기 위한 문자열을 전달합니다. 서버는 리소스마다 Etag 값을 할당합니다.
- 강한 ETag 값은 엔티티가 아주 조금 다르더라도 반드시 값은 변화합니다.
- 약한 Etag 값은 의마가 다른 리소스로 차이가 있는 경우에만 값이 변화합니다. 값의 앞부분에 “W/”가 붙습니다.
Location
- 리스폰스의 수신자에 대해서 Request-URI 이외의 리소스 액세스를 유도하는 경우에 사용된다.
Proxy-Authenticate: 프록시 서버에서의 인증 요구를 클라이언트에 전달한다.
Retry-After: 클라이언트가 일정 시간 후에 리퀘스트를 다시 시행해야 하는지를 전달한다.
Server: HTTP 서버의 소프트웨어를 전달한다.
Vary: 캐시 컨트롤을 위해서 사용한다. 오리진 서버로부터 Vary에 지정되었던 리스폰스를 받아들인 프록시 서버는 이후 캐시된 떄의 리퀘스트와 같은 Vary에 지정되어 있는 헤더 필드를 가진 리퀘스트에 대해서만 캐시를 반환할 수 있다.
WWW-Authenticate: HTTP 액세스 인증에 사용되며 Request-URI에 지정했던 리소스에 적용할 수 있는 인증 스키마와 파라미터를 나타내는 challenge를 전달한다.
6.6 엔티티 헤더 필드
Allow: Request-URI에 지정된 리소스가 제공하는 메소드의 종류를 전달한다.
Content-Encoding: 콘텐츠 코딩 형식을 전달한다.
Content-Language: 엔티티 바디에 사용된 자연어를 전달한다.
Content-Length: 엔티티 바디의 크리를 전달한다.
Content-Location: 메시지 바디에 대응하는 URI를 전달한다.
Content-MD5: 메시지 바디가 변경되지 않고 도착했는지 확인하기 위해 MD5 알고리즘에 의해서 생성된 값을 전달한다.
Content-Range: Range 리퀘스트에 대해서 리스폰스를 할 때 사용한다.
Content-Type: 엔티티 바디에 포함되는 오브젝트의 미디어 타입을 전달한다.
Expires: 리소스의 유효 기한 날짜를 전달한다.
Last-Modified: 리소스가 마지막으로 갱신되었던 날짜 정보를 전달한다.
6.7 쿠키를 위한 헤더 필드
쿠키는 서버와 클라이언트간의 상태를 관리하기 위해 사용한다.
쿠키의 사양서는 아래와 같이 4종류가 있다.
- 넷스케이프사에 의한 사양
- RFC2109
- RFC2965
- RFC6265
Set-Cookie
서버에서 리스폰스에 넣는 헤더 필드이며 쿠키를 저장하기 위해 사용한다.
- NAME=VALUE: 쿠키에 부여된 이름과 값
- Expires=DATE: 쿠키의 유효 기한(지정되지 않은 경우는 브라우저를 닫을 때까지)
- Path=PATH: 쿠키 적용 대상이 되는 서버 상의 디렉토리
- Domain: 쿠키 적용 대상이 되는 도메인 명
- Secure: HTTPS로 통신하고 있는 경우에만 쿠키를 송신
- HttpOnly: 쿠키를 JavaScript에서 액세스하지 못하도록 제한
Cookie: 클라이언트에서 서버에 쿠키를 전달하기 위해 사용한다.
6.8 그 이외의 헤더 필드
X-frame-Option
- 다른 웹 사이트의 프레임에서 표시를 제어하는 HTTP 리스폰스 헤더로 클릭 재킹이라는 공격을 막는 것을 목적으로 하고 있다.
X-XSS-Protection
- 크로스 사이트 스크립팅(XSS) 대책으로서 브라우저의 XSS 보호 기능을 제어하는 HTTP 리스폰스 헤더다.
0: XSS 필터를 무효로 한다.
1: XSS 필터를 유효로 한다.
DNT
- 개인 정보 수집을 거부하는 의사를 나타내는 HTTP 리퀘스트 헤더다.
- 0: 트래킹 동의, 1: 트래킹 거부
P3P
- 웹 사이트 상의 프라이버시 정책에 P3P를 사용하는 것으로 HTTP 리스폰스 헤더다.
'TIL > 개발' 카테고리의 다른 글
그림으로 배우는 Http & Network Basic - 8장 (1) | 2023.12.28 |
---|---|
그림으로 배우는 Http & Network Basic - 7장 (1) | 2023.12.28 |
그림으로 배우는 Http & Network Basic - 5장 (0) | 2023.12.25 |
[리팩토링 2판 스터디] 3회차 정리 (0) | 2023.12.16 |
그림으로 배우는 Http & Network Basic - 4장 (0) | 2023.12.15 |