带请求授权的HTTP缓存

时间:2015-08-22 13:30:42

标签: http caching authorization varnish http-caching

是否存在HTTP缓存和请求授权之间的交互标准?

让我们想象一下:网站的不同网址受基于角色的授权系统的保护。如何将内容缓存与请求授权相结合?是否有任何RFC声称的方法?

  1. FoS描述了代理缓存向已调用的GET URL发送HEAD请求以检查可访问性时的方法。它似乎与HTTP RFC不冲突。在RFC 7231 HEAD目的:

      

    此方法可用于获取     关于所选表示的元数据而不转移     表示数据,通常用于测试超文本链接     有效性,可访问性和最近的修改。

    看起来很有效,但描述不完整。根据RFC服务器should send Cache-Control: no-cache,以防止链中的其他缓存进行缓存。 该架构看起来像耦合 - 它是非RFC行为,因此应该手动配置。

  2. 另一方面,似乎问题可以通过Cache-Control: no-cache指令和条件请求RFC 7232来解决。这种方法不像前一种那样有效:每次都应该验证前提条件。它应该与当前代理引擎一起使用的主要优点。我没有发现与RFC存在重大矛盾,但IMO条件请求不是为请求授权而设计的。

  3. 也可以应用一些黑客攻击。 HTTP是否为这种情况定义了机制?或者至少是广泛传播的做法?

1 个答案:

答案 0 :(得分:1)

默认情况下,在Varnish中只缓存没有“Cookie”的GET和HEAD请求 - 或“授权”-Header。这被烘焙到默认的VCL中。在Ubuntu上:/etc/varnish/default.vcl:

# sub vcl_recv {
#     ...
#     if (req.request != "GET" && req.request != "HEAD") {
#         /* We only deal with GET and HEAD by default */
#         return (pass);
#     }
#     if (req.http.Authorization || req.http.Cookie) {
#         /* Not cacheable by default */
#         return (pass);
#     }
#     return (lookup);
# }