HTTP 캐시 만료 계산기
응답의 Cache-Control, Expires, Date, Age 값과 응답을 받은 시각, 확인할 시각을 입력하세요. 신선도 수명, 현재 나이, 응답이 아직 신선한지를 계산합니다.
이 계산기가 하는 일
HTTP 캐시 표준인 RFC 9111의 한 부분, 즉 신선도 계산을 다룹니다. 저장된 응답을 원본 서버에 확인하지 않고 재사용해도 되는지 판단하는 부분입니다. 검증(ETag, If-Modified-Since, 304), Vary, 요청 쪽 Cache-Control은 다루지 않습니다.
신선도는 새로고침도 삭제도 아닙니다
응답이 **오래된 상태(stale)**라는 것은 캐시가 먼저 확인하지 않고는 재사용할 수 없다는 뜻일 뿐입니다. 브라우저 화면이 저절로 새로고침된다는 뜻이 아니며, 원본 서버의 파일이 변경되거나 삭제된다는 뜻도 아닙니다. 마찬가지로 응답이 신선하다고 해서 서버의 파일이 변경되지 않았다는 뜻은 아닙니다. 표준은 Expires 헤더가 "원본 리소스가 그 시각에, 그 이전에, 또는 그 이후에 변경되거나 사라진다는 것을 의미하지 않는다"고 설명합니다. 이 계산기는 캐시된 사본의 시간 계산만 수행합니다.
신선도 수명과 현재 나이
- 신선도 수명: 응답이 "신선한" 상태로 있을 수 있는 시간의 길이입니다. 응답 자체(Cache-Control 또는 Expires)로 정해지며 시간이 지나도 변하지 않습니다.
- 현재 나이: 응답이 생성된 후 경과한 시간입니다. 시간이 지나면 증가합니다.
- 신선한가요? 신선도 수명이 현재 나이보다 클 때만 신선합니다 (같으면 오래된 상태입니다).
- 남은 신선도 = 신선도 수명 − 현재 나이.
신선도 수명을 정하는 값
RFC 9111 4.2.1절에 따라 처음으로 해당하는 값을 사용합니다:
| 순서 | 공유 캐시 (CDN, 프록시) | 비공개 캐시 (브라우저) |
|---|---|---|
| 1 | s-maxage | (s-maxage는 사용하지 않음) |
| 2 | max-age | max-age |
| 3 | Expires − Date | Expires − Date |
| 4 | 아무것도 없으면 명시적인 만료 시각이 없음 | 동일 |
- max-age가 있으면 Expires는 무시됩니다. 공유 캐시에서는 s-maxage가 있으면 max-age와 Expires가 무시됩니다 (5.3절).
- 같은 지시자가 여러 번 나타나면 처음 것을 사용합니다 (표준이 허용하는 방식 중 하나).
- 정수가 아니거나 따옴표로 묶인 max-age 또는 s-maxage(표준은 송신자가 따옴표 형태를 생성해서는 안 된다고 규정)는 올바르지 않은 값으로 취급하며, 응답은 **오래된 상태(신선도 수명 0)**로 간주합니다. 2,147,483,648을 넘는 값은 2,147,483,648로 취급합니다 (1.2.2절).
- Expires가
0이거나 존재하지 않는 날짜이면 응답은 이미 만료된 것으로 취급합니다 (5.3절). - 명시적인 만료 시간이 없으면 휴리스틱 신선도(예: Last-Modified로 추정한 값)는 계산하지 않습니다. 휴리스틱 수명은 표준에서 구현에 맡기고 있습니다.
현재 나이(age)를 계산하는 방법
공식은 RFC 9111의 4.2.3절을 따릅니다.
- 겉보기 나이 = max(0, 수신 시각 − Date)
- 수신 시점의 나이 = max(겉보기 나이, Age 헤더 + 응답 지연)
- 현재 나이 = 수신 시점의 나이 + 수신 후 경과 시간
이 계산기는 요청을 보낸 시각을 입력받지 않으므로, 응답 지연(요청을 보내고 응답을 받기까지의 시간)을 0으로 간주합니다. 지연이 큰 연결에서는 계산된 나이가 실제보다 작을 수 있습니다. 표준에서는 Age 헤더에 지연만 더해서 사용하는 것도 허용합니다.
입력 규칙
- 날짜는 IMF-fixdate(예:
Sun, 06 Nov 1994 08:49:37 GMT) 또는2026-10-21 07:28:00같은 UTC 시각으로 입력하세요. 모든 값은 UTC(GMT) 기준이며 시간대는 다루지 않습니다. 연도는 1900년부터 2100년까지, 초는 0부터 59까지 입력할 수 있습니다(윤초인 60은 허용하지 않습니다). 요일 이름이 날짜와 맞는지는 확인하지 않습니다. - RFC 850 형식과 asctime 형식은 HTTP 수신 측이 받아들일 것으로 기대되는 형식이지만, 이 계산기는 지원하지 않습니다. (HTTP에서 잘못된 형식이라는 뜻은 아닙니다. 값을 IMF-fixdate로 변환하세요.)
- Date가 비어 있으면 "응답을 받은 시각"에 입력한 시각을 Date 대신 사용합니다. RFC 9110에는 Date가 없는 응답을 받은 수신자가 수신 시각을 기록해 Date로 추가한다고 되어 있습니다. 그 시각도 비어 있으면 Date가 필요한 계산(Expires − Date와 겉보기 나이)을 할 수 없습니다. 브라우저의 현재 시각은 자동으로 사용하지 않습니다. "현재 시각" 버튼을 눌렀을 때만 "확인할 시각" 입력란에 채워집니다.
- 확인할 시각은 응답을 받은 시각보다 이전일 수 없습니다.
그 밖의 Cache-Control 지시어
계산에는 사용하지 않지만, 재사용에 관한 참고로 표시합니다.
- no-store: 저장하면 안 됩니다. private: 공유 캐시는 저장하면 안 됩니다(브라우저는 저장할 수 있습니다).
- no-cache(인수 없음): 신선한 동안에도 검증 없이는 재사용할 수 없습니다.
- must-revalidate: 오래된(stale) 상태가 되면 검증 없이 사용하면 안 됩니다. proxy-revalidate: 같은 의미이지만 프라이빗 캐시에는 적용되지 않습니다.
- public: 저장을 명시적으로 허용합니다.
- immutable(RFC 8246), stale-while-revalidate, stale-if-error(RFC 5861)는 RFC 9111의 범위 밖입니다. 인식은 하지만 계산에는 사용하지 않습니다.
예시
| 입력 | 결과 |
|---|---|
| max-age=3600, Age 없음, 수신 후 1,800초 경과 | 신선도 수명 3,600초, 현재 나이 1,800초, 1,800초 남음(신선함) |
| 같은 조건에서 정확히 3,600초 경과 | 현재 나이 3,600초. 신선도 수명과 같으므로 오래된 상태입니다 |
| max-age=3600, Age=600, 막 수신한 직후 | 현재 나이 600초, 3,000초 남음 |
| s-maxage=60, max-age=3600인 공유 캐시 | 신선도 수명 60초(max-age는 무시됨) |
알아 둘 점
- 표준에 따른 계산입니다. 실제 브라우저나 CDN이 항상 표준에 적힌 대로 동작하는 것은 아닙니다. 강제 새로고침 같은 동작이나 CDN 고유 설정에 따라 결과가 달라질 수 있습니다. 특정 제품의 동작은 보장하지 않습니다.
- 휴리스틱 신선도, 검증, Vary, 요청 지시어, 여러 캐시를 합산하는 경우는 다루지 않습니다.
출처와 확인 내용
다음 내용은 2026년 11월 1일에 표준 전문과 대조해 확인했습니다.
- RFC 9111, "HTTP Caching": https://www.rfc-editor.org/rfc/rfc9111 (1.2.2, 4.2.1, 4.2.3, 5.1, 5.2.2, 5.3절. 신선도 판정
freshness_lifetime > current_age포함) - RFC 9110, "HTTP Semantics": https://www.rfc-editor.org/rfc/rfc9110 (5.6.7, 6.6.1절)
이 계산기는 신선도에 대해서만 해당 절을 따릅니다. 이 계산을 통과했다고 해서 제품이나 서버가 표준을 준수한다는 의미는 아닙니다.
자주 묻는 질문
max-age와 Expires가 모두 있으면 어떻게 되나요?
max-age가 우선하며 Expires는 무시됩니다(RFC 9111, 5.3절).
s-maxage는 브라우저에도 적용되나요?
s-maxage는 공유 캐시용 지시어입니다. 프라이빗 캐시(브라우저)는 사용하지 않습니다.
Age 헤더란 무엇인가요?
응답이 생성되었거나 원본 서버에서 마지막으로 확인된 이후의 경과 시간(초)을 중간 캐시가 기록한 값입니다. 이 계산기는 현재 나이를 구할 때 이 값을 사용합니다.
오래된(stale) 응답은 저절로 사라지거나 갱신되나요?
아니요. stale은 재사용하기 전에 캐시가 확인해야 한다는 뜻일 뿐입니다. 화면이 새로고침되거나 원본 서버의 내용이 바뀌지는 않습니다.
시각은 어떻게 확인하나요?
Unix 타임스탬프 변환기와 Cron 표현식 계산기가 도움이 될 수 있습니다.