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

Mor*_*eng 115 caching http no-cache

我被告知要防止用户信息泄露,只有"无缓存"的响应是不够的."无商店"也是必要的.

Cache-Control: no-cache, no-store
Run Code Online (Sandbox Code Playgroud)

在阅读本规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html后,我仍然不太清楚为什么.

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

还有其他原因我们需要"无缓存"和"无商店"吗?

Luk*_*ett 70

我必须澄清,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

  • 仍然没有回答这个问题:为什么*HTTP响应中都应该使用*no-cache*和*no-store?是不是"Cache-Control:no-store"足够了? (11认同)
  • Alconja 的回答是问题的答案,特别是。当我回答时,我这样做只是为了澄清一个非常普遍的误解。请投票给另一个答案! (2认同)

Alc*_*nja 46

在某些情况下,即使Cache-Control: no-cache在响应头中,IE6仍将缓存文件.

的W3C状态no-cache:

如果no-cache指令没有指定字段名,那么缓存绝不能使用响应来满足后续请求,而不能成功地与源服务器重新验证.

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

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

浏览器历史记录与普通HTTP缓存之间的一般差异在规范的特定子部分中描述.

  • 当您在浏览器中回放时,IE6不会从缓存中获取页面.它从历史缓冲区中获取页面. (7认同)
  • 在 Chrome 34 (2014) 中,仍然需要设置 `no-store`。否则 Chrome 将在使用后退按钮时显示缓存/缓冲数据。 (2认同)
  • -1因为第一句错误地暗示浏览器缓存具有"no-cache"标头的响应是不正确的.下面的W3C引用清楚地表明情况并非如此; 相反,`no-cache`标头只是意味着必须重新验证响应,然后才能重新使用以响应后续请求. (2认同)

bac*_*h17 16

HTTP 1.1规范:

没有商店:

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

  • @Lèsemajesté通常不是.`no-cache`和`max-age = 0`表示该项目被认为是陈旧的.这意味着必须在提供之前重新验证它.这意味着缓存可以存储文件,然后执行条件请求,服务器可以回复"304 NOT MODIFIED".这显然是一个巨大的优势,因为不需要生成和发送响应的主体.因此,利用这么多(大多数?)缓存**将**存储"无缓存"响应. (4认同)

Htt*_*ort 14

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

  • IE没有缓存

  • Firefox没有商店

这里有我的相关信息:

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

  • 为什么对于Internet Explorer来说,无商店是否足够?你的博客文章没有解释. (5认同)

tho*_*ter 11

no-store在正常情况下不应该是必要的,并且可能损害速度和可用性.它适用于HTTP响应包含非常敏感的信息的情况,它根本不应写入磁盘缓存,而不管为用户创建的负面影响.

这个怎么运作:

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

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

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

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

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

  • 我误解了什么,因为http://www.mnot.net/cache_docs/#CACHE-CONTROL与你相矛盾.它说`no-cache`在不牺牲缓存的所有好处的情况下保持严格的新鲜度,这意味着如果服务器响应304 Not Modified,缓存将被存储并再次使用. (2认同)
  • -1:no-cache并不意味着内容不能被缓存。在 14.9.1 什么是可缓存的规范中,“如果 no-cache 指令未指定字段名称,则在未成功与源服务器重新验证的情况下,缓存不得使用响应来满足后续请求。” (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9。)正如 Chris Shiflett 解释的那样,它“不会阻止缓存系统保留缓存副本。它只是要求缓存系统在将其发送回客户端之前重新验证其缓存。” (HTTP 开发人员手册,第 91 页) (2认同)

jam*_*iss 7

如果缓存系统正确实现了无存储,那么您就不需要无缓存.但并非所有人都这样做 此外,一些浏览器实现无缓存,就像它没有存储一样.因此,虽然不是严格要求,但两者都可能是最安全的.

  • “*但并非所有人都这样做。*”我们需要一个具体的例子来说服我的同事。 (2认同)

woe*_*ens 7

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

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

Cache-Control: no-store, no-cache, must-revalidate
Run Code Online (Sandbox Code Playgroud)

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


bas*_*sim 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似乎是最接近仍然有效的东西.

  • 正如[在相关的SO答案中] [http://stackoverflow.com/a/19145399/543549]建议的那样,你可以按照确切的顺序设置`Cache-Control:no-store,no-cache,must-revalidate`这行得通.但是,这在我们的场景中不起作用,但@bassim在上面提到了这一点.谢谢! (2认同)