1. 요청
GET /star.jpg
2. 1.1M 응답 (용량 가정)
HTTP 헤더 : 0.1M
HTTP 바디 : 1.0M
3. 요청 2
GET /star.jpg
4. 응답
1.1M 전송
1. 요청
GET /star.jpg
2. 1.1M 응답
cache-control: max-age=60 //header, 캐시 유효 시간 (초)
3. 응답 결과 브라우저 캐시에 저장
4. 요청 2
GET /star.jpg
5. 캐시에서 조회
but, 기존 데이터가 변경되지 않았다면?
다시 다운로드 할 필요 X 이를 위해 검증 헤더 사용
검증 헤더
조건부 요청 헤더
if-modified-since
, if-Unmodified-since
: Last-Modified와 사용if-Match
, if-None-Match
: ETag와 사용Last-Modified & if-modified-since
1. 요청
2. 1.1M 응답
cache-control: max-age=60
Last-Modified: xxxx년 xx월 xx일 23:21:33 //응답 캐시에 저장 [검증 헤더]
3. 응답 결과(데이터 최종 수정일) 캐시에 저장
4. 캐시 시간 초과
5. 요청 2
GET /star.jpg
if-modified-since: xxxx년 xx월 xx일 23:21:33 //캐시가 가지고 있는
데이터 최종 수정일 [조건부 요청]
6. 서버의 데이터 최종 수정일과 비교 -> 동일 -> HTTP Body를 제외한 0.1M 응답
HTTP/1.1 304 Not Modified 👈
..
cache-control: max-age=60
Last-Modified: xxxx년 xx월 xx일 23:21:33
..
// HTTP Body 제외
7. 캐시 갱신 후 셋팅 -> 캐시에서 조회하여 사용
캐시 유효 시간이 초과해도 서버의 데이터가 갱신되지 않으면
304 Not Modified + 헤더 메타 정보만 응답 (바디 x)
이 단점을 보완한 것이 👇
ETag & if-None-Match
1. 요청
2. 1.1M 응답
cache-control: max-age=60
ETag: "aaaaa"
Content-Length: ...
3. 응답 결과(ETag) 캐시에 저장
4. 캐시 시간 초과
5. 요청 2
GET /star.jpg
if-None-Match: "aaaaa" //캐시가 가지고 있는 ETag
5. 서버의 데이터 ETag와 비교 -> 동일 -> HTTP Body를 제외한 0.1M 응답
HTTP/1.1 304 Not Modified 👈
..
cache-control: max-age=60
ETag: "aaaaa"
..
// HTTP Body 제외
6. 캐시 갱신 후 셋팅 -> 캐시에서 조회하여 사용
캐시 지시어
Cache-Control: max-age
캐시 유효 시간 (초 단위)
Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용
Cache-Control: no-store
데이터에 민감한 정보가 있으므로 저장하면 안 됨 (보통 하드에 저장됨)
(메모리에서 사용하고 최대한 빨리 삭제)
Cache-Control: must-revalidate
캐시 만료 후 최초 조회시 원 서버에 검증해야 함
원 서버 접근 실패시 반드시 오류가 발생해야 함 - 504(Gateway Timeout)
must-revalidate는 캐시 유효 시간이라면 캐시를 사용
캐시 지시어 - 기타
Cache-Control: public
응답이 public 캐시에 저장되어도 됨
Cache-Control: private
응답이 해당 사용자만을 위한 것. private 캐시에 저장해야 함 (기본값)
Cache-Control: s-maxage
프록시 캐시에만 적용되는 max-age
Age: 60 (HTTP헤더)
origin 서버에서 응답 후 프록시 캐시 내에 머문 시간 (초)
캐시 제어(하위 호환)
Pragma : no-cache
캐시 만료일 지정(하위 호환)
expires: Mon, 01 Jan 2000 00:00:00 GMT
원(origin) 서버에 직접 접근하는 경우
프록시 서버 도입 후
유튜브에서 외국 영상 중 인기 많은 것들과 아주 마이너한 영상의 로딩 속도 차이도 이 때문이라고 한다 😲
캐시 지시어 - 기타
Cache-Control: public
응답이 public 캐시에 저장되어도 됨
Cache-Control: private
응답이 해당 사용자만을 위한 것. private 캐시에 저장해야 함 (기본값)
Cache-Control: s-maxage
프록시 캐시에만 적용되는 max-age
Age: 60 (HTTP헤더)
origin 서버에서 응답 후 프록시 캐시 내에 머문 시간 (초)
확실한 캐시 무효화 응답 (모두 넣기)
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache (HTTP 1.0 하위 호환)