HTTP의 리퀘스트와 리스폰스에는 반드시 HTTP 헤더가 포함된다.
HTTP 프로토콜의 리퀘스트와 리스폰스에는 반드시 메시지 헤더가 포함된다.
메시지 헤더
: 클라이언트나 서버가 리퀘스트나 리스폰스를 처리하기 위한 정보를 포함한다
리퀘스트의 HTTP 메시지
: 메소드 + URI + HTTP 버전 + HTTP 헤더 필드로 구성
리스폰스의 HTTP 메시지
: HTTP 메시지 + HTTP 버전 + 상태코드(코드와 설명) + HTTP 헤더 필드로 구성
HTTP 헤더 필드
: HTTP 메시지에 대한 정보를 갖는다. 리퀘스트와 리스폰스 모두에 존재
: HTTP 버전과 확장 사양에 따라 지원 내용이 달라진다
HTTP 헤더 필드는 메시지 바디의 크기, 사용하고 있는 언어, 인증 정보 등을 포함한다.
HTTP 헤더 필드의 구조
[ 헤더 필드 명 : 필드 값 ]
Ex. Content-Type:text/html
하나의 헤더 필드가 여러 개의 필드 값을 가질 수도 있다!
HTTP 헤더 필드의 종류
(1) 일반적 헤더 필드 (General Header Fields)
: 리퀘스트 메시지와 리스폰스 메시지 둘 다 사용되는 헤더
(2) 리퀘스트 헤더 필드 (Request Header Fields)
: 리퀘스트 메시지에 사용되는 헤더
: 리퀘스트의 부가적 정보 / 클라이언트의 정보 / 리스폰스 콘텐츠에 관한 우선순위 포함
(3) 리스폰스 헤더 필드 (Response Header Fields)
: 리스폰스 메시지에 사용되는 헤더
: 리스폰스의 정보 / 서버의 정보 / 클라이언트의 추가 정보 포함
(4) 엔티티 헤더 필드 (Entity Header Fields)
: 리퀘스트 메시지와 리스폰스 메시지에 포함된 엔티티에 사용되는 헤더
: 콘텐츠 갱신 시간 등 엔티티에 대한 정보를 포함
HTTP/1.1 헤더 필드 이외에도 비표준 헤더필드 (RFC4229 HTTP Header Field Registrations)가 존재
HTTP 헤더 필드의 카테고리
: 캐시와 비캐시 프록시의 동작을 정의하기 위해 분류
(1) End-to-end 헤더
: 리퀘스트나 리스폰스의 최종 수신자에게 전송된다.
: 캐시에서 구축된 리스폰스 중 보존되며, 다시 전송해야 하는 구조
(2) Hop-by-hop 헤더
: 한 번 전송에 대해서만 유효.
: 캐시와 프록시에 의해 전송되지 않기도 한다.
리퀘스트 메시지와 리스폰스 메시지 양쪽에서 사용되는 헤더
디렉티브 명령으로 캐싱 동작 지정
: 디렉티브 여러개일 경우 ","로 구분
: 리퀘스트, 리스폰스 할 때에 사용가능 - 리퀘스트 디렉티브, 리스폰스 디렉티브로 나뉜다
캐시가 가능한지 여부를 나타내는 디렉티브
(1) public : 다른 유저에게 돌려줄 수 있는 캐시를 해도 좋다는 것을 명시적으로 나타낸다
(2) private : 리스폰스는 특정 유저만을 대상으로 하고 있다는 것을 나타낸다
(3) no-cache
: 캐시로부터 오래된 리소스가 반환되는 것을 막기 위해 사용된다
: 클라이언트의 리퀘스트에 사용되면 중간 캐시가 오리진 서버까지 리퀘스트를 전송해야함
: 서버의 리스폰스에 사용되면 캐시 서버는 리소스를 저장할 수 없고, 오리진 서버는 캐시 서버가 이후 리퀘스트에서 리소스 유효성을 확인하지 않으면 해당 리스폰스를 사용하지 못하게 함
: 서버 리스폰스로 no-cache에 지정된 헤더 필드만 캐시할 수 없다.
캐시로 보존 가능한 것을 제어하는 디렉티브
(1) no-store
: 리퀘스트 혹은 리스폰스에 기밀 정보가 포함되어 있음
: 캐시는 리퀘, 리스의 일부분을 로컬 스토리지에 보존 안되도록 지정
캐시 기한이나 검증을 지정하는 디렉티브
(1) s-maxage : 여러 유저가 이용할 수 있는 공유 캐시 서버에만 적용 가능한 max-age 디렉티브
(2) max-age
: (클라이언트 리퀘스트) 지정되었던 값보다 새로운 경우에는 캐시되었던 리소스를 받을 수 없고, 지정한 값이 0이면 캐시 서버는 리퀘스트를 항상 오리진 서버에 넘겨야 한다.
: (서버 리스폰스) 캐시 서버가 유효성의 재확인을 하지 않고 리소스를 캐시에 보존해두는 최대 시간을 나타낸다
(3) min-fresh : 캐시된 리소스가 적어도 지정된 시간은 최신 상태의 것을 반환하도록 캐시 서버에 요구
(4) max-state : 캐시된 리소스의 유효기한이 끝났더라도 받아들일 수 있다
(5) only-if-cached : 캐시 서버에서 리스폰스의 리로드와 유효성을 재확인하지 않도록 요구하며, 캐시 서버가 로컬 캐시로부터 응답할 수 없다면 '504 Gateway Timeout' 상태 반환
(6) must-revalidate
: 리스폰스의 캐시가 현재도 유효한지 아닌지의 여부를 오리진 서버에 조회 요구.
: 프록시가 오리진 서버에 도달할 수 없고 리소스를 다시 요구할 수 없다면 캐시는 클라이언트에 '504 Gateway Timeout' 상태 반환
: must-revalidate 사용 중이라면, 리퀘스트의 max-state는 무시된다
(7) proxy-ravalidate : 모든 캐시 서버에 대해 이후의 리퀘스트로 해당 리스폰스 반환할 경우, 반드시 유효성 재확인 요구
(8) no-transform : 리퀘스트와 리스폰스 모두 캐시가 엔티티 바디의 미디어 타입을 변경하지 않도록 지정 (=캐시 서버에 의한 이미지 압축 방지)
Cache-Control 확장
: cache-extension 토큰을 이용, 디렉토리 호학장 가능
프록시에 더 이상 전송하지 않는 헤더 필드를 지정
: hop-by-hop 헤더로 지정
지속적 접속 관리
: HTTP/1.1에서 지속적 접속은 default 값
: 리퀘스트를 송신한 클라이언트의 접속은 계속 유지되고, 추가 리퀘스트를 송신한다
: 서버에서 명시적으로 접속을 끊고 싶다면 Connection 헤더 필드에 Close를 지정
HTTP/1.1 이전에서는 지속적 접속을 원한다면 Connection 필드에 Keep-Alive 지정 필요
클라이언트 측에서 서버 측으로 송신된 리퀘스트 메시지에 사용하는 헤더
: 리퀘스트의 부가 정보, 클라이언트의 정보, 리스폰스의 콘텐츠에 관한 우선 순위 추가
유저 에이전트에 처리할 수 있는 미디어 타입과 미디어 타입의 상대 우선순위 전달
: 텍스트 파일, 이미지 파일, 동영상 파일, 애플리케이션용 바이너리 파일 등 '
서버가 복수의 콘텐츠 반환할 수 있다면
: 가장 높은 품질 계수의 미디어 타입으로 변환 필요
: 우선 순위는 q로 품질 지수 표시
조건부 리퀘스트
: 지정된 조건에 맞는 경우에만 서버가 리퀘스트를 받는다
서버 측에서 클라이언트 측으로 송신된 리스폰스 메시지에 사용하는 헤더
: 리스폰스의 부가 정보, 서버의 정보, 클라이언트에 부가 정보 요구 등
Range 리퀘스트 : 서버가 리소스의 일부분만 지정해서 취득할 수 있는 리퀘스트
오리진 서버에서 얼마나 오래 전에 리스폰스가 생성되었는지 전달
: 단위값은 초
리스폰스한 서버가 캐시 서버인 경우
: 캐시된 리스폰스가 다시 실증되었던 때부터 검증한 시간
프록시가 리스폰스를 생성한 경우, Age 헤더 필드가 필수!
일의적으로 리소스를 특정하기 위한 문자열을 전달
: 서버는 리소스마다 ETag 값을 할당한다
: 리소스가 갱신되지 않으면 ETag 값 갱신할 필요 없다
도중에 다운로드가 끊긴 경우, ETag 값을 참조해 리소스를 특정한다.
강한 ETag, 약한 ETag
- 강한 ETag : 엔티티가 아주 조금 다르더라도 반드시 값이 변화한다.
- 약한 ETag : 리소스가 같다는 것만을 나타낸다.
의미가 다른 리소스일 경우만 값이 변화하며, 값의 앞부분에 "W/"가 붙는다.
캐시를 컨트롤하기 위해 사용
: 오리진 서버가 프록시 서버에 로컬 캐시를 사용하는 방법에 대한 지시 전달
오리진 서버로부터 Vary에 지정된 리스폰스를 받아들인 프록시 서버는 이후 캐시된 리퀘스트와 같은 vary에 지정된 헤더 필드를 가진 리퀘스트에 대해서만 캐시 반환 가능
같은 리소스에 대한 리퀘스트라도, Vary에 지정된 헤더 필드가 다른 경우 오리진 서버로부터 리소스 취득해야한다
HTTP 액세스 인증에 사용
: Request-URI에 지정된 리소스에 적용할 수 있는 인증 스키마와 파라미터를 나타내는 challenge를 전달
상태코드 401 리스폰스에 반드시 포함된다
리퀘스트 메시지와 리스폰스 메시지에 포함된 엔티티에 사용되는 헤더
: 콘텐츠의 갱신 시간과 같은 엔티티에 대한 정보를 포함한다
리소스의 유효 기한 날짜 전달
: 캐시 서버가 수신할 경우, 필드 값으로 지정된 날짜까지 리스폰스의 복사본을 유지하고 리퀘스트에는 캐시를 전달한다. 지정날짜가 지난 경우엔 오리진 서버에 리소스를 얻으러 간다
오리진 서버가 캐시 서버에 캐시되는 것을 원하지 않는다면 Date 헤더 필드의 필드 값과 같은 날짜로 지정한다.
유저 식별과 상태 관리에 쿠키 사용.
쿠키 호출 시 쿠키의 유효 기한과 송신지 도메인, 경로, 프로토콜 등을 체크하기 때문에 데이터 도난의 위험이 적다.
서버가 클라이언트에 대해 상태 관리를 시작할 때 댜양한 정보를 전달
Expires 속성
: 브라우저가 쿠키를 송출할 수 있는 유효 기간 지정
: 생략할 경우 브라우저 세션이 유지되고 있는 동안만 쿠키 유효
: 한번 송출한 클라이언트의 쿠키는 서버에서 명시적으로 삭제할 수 없다 -> 덮어쓰는 방식으로 삭제
Path 속성
: 쿠키를 송출하는 범위를 특정 디렉토리에 한정
Domain 속성
: 지정된 도메인 명은 후방 일치가 된다.
: 명시적으로 여러 도메인에 대해 송출하는 경우를 제외하고, 지정하지 않는 것이 안전
Secure 속성
: 웹 페이지가 HTTPS에서 열렸을 때에만 쿠키 송출을 제한한다.
HttpOnly 속성
: 자바스크립트를 경유하는 방식으로 쿠키를 취득하지 못하도록 막는다.
: 크로스 사이트 스크립팅(XSS)로부터 쿠키의 도청을 막는 것이 목적
: XSS자체를 막는 것은 아니다
웹 서버와 브라우저의 기능에 대해 독자적인 헤더 필드 존재
클릭 재킹
: 웹 사용자가 자신이 클릭하고 있다고 인지하는 것과 다른 것을 클릭하게 속이는 해킹 기법