6장 HTTP 헤더-2

그림으로 배우는 HTTP & Network
(우에노 센 저 / 이병억 역 )
을 읽고 정리한 내용입니다.


6.3. HTTP/1.1 일반 헤더 필드

일반 헤더 필드는 리퀘스트 메시지와 리스폰스 메시지 양쪽에서 사용되는 헤더

6.3.1. Cache-Control

디렉티브로 불리는 명령을 사용하여 캐싱 동작을 지정한다.

Cache-Control 헤더 필드는 캐시의 동작을 지정한다.

지정한 디렉티브에는 파라미터가 있는 것과 없는 것도 있으며
여러 개의 디렉티브를 지정하는 경우에는 콤마,로 구분한다.
Cache-Control 헤더 필드의 디렉티브는 리퀘스트 및 리스폰스 할 때 사용할 수 있다.

1
Cache-Control: private, max-age=0, no-cache

사용 가능한 디렉티브를 리퀘스트와 리스폰스로 나눠서 나타낸다.


캐시가 가능한지 여부를 나타내는 디렉티브

  1. public 디렉티브
1
Cache-control: public

Public 디렉티브가 사용되는 경우, 다른 유저에게도 돌려줄 수 있는 캐시를 해도 좋다는 걸 명시적으로 나타냄

  1. private 디렉티브
1
Cache-control: private

리스폰스는 특정 유저만을 대상으로 함
public 디렉티브와 기능이 반대
캐시 서버는 특정 유저를 위해서 리소스를 캐시할 수 있지만,
다른 유저로부터 같은 리퀘스트가 온다고 하더라도 그 캐시를 반환하지 않도록 한다.

  1. no-cache 디렉티브
  • 클라이언트: 캐시했던 건 필요없으니까 오리진 서버에서 받아오라는 의미
  • 캐시 서버
    • 중간 캐시 서버가 오리진 서버까지 리소스를 전송해야 한다.
    • 캐시 서버는 리소스를 저장할 수 없다.
  • 오리진 서버: 캐시해도 좋지만, 사용할 때 매번 오리진 서버에 확인받으라는 의미

클라이언트의 리퀘스트로 no-cache 디렉티브가 사용된 경우

캐시로부터 오래된 리소스가 반환되는 것을 막기 위해 사용된다.

1
Cache-control: no-cache

서버의 리스폰스로 no-cache 디렉티브가 사용된 경우

헤더 필드 명이 지정된 경우, 지정된 헤더 필드만 캐시할 수 없다.
-> 지정된 헤더 필드 이외에는 캐시하는 것이 가능하다.
이 파라미터는 리스폰스 디렉티브만 사용 가능하다.

1
Cache-control: no-cache=Location

캐시가 보존 가능한 것을 제어하는 디렉티브

  1. no-store 디렉티브
1
Cache-control: no-store

리퀘스트(그와 대응되는 리스폰스) 혹은 리스폰스에 기밀 정보가 포함되어 있을 때 사용한다.
캐시는 리퀘스트, 리스폰스의 일부분을 로컬 스토리지에 보존되지 않도록 지정한다.


캐시 기한이나 검증을 지정하는 디렉티브

  1. s-maxage 디렉티브
1
Cache-control: s-maxage=604800 (단위: 초)

max-age 디렉티브와 기능은 동일하다.
다른 점은 여러 유저가 이용할 수 있는 공유 캐시 서버에만 적용된다는 점이다.
-> 같은 유저에 반복해서 리스폰스를 반환하는 캐시 서버는 무효한 디렉티브이다.
s-maxage 디렉티브가 사용되는 경우, Expires 헤더 필드와 max-age 디렉티브는 무시된다.

  1. max-age 디렉티브
1
Cache-control: max-age=604800 (단위: 초)
클라이언트의 리퀘스트에서 max-age 디렉티브가 사용될 경우

지정되었던 값보다 새로운 경우에는 캐시되었던 리소스를 받아들일 수 있다.

1
Cache-control: max-age=0 (단위: 초)

지정한값이 0이면, 캐시 서버는 리퀘스트를 항상 오리진 서버에 넘길 필요가 있다.

서버의 리스폰스에서 max-age 디렉티브가 사용될 경우

캐시 서버가 유효성의 재확인을 하지 않고 리소스를 캐시에 보존해 두는 최대 시간을 나타낸다.

  • HTTP/1.1 캐시 서버: 동시에 Expires 헤더 필드가 달린 경우, max-age 디렉티브 지정을 우선하고, Expires 헤더를 무시한다.
  • HTTP/1.0 캐시 서버: 반대로 max-age 디렉티브가 무시된다.
  1. min-fresh 디렉티브
1
Cache-control: min-fresh=60 (단위: 초)

캐시된 리소스가 적어도 지정된 시간은 최신 상태의 것을 반환하도록 캐시 서버에 요구한다.
ex) 60초로 지정되어 있는 경우, 60초 이내에 유효 기한이 끝나는 리소스를 리스폰스로 반환하면 안된다.
(리소스의 유효기간은 min-fresh에 지정한 시간 이상(같거나 길어야)이어야 한다.)


  1. max-stale 디렉티브
1
Cache-control: max-stale=3600 (단위: 초)

캐시된 리소스의 유효 기한이 끝났더라도 받아들일 수 있음을 나타낸다.
디렉티브의 값이 지정되어 있지 않은 경우: 클라이언트는 아무리 시간이 경과했더라도 리스폰스를 받아 들인다.

  1. only-if-cached 디렉티브
1
Cache-control: only-if-cached
  • 클라이언트: 캐시 서버에 대해서 목적한 리소스가 로컬 캐시에 있는 경우만 리스폰스를 반환하도록 요구한다.
    -> 캐시 서버에서 리스폰스의 리로드와 유효성을 재확인하지 않도록 요구한다.
  • 캐시 서버가 로컬 캐시로부터 응답할 수 없는 경우, 504 Gateway Timeout상태를 반환한다.
  1. must-revalidate 디렉티브
1
Cache-control: must-revalidate
  • 리스폰스의 캐시가 현재도 유효한지 아닌지의 여부를 오리진 서버에 조회를 요구한다.
  • 리퀘스트에서 max-stale 디렉티브를 사용하고 있더라도 무시한다.(효과를 없앤다.)

  • 프록시가 오리진 서버에 도달할 수 없고, 리소스를 다시 요구할 수 없는 경우,
    캐시는 클라이언트에 504 Gateway Timeout를 반환한다.

  1. proxy-revalidate 디렉티브
1
Cache-control: proxy-revalidate

모든 캐시 서버에 대해서 이후의 리퀘스트로 해당 리스폰스를 반환할 때는 반드시 유효성 재확인을 하도록 요구한다.

  1. no-transform 디렉티브
1
Cache-control: no-transform

리퀘스트와 리스폰스의 어느 쪽에 있어도 캐시가 엔티티 바디의 미디어 타입을 변경하지 않도록 지정한다.
-> 캐시 서버 등에 의해서 이미지가 압축되는 것을 방지한다.


Cache-Control 확장

  1. cache-extension 토큰
1
Cache-control: private, community="UCI"

cache-extension 토큰을 사용하여 디렉티브를 확장할 수 있다.
community라는 디렉티브는 헤더 필드에는 없지만, extension tokens에 의해서 추가할 수 있다.
캐시 서버가 새로운 디렉티브 community를 이해하지 못할 경우, 무시된다.
(community는 이해할 수 있는 캐시 서버에 대해서만 의미가 있다.)