为什么在HTTP响应中应该使用no-cache和no-store?

时间:2009-05-15 03:12:20

标签: http caching no-cache

我被告知要防止用户信息泄露,只有“no-cache”响应是不够的。 “没有商店”也是必要的。

Cache-Control: no-cache, no-store

在阅读此规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html之后,我仍然不太确定原因。

我目前的理解是它只适用于中间缓存服务器。即使“无缓存”作为响应,中间缓存服务器仍然可以将内容保存到非易失性存储。中间缓存服务器将决定是否使用保存的内容进行后续请求。但是,如果响应中存在“no-store”,则中间缓存服务器不应存储内容。所以,它更安全。

还有其他原因我们需要“no-cache”和“no-store”吗?

11 个答案:

答案 0 :(得分:68)

我必须澄清no-cache并不意味着不缓存。事实上,它意味着“在使用任何缓存的响应之前,在每次请求时都使用服务器重新验证”。

另一方面,

must-revalidate只需要在资源被视为过时时重新验证。

如果服务器说资源仍然有效,则缓存可以使用其表示进行响应,从而减少服务器重新发送整个资源的需要。

no-store实际上是完整的不缓存指令,旨在防止将表示存储在任何形式的缓存中。

我说什么,但请注意RFC 2616 HTTP规范中的内容:

  

历史缓冲区可以将这些响应存储为正常操作的一部分

但是,从更新的RFC 7234 HTTP规范中可以省略这可能是为了让no-store变得更强,请参阅:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5

答案 1 :(得分:45)

在某些情况下,即使Cache-Control: no-cache位于响应标头中,IE6仍会缓存文件。

W3C states of no-cache

  

如果no-cache指令没有   指定字段名称,然后指定缓存   绝不能使用响应来满足   后续请求没有成功   使用原始服务器重新验证。

在我的应用程序中,如果你访问了一个带有no-cache标题的页面,然后注销然后在你的浏览器中回来,IE6仍会从缓存中获取页面(没有新的/验证请求到服务器)。添加no-store标题会阻止它这样做。但是如果你按照他们的说法接受W3C,实际上没有办法控制这种行为:

  

历史记录缓冲区可以将这些响应存储为正常操作的一部分。

描述了浏览器历史记录与普通HTTP缓存之间的一般差异in a specific sub-section of the spec

答案 2 :(得分:16)

来自HTTP 1.1 specification

  

否店内

     

no-store 指令的目的是防止无意中释放或保留敏感信息(例如,在备份磁带上)。 no-store指令适用于整个消息,可以在响应中或在请求中发送。如果在请求中发送,则缓存不得存储此请求的任何部分或对其的任何响应。如果在响应中发送,则缓存不得存储此响应的任何部分或引发它的请求。该指令适用于非共享和共享缓存。在此上下文中“绝不能存储”意味着缓存不得故意将信息存储在非易失性存储中,并且必须尽力尝试在转发后尽快从易失性存储中删除信息。   即使该指令与响应相关联,用户也可以在缓存系统之外明确地存储这样的响应(例如,使用“另存为”对话框)。历史缓冲区可以将这些响应存储为其正常操作的一部分。   该指令的目的是满足某些用户和服务作者的声明要求,这些用户和服务作者担心通过意外访问缓存数据结构而意外释放信息。虽然在某些情况下使用此指令可能会改善隐私,但我们提醒说,它绝不是确保隐私的可靠或充分机制。特别是,恶意或受损的缓存可能无法识别或遵守此指令,通信网络可能容易被窃听。

答案 3 :(得分:12)

如果您想要阻止所有缓存(例如,在使用后退按钮时强制重新加载),您需要:

  • IE的无缓存

  • Firefox无商店

这里有关于此的信息:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

答案 4 :(得分:10)

在正常情况下,{p> no-store不一定是必要的,并且可能会损害速度和可用性。它适用于HTTP响应包含非常敏感的信息的情况,根本不应将其写入磁盘缓存,无论为用户创建的负面影响如何。

工作原理:

  • 通常,即使浏览器等用户代理确定不应缓存响应,它仍可能出于用户代理内部原因将其存储到磁盘缓存中。此版本可用于“查看源”,“返回”,“页面信息”等功能,其中用户不一定再次请求该页面,但浏览器不认为它是新的页面视图并且提供用户当前正在查看的相同版本是有意义的。

  • 使用no-store会阻止存储该响应,但这可能会影响浏览器提供“查看源”,“返回”,“页面信息”等功能,而无需创建新的,单独的请求服务器,这是不受欢迎的。换句话说,用户可以尝试查看源,如果浏览器没有将其保存在内存中,他们将被告知这是不可能的,或者它将导致对服务器的新请求。因此,no-store只应在确保内容未存储在缓存中的重要性超过这些功能的不良用户体验无法正常或快速运行时使用。

  

我目前的理解是它只适用于中间缓存服务器。即使“无缓存”作为响应,中间缓存服务器仍然可以将内容保存到非易失性存储。

这是不正确的。与HTTP 1.1兼容的中间缓存服务器将遵循no-cachemust-revalidate指令,确保不缓存内容。使用这些说明将确保任何中间缓存都不缓存响应,并确保将所有后续请求发送回原始服务器。

如果中间缓存服务器不支持HTTP 1.1,那么您将需要使用Pragma: no-cache并希望获得最佳效果。请注意,如果它不支持HTTP 1.1,则无论如何no-store都无关紧要。

答案 5 :(得分:7)

如果缓存系统正确实现了no-store,那么就不需要no-cache。但并非所有人都这样做此外,一些浏览器实现无缓存,就像它没有存储一样。因此,虽然不是严格要求,但最好包括两者。

答案 6 :(得分:7)

对于chrome,no-cache用于在重新访问时重新加载页面,但如果你回到历史记录(后退按钮),它仍会缓存它。要重新加载历史记录页面,请使用no-store。 IE需要重新验证才能在所有场合工作。

所以只是为了避免我总是使用的所有错误和误解

Cache-Control: no-store, no-cache, must-revalidate

如果我想确保它重新加载。

答案 7 :(得分:6)

请注意,尝试下载通过https提供的文件以及发送Cache-Control: no-cachePragma: no-cache标头的服务器时,从版本5到8的Internet Explorer都会出错。

请参阅http://support.microsoft.com/kb/812935/en-us

使用Cache-Control: no-storePragma: private似乎是最接近仍然有效的事情。

答案 8 :(得分:2)

最初我们在很多年前使用过no-cache并且在使用某些浏览器时遇到了一些陈旧内容的问题......不幸的是,不记得这些细节。

我们刚刚决定使用无商店。从那时起,任何浏览器或中介都没有回头看过任何陈旧内容的问题。

这个空间当然主要是实现的现实与各种RFC中编写的内容。特别是许多代理人倾向于认为他们通过用自己的政策取代他们应该遵循的政策来更好地“提高绩效”。

答案 9 :(得分:1)

只是为了让事情变得更糟,在某些情况下,不能使用no-cache,但是no-store可以:

http://faindu.wordpress.com/2008/04/18/ie7-ssl-xml-flex-error-2032-stream-error/

答案 10 :(得分:0)

OWASP对此进行了讨论:

  

cache-control指令之间的区别是:no-cache和no-store?

     

响应中的no-cache指令指示不得将响应用于响应后续请求,即,高速缓存不得显示在标头中设置了该指令的响应,而必须让服务器为请求提供服务。 no-cache指令可以包含一些字段名称;在这种情况下,可以从缓存中显示响应,但应从服务器提供服务的指定字段名称除外。 no-store指令适用于整个消息,它指示高速缓存不得存储响应的任何部分或任何要求它的请求。

     

这些指令对我完全安全吗?

     

不。但通常,除了Expires:0(或具有足够回溯性的GMT日期(例如UNIX时期))之外,还应同时使用Cache-Control:no-cache,no-store和Pragma:no-cache。即使设置了上述缓存控制指令,非pdf内容类型(例如pdf,word文档,excel电子表格等)也经常会被缓存(尽管这会因版本和使用的其他因素而有所不同,并且必须重新验证,pre-check = 0,post-check实际上,由于浏览器的怪癖和HTTP实现,在某些情况下,= 0,max-age = 0和s-maxage = 0有时至少会导致关闭浏览器时删除文件。同样,“自动完成”功能允许浏览器缓存用户在表单输入字段中键入的内容。为此,表单标签或单个输入标签应包含“ Autocomplete =“ Off”'属性。但是,应注意,此属性是非标准的(尽管主要浏览器支持此属性),因此它将破坏XHTML验证。

来源here