Cache-Control : max-age = 0과 no-cache의 차이점은 무엇입니까?


답변:


598

나는이 같은 질문을했고 내 검색에서 일부 정보를 찾았습니다 (귀하의 질문은 결과 중 하나였습니다). 여기 내가 결정한 것이 있습니다 ...

Cache-Control헤더 에는 양면이 있습니다 . 한쪽은 웹 서버 (일명 "원본 서버")가 보낼 수있는 곳입니다. 다른 쪽은 브라우저 ( "사용자 에이전트")가 보낼 수있는 곳입니다.


오리진 서버가 보낸 경우

저는 믿습니다 max-age=0단순히 응답에서 부실 캐시 (사용자 에이전트) 알려주는 GET-가서 그들은 있도록 해야한다 응답을 재 검증 (예.와 If-Not-Modified헤더) 캐시 된 복사본을 사용하기 전에, 반면 no-cache그들에게 말한다 해야 캐시 된을 사용하기 전에 재 검증 부. 14.9.1 부터 : 캐시 가능한 것 :

캐시하지 않음

... 캐시는 원래 서버와의 재확인없이 후속 요청을 만족시키기 위해 응답을 사용해서는 안됩니다. 이를 통해 오리진 서버는 클라이언트 요청에 부실 응답을 리턴하도록 구성된 캐시로도 캐싱을 방지 할 수 있습니다.

즉, 캐시는 때로는 부실 응답을 사용하도록 선택할 수 있지만 (그런 다음 Warning헤더 를 추가해야한다고 생각 하지만) no-cache부실 응답을 사용할 수는 없습니다. 아마 당신은 싶어 SHOULD 야구 통계가 페이지에서 발생하는 경우 -revalidate 동작을, 그러나 당신은 싶어 MUST 당신이 전자 상거래 구매에 대한 응답을 생성 한 경우 -revalidate 동작을.

no-cache스토리지를 막을 수 없다고 말했을 때 귀하의 의견은 정확하지만 실제로는를 사용할 때 다른 차이가있을 수 있습니다 no-cache. Cache Control Directives Demystified 페이지를 보았습니다 . (정확성을 보증 할 수는 없습니다)

실제로 IE와 Firefox는 no-cache 지시문을 브라우저가 페이지를 캐시하지 않도록 지시하는 것처럼 처리하기 시작했습니다. 약 1 년 전에이 동작을 관찰하기 시작했습니다. 캐싱을 방지하기 위해이 지시문을 광범위하게 (잘못) 사용하여이 변경이 발생한 것으로 의심됩니다.

...

최근에 "cache-control : no-cache"도 "no-store"지시문처럼 동작하기 시작했습니다.

제쳐두고, Cache-Control: max-age=0, must-revalidate기본적으로와 같은 것을 의미하는 것으로 보입니다 Cache-Control: no-cache. 그래서 어쩌면이 얻을 수있는 방법이다 MUST 의 -revalidate 동작 no-cache의 명백한 마이그레이션을 피하면서, no-cache같은 일을하고에 no-store(예. 아니오 전혀 캐시)?


사용자 에이전트가 보낸 경우

shahkalpesh의 답변 이 사용자 에이전트 측에 적용 된다고 생각 합니다. 13.2.6 명확한 다중 응답을 볼 수도 있습니다 .

사용자 에이전트가 요청 Cache-Control: max-age=0(일명 "end-to-end revalidation")을 보내면 경로를 따라 각 캐시는 캐시 항목 (예 : If-Not-Modified헤더)을 원래 서버로 다시 확인합니다. 응답이 304 (수정되지 않음)이면 캐시 된 엔터티를 사용할 수 있습니다.

반면에 Cache-Control: no-cache( "end-to-end reload") 로 요청을 보내는 것은 재확인되지 않으며 서버 는 응답 할 때 캐시 된 사본을 사용 해서는 안됩니다 .


9
캐시 제어하지 않겠습니까 : max-age = 0, must-revalidate, proxy-revalidate는 no-cache와 정확히 동일합니까?
Didier A.

1
큰 답변, 귀하의 사이트 기사를 읽었지만 페이지가 더 이상 유효하지 않습니다. palisade.plynt.com/issues/2008Jul/cache-control-attributes
Craig London

7
감사합니다, @CraigLondon. 캐시 된 버전으로 리디렉션했습니다.
Michael Krebs

2
must-revalidate의미되지 않습니다 것은와 동일합니다 no-cache또는 no-store. 후자는 캐시를 모두 우회하지만, 전자는 캐시가 항상 최신 상태인지 확인해야하지만 캐시가 여전히 최신 상태이면 캐시를 사용할 수 있으므로 대역폭을 절약 할 수 있다고합니다. 후자는 전체 엔드 투 엔드 다운로드를 항상 강제로 수행하여 불필요한 대역폭을 차지하고 응답을 지연시킵니다.
Patanjali

3
@Patanjali no-cache 적어도 모든 브라우저에서 "캐시를 모두 우회"하거나 "항상 전체 엔드 투 엔드 다운로드를 강제로 수행" 하지는 않습니다 . 사양 은 브라우저가 캐시를 확인해야한다고 말합니다.
Franklin Yu

57

최대 연령 = 0

이것은 새로 고침 을 클릭하는 것과 같습니다. 즉, 최신 사본이 없으면 최신 사본을 제공합니다.

캐시하지 않음

이것은 새로 고침을 클릭하는 동안 Shift 키 를 누르고 있습니다. 즉, 무엇이든 상관없이 모든 것을 다시 실행하십시오.


31
이것은 올바르지 않습니다. shift-refresh는 다음과 유사한 하드 새로 고침입니다.no-store
Michael

3
Firefox 45.0에서 확인되었으며 Chrome 49.0.2623.87m과 같이 Shift + 새로 고침시 "Pragma : no-cache"도 전송합니다.
Cees Timmerman

34

오래된 질문이지만, 다른 사람이 내가 한 것처럼 검색을 통해이 문제를 발견하면 IE9 가이를 사용하여 뒤로 및 앞으로 버튼을 사용할 때 리소스의 동작을 구성하는 것으로 보입니다. 때 최대 사용 기간 = 0 사용되는 뒤로 / 앞으로 눌러에 자원을 볼 때, 브라우저는 최신 버전을 사용합니다. 캐시 를 사용 하지 않으면 리소스를 다시 가져옵니다.

IE9 캐싱에 대한 자세한 내용은이 msdn 캐싱 블로그 게시물 에서 확인할 수 있습니다 .


4
마찬가지로, https 8보다 캐시가 사용되지 않으면 IE 8은 모든 종류의 "다운로드 할 수 없음"문제가 발생합니다. 제안 된 해결책은 때때로 헤더를 max-age = 0으로 변경하는 것을 포함합니다
Robert Christ

28

IE8 및 Firefox 3.5를 사용한 최근 테스트에서 둘 다 RFC 호환 인 것 같습니다. 그러나 원 서버와 "친숙성"이 다릅니다. IE8은와 no-cache같은 의미로 응답을 처리합니다 max-age=0,must-revalidate. 그러나 Firefox 3.5 no-cache는에 해당하는 것으로 보이며 no-store성능 및 대역폭 사용량이 줄어 듭니다.

기본적으로 Squid Cache no-cache는 Firefox 와 같이 헤더 와 함께 아무것도 저장하지 않는 것 같습니다 .

필자 public,max-age=0는 모든 요청에서 최신 정보를 확인하려는 비 민감 리소스 를 설정 하는 것이지만 캐싱의 성능 및 대역폭 이점은 여전히 ​​허용합니다. 동일한 고려 사항을 가진 사용자 별 항목의 경우을 사용하십시오 private,max-age=0.

no-cache일부 브라우저와 인기있는 캐시에 의해 기능적으로 동등한 것으로 보이는 것처럼 보이므로 완전히 사용하지 않는 것이 좋습니다 no-store.

또한 Akamai와 Limelight를 모방하지 마십시오. 이들은 본질적으로 대규모 캐싱 어레이를 주요 비즈니스로 운영하고 전문가 여야하지만 실제로는 네트워크에서 더 많은 데이터를 다운로드하는 데 관심이 있습니다. 에뮬레이션에도 Google이 적합하지 않을 수 있습니다. 그들은 자원에 따라 사용 max-age=0하거나 no-cache무작위로 보인다 .


2
비밀번호로 보호 된 콘텐츠에 대한 최상의 답변. private,max-age=0.
dana

21
최대 연령
    max-age = 0 지시문을 통해 중간 캐시가 강제로 재 활성화되는 경우 
자체 캐시 항목 및 클라이언트가 요청에 자체 유효성 검사기를 제공했습니다. 
제공된 유효성 검사기는 현재 캐시 항목과 함께 저장된 유효성 검사기와 다를 수 있습니다. 
이 경우 캐시는 유효성 검사기를 사용하지 않고 자체 요청을 할 때 유효성 검사기를 사용할 수 있습니다 
의미 투명성에 영향을줍니다. 

    그러나 유효성 검사기를 선택하면 성능에 영향을 줄 수 있습니다. 가장 좋은 방법은
요청시 자체 유효성 검사기를 사용하기위한 중간 캐시. 서버가 응답하는 경우
304 (수정되지 않음)를 사용하면 캐시는 현재 검증 된 사본을 클라이언트에 반환 할 수 있습니다. 
200 (OK) 응답으로. 서버가 새로운 엔터티 및 캐시 유효성 검사기로 응답하면
그러나 중간 캐시는 제공된 유효성 검사기와 반환 된 유효성 검사기를 비교할 수 있습니다. 
강력한 비교 기능을 사용하여 클라이언트의 요청. 클라이언트의 유효성 검사기가
원본 서버와 같으면 중간 캐시가 단순히 304를 반환합니다 (Not 
수정 됨). 그렇지 않으면 200 (OK) 응답으로 새 엔터티를 반환합니다.

    요청에 no-cache 지시문이 포함 된 경우 min-fresh, 
최대 이야기 또는 최대 연령. 

예의 : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

이것을 대답으로 받아들이지 마십시오-나는 그것의 실제 사용법을 이해하기 위해 그것을 읽어야 할 것입니다 :)


12

나는 캐싱 전문가는 아니지만 Mark Nottingham입니다. 그의 캐싱 문서 는 다음과 같습니다 . 그는 참고 문헌 섹션에 훌륭한 링크가 있습니다.

그 문서의 내 독서를 바탕으로, 그것은처럼 보이는 max-age=0캐시가 충분히 가까이 "동시에"수단이 함께 그들이 캐시에 동시 보는 "동시에"에 들어왔다 요청에 캐시 된 응답을 보낼 수 있지만, 할 수 no-cache없는 것 .


좋은 지적이지만 실제로 어떤 브라우저에서도 실제로 그렇게합니까?
Pacerier

3
@Pacerier 나는 이것이 광택, 오징어, 교통 등과 같은 프록시 서버를 캐싱하는 데 더 있다고 생각합니다.
Hank Gay

12

그건 그렇고, 일부 모바일 장치, 특히 iPhone / iPad와 같은 Apple 제품은 캐시 없음, 저장소 없음, 만료 : 0 등의 헤더를 완전히 무시하거나 만료되지 않은 재사용을 강제로 시도 할 수있는 모든 것을 무시할 가치가 있습니다. 양식 페이지.

이로 인해 사용자의 iPad 문제, 양식 프로세스를 통해 도달 한 페이지에서 잠자기 상태 (2/3 단계) 등의 문제를 해결하려고 할 때 두통을 겪지 않았습니다. 캐시 지시문, 그리고 내가 알 수있는 한, 페이지의 가상 스냅 샷을 마지막 상태에서 가져옵니다. 즉, 명시 적으로 말한 것을 무시하고 저장해서는 안되는 페이지를 취하는 것입니다. 실제로 다시 확인하지 않고 저장하면 모든 종류의 이상한 세션 문제가 발생합니다.

누군가가 와서 특히 iPhone 및 ipad에서 세션 오류가 발생하는 이유를 알 수없는 경우에 이것을 추가하고 있습니다.이 분야에서 최악의 범죄자 인 것으로 보입니다.

나는이 문제로 상당히 광범위한 디버거 테스트를 수행했으며 이것이 내 결론이며 장치는 이러한 지시문을 완전히 무시합니다.

정기적으로 사용하더라도 일부 휴대 전화는 Expires : 0을 통해 새 버전을 확인하지 못하고 마지막으로 수정 된 날짜를 확인하여 새 버전을 가져와야하는지 여부를 확인했습니다.

그것은 단순히 일어나지 않으므로 강제로 업데이트를 수행하는 데 필요한 css / js 파일에 쿼리 문자열을 추가하는 것이 어리석은 모바일 장치가 가지고 있지 않은 파일이라고 생각하도록 속입니다. css / js 업데이트의 경우 .css? v = 1, v = 2입니다. 이것은 크게 작동합니다.

그런데 2016 년 현재 기본값을 유지하면 사용자 브라우저는 지속적으로 (사이트에 많은 변경 및 업데이트를 수행함) 해당 파일에서 마지막으로 수정 된 날짜를 확인하지 못하지만 쿼리는 실패합니다. 문자열 메서드는 해당 문제를 해결합니다. 브라우저에서 기본 일반 사용자 기본값을 사용하는 경향이 있고 CSS / JS 등의 캐싱 문제를 인식하지 못하는 클라이언트 및 사무실 직원에게이 사실을 알았습니다. 즉, 대부분의 MSIE / Firefox와 같은 브라우저의 기본값은 지시에 따라 수행하지 않고 변경 사항을 무시하고 마지막으로 수정 한 날짜를 무시하며 Expires : 0을 명시 적으로 설정하더라도 유효성을 검사하지 않습니다.

이것은 좋은 기술 정보가 많은 좋은 스레드 였지만 특히 모바일 장치 에서이 기능에 대한 지원이 얼마나 나쁜지를 주목하는 것이 중요합니다. 몇 달마다 나는 그들이받는 헤더 명령을 따르지 않거나 그 명령을 제대로 인터페이싱하지 못하도록 보호 계층을 추가해야합니다.


css와 js는 프로덕션 시스템에서와 같이 캐싱에 적합한 후보이며 실제로 변경되지 않아야합니다. 그러나 개발 중에 캐싱을 수행하는 것은 번거 롭습니다. 해당 활동에는 빈번한 강제 캐시 플러시가 필요할 수 있습니다. 그러나 서로 다른 환경에서 서로 다른 설정을 사용할 수없는 경우 프로덕션 요구 사항이 우선해야합니다. 많은 개발자가 가질 수있는 소수의 Ctrl-F5 새로 고침에 비해 훨씬 많은 수의 액세스로 대역폭을 절약 할 수 있기 때문입니다. 할 것. 그러나 실시간 데이터를 쿼리하려면 캐시 제어가 제대로 작동해야합니다.
Patanjali

0

(놀랍게도) 언급되지 않은 한 가지는 요청이 max-stale지시문을 사용하여 오래된 데이터를 수락 할 것임을 명시 적으로 나타낼 수 있다는 것입니다 . 이 경우 서버가로 응답 한 max-age=0경우 캐시는 응답이 오래되었다고 생각하고 클라이언트의 요청을 만족시키기 위해이를 사용할 수 있습니다. 반대로, 서버가 전송 하면 캐시가 다시 확인 no-cache되어야하기 때문에 클라이언트 max-stale가 오래된 데이터에 대한 요청 ( ) 을 실제로 처리하지 않습니다 .


-2

차이점은 no-cache (Firefox의 비 저장)는 모든 종류의 캐싱을 방지한다는 것입니다. 보안 컨텐츠가있는 페이지가 디스크에 기록되는 것을 방지하고 뒤로 단추를 사용하여 다시 방문하더라도 항상 업데이트되어야하는 페이지에 유용합니다.

max-age = 0은 캐시 항목이 오래되어 재확인이 필요하지만 캐싱을 막지는 않음을 나타냅니다. 브라우저는 종종 브라우저 세션 당 한 번만 리소스의 유효성을 검사하므로 새 세션에서 사이트를 방문 할 때까지 콘텐츠가 업데이트되지 않을 수 있습니다.

일반적으로 브라우저 캐시가 가득 찼을 때 최신 컨텐츠를위한 공간을 확보하지 않으면 브라우저는 만료 된 캐시 항목을 삭제하지 않습니다. no-store를 사용하면 no-cache를 사용하여 캐시 항목을 명시 적으로 삭제할 수 있습니다.


9
내가 이해하는 한, 'no-cache'는 스토리지를 막지 않아야합니다 ( 'no-store'는 그것을 달성하는 올바른 방법입니다). 특정 브라우저가 'no-cache'를 'no-store'로 해석합니까? 그것은 단순히 '노 캐시'대신 'max-age = 0'이 사용되는 이유를 설명 할 것입니다
rubyruy

3
이것은 잘못이다. 위 참조. 일부 브라우저 / 서버는 no-cache를 no-store로 구현 하도록 선택할 수 있지만 전부는 아닙니다.
Jeremy Kauffman

4
max-age=0캐싱은 허용되지만 리소스를 다시 확인해야 no-store하고 응답을 캐시에 전혀 저장하지 않으려는 경우 에만 안전한 방법을 사용 하십시오. 은 no-cache임의로 사용자 에이전트 벤더 및 버전 번호 및 전송 프로토콜에 따라 이들 중 어느 하나를 의미하는 것으로 지정된다.
Mikko Rantalainen

Firefox는 언제 스토어를 사용하지 않습니까?
Cees Timmerman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.