【发布时间】:2017-11-24 00:31:46
【问题描述】:
我的客户端在向我的服务器发出无害请求后被注销。我控制了两端,经过大量调试,我发现发生了以下情况:
- 客户端发送带有正确授权标头的请求。
- 服务器以
304 Not Modified响应,没有任何授权标头。 - 浏览器提供完整的响应,包括在其缓存中找到的一个过时的授权标头。
- 从现在开始,客户端使用过时的授权并被踢出。
据我所知,the browser must not cache any request containing Authorization。尽管如此,
chrome://view-http-cache/http://localhost:10080/api/SearchHost
表演
HTTP/1.1 200 OK
Date: Thu, 23 Nov 2017 23:50:16 GMT
Vary: origin, accept-encoding, authorization, x-role
Cache-Control: must-revalidate
Server: 171123_073418-d8d7cb0 =
x-delay-seconds: 3
Authorization: Wl6pPirDLQqWqYv
Expires: Thu, 01 Jan 1970 00:00:00 GMT
ETag: "zUxy1pv3CQ3IYTFlBg3Z3vYovg3zSw2L"
Content-Encoding: gzip
Content-Type: application/json;charset=utf-8
Content-Length: 255
有趣的服务器标头用一些内部信息替换了 Jetty 服务器标头(出于安全原因不应提供) - 忽略它。这就是 curl 所说的:
< HTTP/1.1 304 Not Modified
< Date: Thu, 23 Nov 2017 23:58:18 GMT
< Vary: origin, accept-encoding, authorization, x-role
< Cache-Control: must-revalidate
< Server: 171123_073418-d8d7cb0 =
< ETag: "zUxy1pv3CQ3IYTFlBg3Z3vYovg3zSw2L"
< x-delay-seconds: 3
< Content-Encoding: gzip
这也发生在 Firefox 中,尽管我目前无法重现它。 The RFC 继续,看起来上面链接的答案并不准确:
除非响应中存在允许存储此类响应的缓存指令
看起来响应是可缓存的。没关系,我确实希望 内容被缓存,但我不希望从缓存中提供 Authorization 标头。这可能吗?
解释我的问题
我的服务器过去只在响应登录请求时发送Authorization 标头。这曾经可以正常工作,但新的要求会带来问题。
我们的网站允许用户任意长时间保持登录状态(我们不从事敏感业务)。我们正在更改授权令牌的格式,我们不想因此而强制所有用户重新登录。因此,我让服务器在看到过时但有效的授权令牌时发送更新的授权令牌。所以现在任何响应都可能包含授权令牌,但大多数都没有。
浏览器缓存将仍然有效的响应与过时的授权令牌相结合。
作为一种解决方法,当存在授权令牌时,我让服务器不发送etag。它有效,但我更喜欢更清洁的解决方案。
【问题讨论】:
-
如果链接的答案让你相信浏览器不能缓存任何包含授权的东西,那么它就是误导。实际上恰恰相反,这意味着 Chrome 的缓存按部就班地完成了它的工作。我怀疑你已经想通了。您只需要更多信息来设计解决方案,对吧?
-
@Rei 对,我对链接的答案感到困惑。我也对 RFC 感到困惑,因为这种行为对我来说毫无意义。有关问题,请参阅问题更新。
标签: caching browser http-headers browser-cache