HTTP Expires:0은 모든 브라우저에서 즉시 만료를 보장하지 않는다

기초/HTTP|2023. 5. 30. 11:57

※ StackOverFlow에서 이루어진 2012년의 토론을 번역 및 정리한 글입니다.


https://stackoverflow.com/questions/11357430/http-expires-header-values-0-and-1

 

HTTP Expires header values "0" and "-1"

What is the difference between Expires: 0 and Expires: -1 in the HTTP response header? RFC 2616 defines invalid date formats, especially including the value "0" as already expired. However,

stackoverflow.com

 

질문

HTTP 응답 헤더에서 Expires: 0과 Expires: -1의 차이점은 무엇인가요?

RFC 2616에서는 잘못된(유효하지 않은) 날짜 형식을 정의하며, 특히 "0" 값을 이미 만료된 것으로 간주합니다.

그러나 일부 서버(예: www.google.de)는 Expires: -1을 포함하여 응답합니다.

-1을 사용하는 것이 0을 사용하는 것보다 더 유리한 점이 있나요?

아니면 특정한 HTTP 클라이언트의 호환성을 위해 필요한 경우가 있나요?

 

답변1

Internet Explorer(특히 구버전)에서 잘못된 Expires 헤더를 처리하는 방식 때문에 문제가 발생합니다.

IE는 Trident 레이아웃 엔진WinINET API를 사용하여 HTTP 요청을 처리합니다.
일반적으로 Expires는 HTTP 응답 헤더에서 다음과 같이 지정될 수 있습니다.

Expires: 0

이 때, Expires 값은 응답 헤더가 아니라 콘텐츠의 일부가 되므로, Trident가 먼저 처리한 후 WinINET으로 전달됩니다.

 

또는 HTML 메타 태그에서 지정할 수도 있습니다.

<meta http-equiv="Expires" content="0">

 

이 때 Expires는 응답 헤더의 일부가 아니라 콘텐츠의 일부가 되어, Trident가 이를 처리한 후 WinINET으로 전달하게 됩니다.

 

만약 WinINET이 잘못된 Expires 헤더(유효한 HTTPDATE 값을 포함하지 않는 경우)를 가진 
응답을 다운로드하고 다른 캐싱 지시자가 없다면, WinINET은 해당 문서를 한 시간 전에 만료된 것으로 표시합니다.
반면, Trident는 이러한 논리를 따르지 않습니다. 만약 유효하지 않은 시간이 지정되면, 
Trident는 현재 타임스탬프를 가져와 이를 만료 시간으로 설정합니다. 
Trident는 또한 Pragma: no-cache 지시자를 발견한 경우에도 현재 타임스탬프를 만료 시간으로 사용합니다.
이로 인해, 사용자가 동일한 초(second) 내에 현재 문서로 다시 이동하려고 할 경우, 
기존 캐시 항목의 만료 시간이 잘못 업데이트되어 해당 요청에서는 여전히 유효한 것으로 처리될 수 있습니다. 
하지만 사용자가 새로고침(Refresh) 버튼이나 F5를 누르면 캐시가 무시되며, 404 페이지가 정상적으로 표시됩니다.

 

즉, Expires: 0은 항상 즉시 만료를 보장하지 않으므로 피해야 하며,

대신 과거의 유효한 날짜를 Expires 값으로 설정하는 것이 바람직합니다.

 

예를 들어:

Expires: Thu, 01 Jan 1970 00:00:00 GMT

이러한 방식이 모든 브라우저에서 일관된 동작을 보장할 수 있습니다.

 

 

답변2

Expires: -1
Expires 헤더는 콘텐츠가 만료되어 더 이상 유효하지 않다고 간주되는 시점을 지정합니다.
값 -1은 콘텐츠가 즉시 만료되며, 다시 표시되기 전에 새로 요청해야 한다는 의미입니다.
(http://www.httpwatch.com/httpgallery/headers/)

max-age=0은 캐시(및 사용자 에이전트)에게 응답이 처음부터 만료되었음을 알리고, 따라서 캐시된 복사본을 사용하기 전에 응답을 다시 검증해야 한다고 지시합니다(예: If-Not-Modified 헤더와 함께). 반면, no-cache는 캐시가 복사본을 사용하기 전에 반드시 검증해야 한다고 지시합니다.

 

 

답변3

"-1" 사용은 잘못된 값이며, "0"과 동일하게 처리됩니다. 이 값은 새로 고침을 트리거하지 않아야 합니다.

주의: 일부 브라우저에서는 1시간이 추가되거나 기본 만료 시간을 사용하여 캐시가 처리될 수 있습니다.

 

1. 따라서 올바른 과거 날짜를 설정하는 것이 좋습니다:공식적인 작업에서는 고정된 오래된 날짜 대신 현재 날짜와 시간을 Expires에 지정하는 것이 좋습니다. 그렇지 않으면 Google과 같은 검색 엔진이 사이트를 오래된 것으로 인식하고 상위에 표시되지 않을 수 있습니다.

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
2. PHP 백엔드를 사용하는 경우, 다음과 같이 처리할 수 있습니다:
<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" />

참고: 1시간을 빼는 이유는 예외 상황에 대비하기 위함입니다.

 

요약

  • Expires: 0과 Expires: -1은 구버전 Internet Explorer에서 캐시 동작에 문제를 일으킬 수 있다.
    특히 Expires: 0은 즉시 만료되지 않는 문제를 일으킬 수 있다.
  • Expires: -1은 IE에서는 잘 동작할 수 있지만, 이는 공식 HTTP 표준에 맞지 않으며,
    다른 브라우저에서는 문제가 생길 수 있다.
  • 올바른 해결책Cache-Control 헤더를 사용하여 캐싱을 명확하게 제어하는 것이다.

 

'기초 > HTTP' 카테고리의 다른 글

https, http2  (0) 2021.10.19
세션  (0) 2021.10.19
쿠키  (0) 2021.10.14

댓글()