【问题标题】:HTTP Caching for authenticated REST apis经过身份验证的 REST API 的 HTTP 缓存
【发布时间】:2017-03-02 18:44:00
【问题描述】:

我目前正在构建一个 REST API。无论谁访问资源,我创建的许多资源都将始终相同。少数没有的会有Vary: Authorization 标头。

有两个例外:

  1. 如果您未通过身份验证,您将收到 401 响应。
  2. 对于某些您无权访问的资源,您可能会收到 403 响应。

我的问题是,在这种情况下是否仍然可以正确设置缓存。特别是,我想使用反向代理,如 nginx、varnish 或 haproxy 来卸载主要服务。

这个问题有没有优雅的解决方案?

【问题讨论】:

  • 不同资源的 URI 是否与不匹配的资源匹配?例如您是否有一个 /user/joe 可以返回公共信息、仅对某些用户可见的信息和仅对 Joe 可见的信息?
  • @Nicholas 也许我不是很清楚,但对于大多数资源来说,情况不是,对于那些这样做的人,他们将拥有Vary: Authorization。我只对不是那样的资源感兴趣。那些总是对 200 OK 有相同的响应,或者它们是 401/403。

标签: rest api http caching


【解决方案1】:

Vary: Authorization 是不必要的;对带有授权的请求的响应是自动私有的,不会被共享缓存缓存。

您可以发送Cache-Control: public 来覆盖它;可以使用普通规则缓存响应。

但是,如果您希望这些响应保持经过身份验证,则需要强制执行身份验证。您也可以通过发送Cache-Control: no-cache 来做到这一点,这将强制缓存在提供存储的响应之前检查源。

如果你只是想让你的反向代理(例如 Varnish、nginx)做缓存,它很可能有一种配置方式来对“边缘”施加身份验证,服务当请求具有适当的身份验证时来自缓存的响应。详情请查看其文档。

【讨论】:

  • 谢谢!直接从源头得到答案总是很棒:)
  • Cache-Control: no-cache 如何帮助实施身份验证?是不是因为它会尝试与服务器重新验证缓存的项目,这意味着它必须发送一个请求,并且该请求需要经过身份验证才能从服务器获得 304 ?
猜你喜欢
  • 2014-06-14
  • 2013-01-27
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2016-10-28
  • 2019-09-25
  • 1970-01-01
相关资源
最近更新 更多