캐시
: 데이터나 값을 미리 복사해 놓는 임시 장소
캐시가 없을 때
캐시 적용
cache-control
을 넣어준다 → 캐시가 유효한 시간(초)캐시 시간 초과
캐시 유효 시간이 초과해서 서버에 다시 요청하면 다음 두 가지 상황이 나타난다
1. 서버에서 기존 데이터를 변경 (❤️ → 💙)
2. 서버에서 기존 데이터를 변경하지 않음 (❤️)🤔 2번째 상황에서의 문제점
- 똑같은 데이터가 갱신됨
- 캐시 만료 후에도 서버에서 데이터를 변경하지 않았기 때문에 캐시를 갱신하는 것은 불필요✅ 해결 방법
- 저장해 두었던 캐시를 재사용
- 단, 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법 필요
→ 검증 헤더와 조건부 요청
Last-Modified
, ETag
if-Modified-Since
, if-Unmodified-Since
: Last-Modified
사용if-None-Match
, if-Match
: ETag
사용200 OK
304 Not Modified
Last-Modified, If-Modified-Since
ETag
사용ETag, If-None-Match
ETag: "v1.0", ETag: "a2jiodwjekjl3"
ETag: "aaaaa" -> ETag: "bbbbb"
ETag
만 보내서 같으면 유지, 다르면 다시 받기Last-Modified
를 사용한 검증 헤더와 조건부 요청Last-Modified
추가 → 데이터가 마지막에 수정된 시간if-modified-since
추가 (조건부 요청) → 캐시가 가지고 있는 데이터 최종 수정일304 Not Modified
헤더만 전송, HTTP Body 전송 X → 네트워크 부하 감소cache-control
갱신 후 응답 결과를 재사용, 헤더 데이터 갱신ETag
를 사용한 검증 헤더와 조건부 요청ETag
를 추가ETag
저장if-None-Match
추가 (조건부 요청) → 캐시가 가지고 있는 ETag
ETag
를 비교하여 데이터 수정 여부를 검증304 Not Modified
헤더만 전송, HTTP Body 전송 X → 네트워크 부하 감소요약
- 진짜 단순하게 ETag만 서버에 보내서 같으면 유지, 다르면 다시 받기!
- 캐시 제어 로직을 서버에서 완전히 관리
- 클라이언트는 단순히 이 값을 서버에 제공(클라이언트는 캐시 메커니즘을 모름)
- 예) 애플리케이션 배포 주기에 맞추어
ETag
모두 갱신
304 Not Modified
+ 헤더 메타 정보만 응답(바디X)캐시 제어 헤더
Cache-Control
: 캐시 제어Pragma
: 캐시 제어(하위 호환)Expires
: 캐시 유효 기간(하휘 호환)
Cache-Control
: 캐시 지시어(directives)Cache-Control
: max-age
Cache-Control
: no-cache
Cache-Control
: no-store
Pragma
: 캐시 제어(하위 호환)Pragma: no-cache
→ no-cache
처럼 동작Expires
: 캐시 만료일 지정(하위 호환)expires: Mon, 01 Jan 1990 00:00:00 GMT
Cache-Control: max-age
권장Cache-Control: max-age
와 함께 사용하면 Expires
는 무시Cache-Control
: 캐시 지시어(directives) - 기타Cache-Control
: public
Cache-Control
: private
Cache-Control
: s-maxage
Age:60
(HTTP 헤더)캐시를 적용하지 않아도 웹 브라우저에서 임의로 캐싱을 하기도 함
→ 캐싱을 절대 하면 안되는 경우 캐시 무효화 필요
확실한 캐시 무효화 응답 (아래 항목들을 모두 넣을 것)
Cache-Control:no-cache, no-store, must-revalidate
Pragma:no-cache
Cache-Control
: 캐시 지시어(directives) - 확실한 캐시 무효화Cache-Control
: no-cache
Cache-Control
: no-store
Cache-Control
: must-revalidate
504(Gateway Timeout)
must-revalidate
는 캐시 유효 시간이라면 캐시를 사용함Pragma
: no-cache
no-cache
must-revalidate
504 Gateway Timeout
이 나오도록 함