캐시 없음과 재확인의 차이점


179

RFC 2616에서

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

캐시하지 않음

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

따라서 상담원이 모든 응답 을 다시 확인하도록 지시합니다 .

이것을 다음과 비교

재확인

캐시가 수신 한 응답에 must-revalidate 지시문이있는 경우, 해당 캐시는 원래 서버로 먼저 재확인하지 않고 후속 요청에 응답 할 수 없게 된 후에 항목을 사용해서는 안됩니다.

따라서 에이전트가 오래된 응답 을 다시 확인하도록 지시합니다 .

특히 no-cache, 이것이 사용자 에이전트가 실제로이 지시문을 경험적으로 처리하는 방법입니까?

의 핵심 기능 no-cache이 있는지 must-revalidate와는 max-age?

이 의견을보십시오 :

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

캐시하지 않음

이 지시문은 브라우저가 페이지를 캐시하지 않도록 지시하는 것처럼 들리지만 미묘한 차이가 있습니다. RFC에 따르면 "no-cache"지시문은 캐시에서 페이지를 제공하기 전에 서버에서 서버를 다시 활성화해야한다는 것을 브라우저에 지시합니다. 재확인은 애플리케이션이 대역폭을 절약 할 수있는 깔끔한 기술입니다. 브라우저가 캐시 한 페이지가 변경되지 않은 경우 서버는 브라우저에 신호를 보내면 페이지가 캐시에서 표시됩니다. 따라서 브라우저 (최소한 이론적으로)는 페이지를 캐시에 저장하지만 서버와 다시 확인한 후에 만 ​​페이지를 표시합니다. 실제로 IE와 Firefox는 no-cache 지시문을 브라우저가 페이지를 캐시하지 않도록 지시하는 것처럼 처리하기 시작했습니다. 약 1 년 전에이 동작을 관찰하기 시작했습니다.

누구든지 이것에 대해 더 공식적인 것을 얻었습니까?

최신 정보

must-revalidate 지시문은 표현에 대한 요청의 유효성을 검증하지 못하면 자동으로 실행되지 않는 금융 거래와 같은 부정확 한 조작이 발생할 수있는 경우에만 서버에서 사용해야합니다.

그것은 지금까지 결코 생각하지 않은 것입니다. RFC는 가볍게 검토해야한다는 말을하고 있습니다. 문제는 웹 서비스를 사용하면 부정적인 견해를 가지고 알 수없는 클라이언트 앱에 대해 최악의 상황을 가정해야한다는 것입니다. 오래된 리소스는 문제를 일으킬 가능성이 있습니다.

그리고 Last-Modified 또는 ETags없이 방금 고려한 사항은 브라우저가 전체 리소스를 다시 가져올 수만 있습니다. 그러나 ETag를 사용하면 Chrome이 적어도 모든 요청에 ​​대해 다시 확인되는 것으로 나타났습니다. 요청에 어쨌든 '항상 재확인'을 유발하는 다른 헤더가 포함되어 있지 않으면 이러한 지시문이 모두 불명확하거나 적어도 이름이 잘못 지정되어 제대로 재확인 할 수 없기 때문입니다.

마지막 요점을 더 명확하게하고 싶습니다. must-revalidateETag 또는 Last-Modified를 설정 하지 않고 설정 만하면 에이전트는 비교할 서버로 보낼 내용이 없으므로 컨텐츠를 다시 가져올 수 있습니다.

그러나 경험적 테스트에 따르면 ETag 또는 수정 된 헤더 데이터가 응답에 포함되면 에이전트는 must-revalidate헤더 의 존재 여부에 관계없이 항상 다시 확인 됩니다.

의 요점은 그래서 must-revalidate당신이 평생 / 연령을 설정 한 경우 경우에만 따라서 일어날 수있는 오래된가는 때 '바이 패스 캐시'를 강제하는 것입니다 must-revalidate없음 나이 또는 다른 헤더와 응답에 설정되어, 효과적으로에 해당되고 no-cache이후 응답은 즉시 무효로 간주됩니다.

-마지막으로 길리의 답변을 표시하겠습니다!


따라서 이론적으로 그 차이는 validate-alwaysvalidate-if-stale 이지만 실제로는 no-cache는 인용 한 주석이 절대로 유효하지 않다고 말한 것처럼 특정 브라우저에서 처리됩니다 ... 따라서 사용할 브라우저를 선택해야합니다. 실제로 실제로 어떤 캐싱 동작을 달성하고자하는지에 따라…
CBroe

greenbytes.de/tech/webdav/…를 읽고 이것이 당신을 위해 무엇을 설명하는지 확인하십시오.
Julian Reschke

가능한 중복 복제 Cache-Control의 차이점
Joe

이 의사 결정 트리에서 답변을 확인하십시오 stackoverflow.com/a/49925190/3748498
pravdomil

답변:


191

나는 그것이 must-revalidate의미 하는 것을 믿는다 :

캐시가 만료되면 무효 응답이 허용된다고 말하더라도 무효 응답을 사용자에게 반환하지 않습니다.

반면에 no-cache:

must-revalidate 또한 응답이 바로 무효화됩니다.

응답을 10 초 동안 캐시 할 수 있으면 10 초 후에 must-revalidate시작되고 0 초 후에는 no-cache암시 must-revalidate됩니다.

적어도 그것은 내 해석입니다.


2
그것이 내가 지금 보는 방법입니다. 흥미로운 부분은 ETag 또는 Last-Modified가없는 마지막 파라입니다. 에이전트는 캐시에있는 것을 검증하는 데 사용할 것이 없으며 전체 페이로드를 다시 다운로드해야합니다. 따라서 RFC에 "재확인"이라고 표시되면 다시 가져 오는 것입니다.
Luke Puplett

44
또한 의미 max-age=0, must-revalidateno-cache동일
Anshul

5
@Anshul, 처음에는 'max-age = 0, must-revalidate 및 no-cache는 동일하다'고 생각했지만 Jeffrey Fox의 대답을 보면 옳지 않다는 것을 알 수 있습니다.
Don Hatch

2
@Anshul 아니, must-revalidate하고 no-cache신선한 응답을 다른 의미를 가지고 : 캐시 된 응답 (즉, 응답이 만료되지 않은), 신선한 경우 must-revalidate프록시를 만들 것입니다, 바로 서버와 재 검증없이 봉사와 반면에 no-cache프록시를 재 검증해야한다 신선도에 관계없이 캐시 된 응답. 출처 : "HTTP-Definitive Guide", 182-183 페이지.
Matthias Braun

8
@MatthiasBraun 아, 혼란의 근원을 볼 수 있습니다. 내가 작성해야 할 수 있음 no-cachemax-age=0, must-revalidate동일
Anshul

24

max-age=0, must-revalidateno-cache정확하게 동일하지 않다. 를 사용 must-revalidate하면 서버가 유효성 검사 요청에 응답하지 않으면 브라우저 / 프록시는 504 오류를 반환합니다. 을 사용하면 no-cache캐시 된 콘텐츠 만 표시되며 사용자가 선호하는 것일 수 있습니다 (아무것도없는 것보다 낫습니다). 이것이 must-revalidate중요한 거래만을위한 이유 입니다.


10
당신의 no-cache해석이 확실하지 않습니다 . 로부터 RFC 7234 은 "노 캐시"응답 지시어는 응답이 원본 서버에 성공적으로 검증없이 계속되는 요구를 충족하는 데 사용 할 수 없 습니 다. 따라서 원본 서버는 오래된 응답을 보내도록 구성된 캐시에 의해서도 캐시가 캐시를 사용하여 요청을 충족시키지 못하도록 캐시를 사용하지 못하게 할 수 있습니다. 에 대한 제한과 유사한이 소리must-revalidate
Anshul

9
Jeffrey는 구현이 자신이 설명한 방식대로 작동한다는 증거를 가지고 있습니까?
OrangeDog

이 답변은 proxy / lb 서버에 적합하다고 생각합니다. 그러나 실제로 브라우저는 504를 반환하지 않습니다.
Yann Dìnendal

그래서 must-validate수단must-refresh
Simon_Weaver

15

약 제프리 폭스의 해석과 함께 no-cache, 내가 크롬 52.0.2743.116 m에서 시험 한 결과 쇼 no-cache와 같은 행동이 must-revalidate그들 모두는 것, NOT 서버에 연결할 때 로컬 캐시를 사용하고, 그들은 모두 탭 브라우저의 뒤로 동안 캐시를 사용을 서버에 연결할 수없는 경우 / Forward 단추. 위와 같이, 적어도 구현에서는 max-age=0, must-revalidate동일 하다고 생각 no-cache합니다.


서버를 다시 확인할 수있을 때 Chrome에서 로컬 캐시를 사용하나요? (즉 "If-Modified-Since"). 두 경우 모두?
Rich

-2

max-age=0, must-revalidate와 사이에 차이점이 있다고 생각합니다 no-cache.

must-revalidate경우 클라이언트는 If-Modified-Since요청 을 보내고 캐시에서 응답을 제공 할 수 304 Not Modified있습니다.

no-cache경우 클라이언트는 응답을 캐시하지 않아야하므로 사용하지 않아야합니다 If-Modified-Since.


6
그러나 no-cache의미하지 않는다 no-store-과 no-cache자원이 여전히 클라이언트에 캐시 할 수있다; 사용하기 전에 다시 확인해야합니까?
Aron

4
당신은 conflating no-cache하고 no-store있습니다. no-cache자원을 재확인 해야 함을 의미합니다 . 재확인 에는 If-None-Match및과 같은 조건부 요청을 사용하는 옵션이 포함되어 있습니다 If-Modified-Since.
Jules Sam. Randolph

1
@ JulesRandolph : 당신이 옳을 수도 있습니다. 테스트 / 데모가 있습니까? 이 q에 대한 모든 상충되는 증거가없는 주장은 실망 스럽다. 받아 들여진 대답조차도 "적어도 내 해석이다"라고 말합니다. 시간이 있으면 테스트 베드를 설치하고 여기에 게시 할 수 있습니다.
Rich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.