首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从缓存中为过时的授权头服务的浏览器

从缓存中为过时的授权头服务的浏览器
EN

Stack Overflow用户
提问于 2017-11-24 00:31:46
回答 2查看 1.9K关注 0票数 3

我正经历着我的客户在向我的服务器提出一个无辜的请求后被注销。我控制两端,经过大量调试后,我发现发生了以下情况:

  • 客户端发送带有正确授权头的请求。
  • 服务器使用没有任何授权头的304 Not Modified进行响应。
  • 浏览器提供完整的响应,包括缓存中找到的过时的授权头。
  • 从现在开始,客户端使用过时的授权并被踢出。

据我所知,浏览器不能缓存任何包含授权的请求。尽管如此,

代码语言:javascript
运行
复制
chrome://view-http-cache/http://localhost:10080/api/SearchHost

显示

代码语言:javascript
运行
复制
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服务器头(出于安全原因不应该使用它)--忽略它。卷曲是这么说的:

代码语言:javascript
运行
复制
< 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中,尽管我目前无法复制它。RFC继续说,看起来上面链接的答案并不准确:

除非响应中存在允许存储此类响应的缓存指令。

看起来响应是可缓存的。这很好,我确实希望缓存内容,但我不希望从缓存中为授权头提供服务。这个是可能的吗?

解释我的问题

我的服务器过去只在响应登录请求时才发送Authorization头。这过去工作得很好,新的要求带来了问题。

我们的网站允许用户任意长时间登录(我们不做敏感业务)。我们正在更改授权令牌的格式,因此我们不希望强迫所有用户再次登录。因此,每当服务器看到过时但有效的授权令牌时,它就会发送更新的授权令牌。因此,现在任何响应都可能包含授权令牌,但大多数响应不包含授权令牌。

浏览器缓存结合了仍然有效的响应和过时的授权令牌。

作为解决办法,我让服务器在出现授权令牌时不发送etag。很管用,但我更喜欢一些更干净的解决方案。

EN

Stack Overflow用户

发布于 2017-12-10 23:54:54

我的当前解决方案是在每个响应中发送一个授权头;当不需要授权时,使用-的占位符值。

占位符值显然是没有意义的,客户端知道它,并且很高兴地忽略它。

这个解决方案很难看,因为它为每个响应增加了大约20个字节,但这仍然比偶尔重新发送整个响应内容要好,就像我在问题中提到的方法一样。此外,对于HTTP/2,它将是免费的。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47464893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档