웹 사이트를 이용할 때 평소에는 볼 수 없지만
HTTP 요청과 응답에는 반드시 헤더가 포함되어 있다
HTTP 프로토콜의 요청과 응답에는 반드시 메시지 헤더가 포함되어 있다
메시지 헤더에는 클라이언트나 서버가 요청, 응답을 처리하기 위한 정보가 들어 있다
사용자가 직접 볼 필요는 없다
메소드, URI, HTTP 버전, HTTP 헤더 필드 등으로 구성되어 있다
HTTP 메시지와 버전, 상태코드, HTTP 헤더 필드 등으로 구성되어 있다
이러한 요소 중 가장 다양한 정보를 가지고 있는 것이 HTTP 헤더 필드다
헤더 필드는 요청과 응답 모두 존재하는 HTTP 정보를 가지고 있다
헤더 필드는 HTTP 를 구성하는 요소로서 중요한 정보를 전달한다
메시지 바디의 크기나 언어, 인증 정보 등을 전달한다
HTTP 헤더 필드는 필드 명과 필드 값으로 구성되어 있다
필드 명 : 필드 값
예시로 메시지 바디의 오브젝트 타입을 가리키는 콘텐츠 타입이 있다
Content-Type:text/html
하나의 헤더 필드가 여러 개의 필드 값을 가질 수 있다
헤더 필드가 중복된 경우 브라우저마다 다르게 동작한다
HTTP 헤더 필드는 4 종류가 있다
요청과 응답 모두 사용하는 헤더
요청 메시지의 헤더로 요청 메시지의 부가 정보와 클라이언트 정보, 응답 컨텐츠 우선순위 등의 정보를 가지고 있다
응답 메시지 정보와 서버 정보, 클라이언트 추가 정보 요구 등을 가지고 있다
요청과 응답 메시지에 포함된 엔티티의 헤더로
콘텐츠 갱신 시간 등의 엔티티 정보를 가지고 있다
HTTP/1.1 에는 47 종류의 헤더 필드가 정의되어 있다
하지만 정의된 종류만 존재하지는 않고 쿠키 등이 있다
또한 RFC 에 정의되어 폭 넓게 사용되고 있는 것도 있다
HTTP 에서 정의되지 않은 것들은 비표준 헤더 필드라고 부른다
HTTP 헤더 필드는 캐시와 비 캐시 프록시의 동작을 정의하기 위해
두 가지 카테고리로 분류되어 있다
요청과 응답 최종 수신자에게 전송된다
캐시에서 구축된 응답 중 보존되어야 하고
다시 전송되어야 한다
한 번 전송에 대해서만 유효하고 캐시와 프록시에 의해 전송되지 않는 것도 있다
HTTP/1.1 과 그 이후에 사용되는 Hop-by-hop 헤더는 Connection 헤더 필드에 열거해야 한다
아래의 8개 헤더 필드만이 Hop-by-hop 헤더로
이외에는 모두 End-to-end 헤더에 해당한다
요청과 응답 모두에서 사용되는 헤더
디렉티브로 불리는 명령을 사용하여 캐싱 동작을 지정한다
지정한 디렉티브에는 파라미터가 있을 수 있다
여러개의 디렉티브를 지정할 경우에는 콤마로 구분한다
요청과 응답 시 사용 가능
Cache-Control: private, max-age=0
public: 다른 유저에게도 돌려줄 수 있는 캐시를 해도 좋다는 것을 명시적으로 나타냄
private: 특정 유저를 위해서만 리소스 캐싱이 가능, 다른 유저는 캐시를 반환하지 않는다
no-cache: 캐싱을 하지 않도록 지정, 필드 값을 지정하여 해당 필드만 캐시하지 않도록 지정 가능
max-age: 캐시 서버가 유효성을 확인하지 않는 최대 기한을 나타낸다
Expries 헤더 필드와 같이 사용 시 Expries 헤더 필드를 무시한다 (HTTP/1.1)
s-maxage: max-age 와 동일한 기능이지만 공유 캐시 서버에만 적용된다
min-fresh: 리소스가 최소한 유지되어야 할 기한을 지정
max-stale: 캐시된 리소스 유효 기한이 끝났더라도 받아들일 수 있는 시간을 지정한다
only-if-cached: 목적한 리소스가 로컬 캐시에 있는 경우만 응답을 반환하도록 한다
must-revalidate: 응답 캐시가 현재 유효한지 여부를 오리진 서버에 조회하도록 요청
max-stale 을 무시하고 진행된다
proxy-rebalidate: 모든 캐시 서버에 대해서 이후의 요청으로 해당 응답 반환 시 반드시 유효성 재확인을 한다
no-transform: 요청과 응답의 캐시가 엔티티 바디의 미디어 타입을 변경하지 않도록 지정한다
-> 캐시 서버 등에 의해 이미지 압축되는 것을 방지함
Connection 헤더 필드는 두 가지 역할을 한다
전송하지 않는 헤더 필드 지정
Connection: 헤더 필드 명
접속 관리
Connection: Close
HTTP/1.1 에서는 지속 접속이 디폴트이기 때문에 끊고 싶은 경우에 Close
1.1 이전 버전에서는 Keep-Alive 로 지정하여 지속 접속을 할 수 있다
Date 헤더 필드는 HTTP 메시지 생성 날짜를 나타낸다
1.1 이전 버전에서 1.0 버전과의 후방 호환성만을 위해 정의된 헤더 필드
일반 헤더 필드이지만 클라이언트 요청에서만 사용된다
메시지 바디 뒤에 기술되어 있는 헤더 필드를 미리 전달할 수 있다
HTTP/1.1 에 구현되어 있는 청크 전송 인코딩을 사용하고 있는 경우에만 사용 가능하다
메시지 바디의 전송 코딩 형식을 지정하는 경우 사용된다
Transfer-Encoding: chunked
HTTP/1.1 에서 전송 코딩 형식으로 청크만 정의되어 있다
HTTP 및 다른 프로토콜의 새로운 버전이 통신에 이용되는 경우에 사용된다
클라이언트와 서버 간 요청, 응답 메시지의 경로를 알기 위해 사용된다
HTTP/1.0 에서는 Retry-After 로 쓰인다
요청에 대한 추가 정보를 전달한다
기본적으로는 캐시 문제의 경고를 유저에게 전달한다
클라이언트에서 서버로 송신되는 요청 메시지의 헤더로
요청 부가 정보와 클라이언트 정보, 응답 콘텐츠 우선 순위 등을 추가한다
유저 에이전트에 처리할 수 있는 미디어 타입과 우선순위를 전달한다
타입/서브타입 을 지정하여 한 번에 여러 번 설정할 수 있다
텍스트, 이미지, 동영상, 애플리케이션 용 바이너리 파일
에이전트에서 처리할 수 있는 문자셋으로 문자셋의 상대적인 우선 순위를 전달하기 위해 사용된다
유저 에이전트가 처리할 수 있는 콘텐츠 코딩과 우선 순위를 전달한다
gzip, compress, deflate, identify
와일드카드(*) 를 사용하여 모든 인코딩 포맷을 지정할 수 있다
유저 에이전트가 처리할 수 있는 자연어 세트와 우선 순위를 지정한다
자연어 세트는 한 번에 여러 개를 지정할 수 있다
유저 에이전트의 인증 정보(크리덴셜 값)를 전달하기 위해 사용된다
서버에 인증을 받으려 하는 유저 에이전트는 상태 코드 401 응답 뒤 리퀘스트에
Authorization 헤더 필드를 포함한다
공유 캐시가 Authorization 헤더 필드 포함하는 요청을 받은 경우에는 조금 다르게 동작한다
클라리언트가 서버에 특정 동작 요구를 전달한다
HTTP/1.1 사양에는 100-continue 만 정의되어 있다
유저 에이전트를 사용하고 있는 유저의 메일 주소를 전달한다
요청 리소스의 인터넷 호스트와 포트 번호를 전달한
HTTP/1.1 에서 유일한 필수 헤더 필드
요청 시 전달될 서버의 최대 수를 10진수 정수로 지정한다
오리진 서버에 닿기 전에 끝나더라도 경우하는 프록시 서버 등에서 바로 응답을 보내게 한다
오리진 서버까지 가는 도중에 문제가 생기는 경우 응답 받을 수 있는 서버를 찾는 용도로 주로 사용된다
프록시 서버에서의 인증 요구를 받을 때에 인증에 필요한 클라이언트 정보를 전달한다
클라이언트와 프록시 사이의 인증을 한다
리소스의 일부분만 취득하는 Range 요청을 할 때 지정 범위를 전달한다
받은 서버가 요청을 처리할 수 있다면 206 Partial Content 응답을 반환한다
Range 요청을 처리할 수 없는 경우에는 200 OK 응답으로 리소스 전체를 반환한다
요청이 발생한 본래 리소스의 URI 를 전달한다
기본적으로 Referer 헤더 필드는 보내져야 하지만
브라우저 주소창에 직접 URI 를 입력한 경우나 보안상 바람직하지 않다고 판단된 경우에는
보내지 않는다
요청으로 받을 수 있는 전송 코딩의 형식과 우선순위를 지정한다
요청을 생성한 브라우저와 유저 에이전트의 이름 등을 전달하기 위한 필드
로봇 엔진의 요청의 경우에는 로봇 엔진의 책임자 메일 주소가 부가된 것도 있다
프록시 경유로 요청을 할 경우에는 프록시 서버의 이름 등이 부가된 것도 있다
응답 헤더 필드는 응답 메시지에 적용된 헤더로
응답의 부가 정보나 서버 정보, 클라이언트에 정보 요구 등을 나타낸다
서버가 Range 요청을 접수할 수 있는지 여부를 전달
수신 가능하면 bytes 아니면 none
서버에서 응답이 생성된 이후로부터 지난 시간을 전달한다
캐시 서버라면 캐시를 검증한 시간을 전달하게 된다
엔티티 태그라고 불리며 리소스를 특정하기 위한 문자열을 전한다
리소스마다 ETag 값이 할당된다
리소스가 갱신되면 ETag 값도 갱신된다
응답 수신자에 대해서 Request-URI 를 기술한다 이외의 리소스 엑세스를 유도하는 경우 사용된다
기본적으로 300번대 Redirection 리스폰스에 대해 리다이렉트 URI 를 기술한다
프록시 서버에서의 인증 요구를 클라이언트에 전달한다
클라이언트와 서버의 HTTP 엑세스 인증과 비슷하다
요청을 일정 시간 이후에 다시 하라는 것으로 시간을 값으로 갖는다
주로 300번 대, 503 번 상태 코드와 함께 사용된다
서버에 설치되어 있는 HTTP 서버의 소프트웨어를 전달한다
캐시를 컨트롤 하기 위해 사용한다
오리진 서버가 프록시 서버에 로컬 캐시를 사용하는 방법에 대한 지시를 전달한다
HTTP 엑세스 인증에 사용되는 헤더 필드로
401 응답에는 반드시 포함된다
Rqeust-URI 에 지정했던 리소스에 적용할 수 있는
인증 스키마와 파라미터를 나타내는 challenge 를 전달한다
엔티티 페더 필드는 요청과 응답 메시지에 포함된 엔티티에 사용되는 헤더로
콘텐츠 갱신 시간 등과 같은 엔티티 정보를 포함한다
Reqest-URI 에 지정된 리소소스가 제공하는 메소드의 일람을 전달한다
서버가 받을 수 없는 메소드를 수신한 경우에는
상태코드 405 응답과 함께 수신 가능한 메소드의 일람을 서술한
Allow 헤더 필드를 반환한다
서버가 엔티티 바디에 대해서 실시한 콘텐츠 코딩 형식을 전달한다
콘텐츠 코딩은 엔티티의 정보가 누락되지 않도록 압축할 것을 지시한다
주로 다음 네 가지 콘텐츠 코딩 형식이 사용된다
Gzip, Compress, Dellate, Identify
엔티티 바디에 사용된 자연어를 전달한다
엔티티 바디의 크기를 전달한다
엔티티 바디에 전송 코딩이 실시된 경우에는
Content-Length 를 사용해서는 안된다
메시지 바디에 대응하는 URI 를 전달한다
Location 헤더 필드와 달리 메시지 바디로 변환된 리소스의 URI 를 나타낸다
메시지 바디 -> MD5 알고리즘 -> Base64 인코딩
Content-MD5 헤더 필드는 메시지 바디가 변경되지 않고 도착했는지
확인하기 위해 MD5 알고리즘에 의해 생성된 값을 전달한다
우발적으로 콘텐츠가 변경된 사실은 알 수 있지만
악의를 가진 변조는 검출할 수 없다
범위를 지정하여 요청하는 Range 리퀘스트에 대해서 응답할 때 사용된다
응답으로 보내는 엔티티가 어느 부분에 해당하는가를 전달한다
엔티티 바디에 포함되는 오브젝트의 미디어 타입을 전달한다
리소스의 유효 기한을 전달한다
리소스가 마지막으로 갱신된 날짜를 전달한다
기본적으로는 Request-URI 가 지정된 리소스가 갱신된 날짜가 되지만
CGI 등 스크립트로 동적인 데이터를 다룰 때는
그 데이터의 최종 갱신 날짜가 되는 경우도 있다
서버와 클라이언트간 상태를 관리하는 쿠키는 HTTP/1.1 사양에 포함된 것은 아니지만
웹에서 널리 사용되고 있다
쿠키는 유저 식별과 상태 관리에 사용되고 있다
서버가 클라이언트에 대해 상태 관리를 시작할 때 정보를 전달한다
아래와 같은 속석을 가진다
쿠키를 송출할 수 있는 유효 기한을 지정한 것으로
생략 시 브라우저 세션이 유지되는 동안 유효하게 된다
한 번 서버에 송출한 클라이언트의 쿠키는 서버에서 명시적으로 삭제하는 방법이 없다
유효 기한이 지난 쿠키를 덮어쓰는 것으로 쿠키를 삭제하는 것이다
쿠키를 송출하는 범위를 특정 티렉토리에 한정할 수 있다
보안 효과는 기대할 수 없다
domain 속성에 의해 지정된 도메인 명은 후방 일치가된다
example.com 으로 지정했다면 www.example.com 과 www2.example.com 모두에게 쿠키가 송출된다
명시적으로 여러 도메인에 대해 쿠키를 송출하는 경우를 제외하면
domain 속성은 지정하지 않는 쪽이 안전하다
웹 페이지가 HTTPS 에서 열렸을 때에만 쿠키 송출을 하도록 제한한다
자바스크립트를 경유해서 쿠키를 취득하지 못하도록 하는 확장 기능으로
XSS 로부터 쿠키의 도청을 막는 것을 목적으로 한다
클라이언트가 HTTP 의 상태 관리 지원을 원할 때
서버로부터 수신한 쿠키를 이후의 요청에 포함해서 전달한다
쿠키를 여러 개 보내는 것도 가능하다
HTTP 헤더 필드는 독자적으로 확장할 수 있다
다른 웹사이트의 프레임에서 표시를 제어하는 HTTP 응답 헤더로
클릭 재킹이라는 공격을 막는 것을 목적으로 하고 있다
XSS 보호 기능을 제어하는 HTTP 응답 헤더
Do Not Track 이라는 뜻으로 개인 정보 수집을 거부하는 의사를 나타내는 요청 헤더
웹 사이트 상 프라이버시 정책에 P3P 를 사용하는 것으로
프로그램을 읽을 수 있는 형태로 나태느기 위한 HTTP 응답 헤더
HTTP 를 시작으로 많은 프로토콜에서 비표준 파라미터에
"X-" 접두사를 붙이는 것으로 표준 파라미터와 구분했다
장점은 없고 단점이 많아서 앞으로는 그만두기로 제안되었다
이미 구현된 것에는 소급 적용되지 않는다