Cache-Control 해석기
Cache-Control 헤더를 넣으면 브라우저와 CDN이 각각 언제까지 그대로 내주고 언제 재검증하는지 풀어서 설명합니다. 어긋나는 조합도 짚어 줍니다.
응답 헤더의 값을 그대로 붙여 넣으세요.
정리된 헤더
Cache-Control: public, max-age=0, s-maxage=60, stale-while-revalidate=600
브라우저 (개인 캐시)private cache
CDN·프록시 (공유 캐시)shared cache
쓰인 디렉티브
사용 방법
- 1Cache-Control 헤더 값을 붙여 넣거나 아래 예시를 고릅니다.
- 2브라우저와 CDN이 각각 어떻게 다루는지 확인합니다.
- 3어긋나거나 군더더기인 조합이 있으면 “눈여겨볼 점”에서 확인합니다.
자주 묻는 질문
no-cache는 저장은 하되 쓸 때마다 원본에 물어보라는 뜻이고, no-store는 저장 자체를 금지합니다. 이름 때문에 no-cache를 “캐시하지 마라”로 오해하기 쉽지만, no-cache는 바뀌지 않았으면 304로 짧게 끝나 대역폭을 아낍니다. no-store는 매번 전부 다시 받습니다.
s-maxage는 공유 캐시(CDN·프록시)에만 적용되며 그곳에서는 max-age를 덮어씁니다. max-age=0, s-maxage=600이면 브라우저는 매번 확인하지만 CDN은 10분간 그대로 내보냅니다. 원본 부하를 줄이면서 사용자에게는 늘 최신을 주는 흔한 조합입니다.
신선 기간이 끝난 뒤 지정한 초 동안은 낡은 응답을 즉시 내주면서 뒤에서 몰래 새로 받아 둡니다. 사용자는 기다리지 않고 다음 사람이 새 것을 받습니다. RFC 5861에 정의되어 있으며, 체감 속도를 크게 바꾸는 디렉티브입니다.
파일명에 해시가 붙어 내용이 바뀌면 주소도 바뀌는 정적 자산에 씁니다. 신선한 동안에는 사용자가 새로고침을 눌러도 재검증하지 않아 요청 자체가 줄어듭니다. max-age와 함께 써야 뜻이 있으며, 보통 public, max-age=31536000, immutable로 씁니다.
필요 없습니다. RFC 9111 §5.2.2.10이 s-maxage에 proxy-revalidate의 뜻이 이미 포함된다고 정해 두었습니다. s-maxage가 있으면 공유 캐시는 기간이 지난 응답을 재검증 없이 다시 쓸 수 없습니다.
캐시가 스스로 짐작합니다(휴리스틱 캐싱). 보통 Last-Modified로부터 지난 시간의 10% 정도를 신선 기간으로 잡는데, 캐시마다 달라 예측할 수 없습니다. 의도한 동작이 있다면 명시하는 편이 안전합니다.
알아두면 좋은 점
- RFC 9111 §5.2.2, RFC 5861, RFC 8246을 따라 해석합니다.
- 브라우저와 CDN마다 구현이 조금씩 다릅니다. CDN은 Surrogate-Control 같은 자체 헤더를 우선하기도 합니다.
- no-store가 있어도 브라우저 뒤로 가기 캐시(bfcache)나 메모리에 잠시 남을 수 있습니다. 보안 목적이라면 이것만 믿지 마세요.
함께 보면 좋은 도구
마지막 검증: 2026년 8월 30일 · 결과는 참고용 추정치입니다.