【问题标题】:HTTP Caching with Authorization带有授权的 HTTP 缓存
【发布时间】:2021-03-17 21:08:29
【问题描述】:

根据 OAuth 规范,如果来自 Web 服务器的响应包含 Authorization 标头,那么 HTTP 缓存是否没有用处?

Request1 Authorization : AUTHTOKEN
Request2 Authorization : ANOTHERAUTOTOKEN

在这种情况下,给定 HTTP 缓存,第二个请求将返回第一个用户的缓存响应。这对于跨用户通用的内容来说不是问题,但是对于共享缓存为其他用户提供响应来说,这感觉是错误的。

同样,如果我们使用 Vary 标头并根据 Authorization 变化,这意味着我们的缓存将存储每个令牌的缓存副本,这肯定会破坏 HTTP 缓存的目的。浏览器本地缓存(私有)可以正常工作,但这仍然意味着每个用户在每个会话中至少有一次原始请求。

编辑

有问题的服务需要对所有请求进行授权,但是根据我所读到的内容,除非存在 must-revalidate、public 和 s-maxage,否则不应执行来自共享缓存的包含 Authorization 标头的响应.

因此,我的问题是,如果 API 具有通用(所有用户的响应相同)和用户特定响应,那么缓存是否可能?拥有 s-maxage 和公共标头但授权标头意味着如果我正确遵循 RFC,缓存将解析 UserA 对 UserB、UserC 等的响应。

【问题讨论】:

  • 能否请您更新一下您现在对授权资源的缓存方式?

标签: http caching http-caching


【解决方案1】:

http://greenbytes.de/tech/webdav/rfc7234.html#response.cacheability:

“缓存不得存储对任何请求的响应,除非: 请求方法被缓存理解并定义为可缓存,并且 ... Authorization 标头字段(参见 [RFC7235] 的第 4.2 节)不会出现在请求中,如果缓存是共享的,除非响应明确允许,..."

【讨论】:

  • 我很困惑。请参阅w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8 第 1 点。使用缓存设置 s-max-age 与 max-age 一起设置。
  • RFC 2616 已过时。请阅读第 3 节的全部内容,尤其是第 3.2 节。
  • 感谢@Julian。我已经更新了我的问题,使其更具体,因为我仍然不是 100% 清楚它是如何工作的。
  • 授权内容的缓存似乎是我在缓存方面最令人困惑的事情。我有一个特定的问题here 基于收到响应的场景,这增加了更多的混乱。您能否说明在这种情况下如何利用缓存?
  • 有人找到解决方案了吗?
【解决方案2】:

我不确定,但您如何看待具有每个用户唯一校验和值的自定义标头:

x-login-checksum: john_903243482
Vary: x-login-checksum

在我看来,在这种情况下,我们可以在每个用户的会话之间缓存响应。那不行吗?

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 2016-12-27
    • 1970-01-01
    • 2016-02-21
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多