가능세계
[Network] 캐시 무효화(Cache Busting)란 무엇인가요? 본문
1. 캐시 무효화가 필요한 이유는 무엇인가요?
캐시 무효화는 캐시에서 데이터를 제거하여 캐시를 무효화하는 프로세스입니다.
왜 캐시 무효화 전략이 필요한 것일까요?
그 이유는 다음과 같습니다.
- 웹 브라우저가
GET
요청을 받을 경우 캐시 헤더 없이도 최적화를 위해 임의로 캐싱을 합니다. - 리소스의 캐시 유효 기간을 장기간으로 설정해 오래된 정보가 표시되는 경우가 있을 것입니다. 이 경우 해당 캐시를 무효화하여 업데이트된 데이터가 반영되도록 해야 합니다. 그러나 캐시 저장소의 복사본에 갱신이 필요해도 기본적으로 브라우저는 캐시 유효 기간이 끝나야 캐시 유효성 검증을 서버에게 요청합니다.
2. 캐시 무효화 헤더와 캐시 지시어
2-1. 캐시 무효화 헤더
- Cache-Control:
no-cache
,no-store
,must-revalidate
- Pragma:
no-cache
2-2. 캐시 지시어
- Cache-Control: no-store
데이터에 민감한 정보가 있으므로 아무것도 캐싱하지 않습니다. 혹은 메모리에서 사용하고 최대한 빠르게 삭제하도록 합니다. - Cache-Control: no-cache
캐시 유효 기간이 남아 있어도 캐시 저장소를 조회하지 말고 서버에 검증을 받으라는 의미입니다. 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용해야 합니다. 서버로부터 304 응답을 받아야 캐시에서 데이터를 가져옵니다. - Cache-Control: must-revalidate
캐시 만료 후 최초 조회 시 원 서버에 검증해야 할 때 설정합니다. 즉, 만료된 캐시만 서버에 확인을 받도록 합니다. 원 서버에 접근 실패 시 반드시504
(Gateway Timeout) 에러가 발생하도록 해야 합니다. 만일 캐시 유효 시간 내에 있다면 캐시를 사용합니다. - Pragma: no-cache
HTTP 1.0 하위 호환하여 적용합니다.
3. no-cache vs must-revalidate
no-cache와 must-revalidate는 캐시를 항상 원 서버에 검증받고 사용하도록 하는 지시어입니다.
캐시 무효화 헤더를 설정할 때 보통 두 지시어를 함께 사용합니다.
3-1. must-revalidate이 사용되는 이유
must-revalidate가 사용되는 이유는 no-cache
를 사용해 원 서버에 검증을 요청하는 도중 원 서버와 프록시 캐시 서버의 연결이 끊어져 검증이 불가능한 경우, 504
에러를 발생시키기 위해서입니다.
몇몇 프록시 캐시 서버에서는 원 서버에 접근이 불가능해질 경우에 검증을 거치지 않고 기존의 캐시 데이터를 반환하기 때문입니다.
예컨대 통장 잔고와 같은 중요 데이터는 원 서버와 연결이 불가능하다고 해서 과거 데이터를 반환하면 큰 문제가 생기므로 must-revalidate
를 사용해 확실히 오류를 발생시키는 전략을 세운다고 볼 수 있습니다.
3-2. 확실히 캐시 무효화를 하기 위해선...
서버 측에서 HTTP 응답 코드를 만들 때 no-cache
와 must-revalidate
, 그리고 하위 호환을 위해 Pragma
를 넣어 확실히 캐시를 무효화하도록 합니다.
참고
'Blog > Network' 카테고리의 다른 글
[Network] 프록시 캐시(Proxy Cache)란 무엇인가요? (0) | 2023.09.11 |
---|---|
[Network] 캐시 제어 헤더(Cache-Control Headers)란 무엇인가요? (0) | 2023.09.11 |
[Network] 캐시와 조건부 요청(Cache & Conditional request) 정리하기 (0) | 2023.09.11 |
[Network] HTTP 헤더 살펴보기 - 쿠키(HTTP Cookies) (0) | 2023.09.11 |
[Network] HTTP 헤더 살펴보기 - 인증(Authentication) (0) | 2023.09.11 |