使用HTTP头“Cache-Control: public”会带来什么风险?

44

Cache-Control是HTTP/1.1的一个头部信息,它可以指定max-age以及缓存内容是否可以被公开或私有,从而指示中间缓存是否可以缓存该内容。

例如,Ruby on Rails的expires_in()默认使用Cache-Control: private

如果将其设置为public,会有什么风险?如果是public,则额外的地方可以缓存内容,比如代理服务器。

如果网站类似于Amazon.com,但用户是匿名的,那么可能没有太多的隐私问题。如果用户已登录,数据会经过一些位置并可见,那么是否会存在隐私问题呢? 如果那个位置想要做坏事,它其实根本不需要关心 Cache-Control: private

如果这是一个用户可以登录的网站,但网站只搜索健康产品,如鱼油和维生素等。在这种情况下,涉及到的隐私就更少了,因为它不像Amazon.com那样有更多种类的产品(如书籍),用户可能更关心隐私问题。

话虽如此,设定Cache-Control: public的附加优势是什么呢?

2个回答

52

Cache-Control: Public 的问题在于响应可能被缓存并显示给其他用户。如果您有一个显示私人数据的经过身份验证的应用程序,这将是一个问题。一般情况下,您只应该为静态页面或返回相同数据的页面使用public,而不管是谁在发出请求。


1
这似乎表明,即使是搜索结果...或者甚至静态页面也不适合公开,因为两个使用同一台计算机的人可能希望对彼此缓存的网页保持隐私。但我认为浏览器应该有一个设置,可以使缓存始终保持私密,无论 Cache-Control 头部指示什么。 - nonopolarity
1
谢谢。公共缓存是否具有速度/性能优势?如果是的话,我不介意我的图像、字体、CSS等是公共的。 - PKHunter

29
我进一步发现了以下规范:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

public

表示响应可以被任何缓存缓存,即使它原本是不可缓存的或只能在非共享缓存中缓存。(另请参见授权部分14.8,获取更多详细信息。)

private

指示响应消息的全部或部分是面向单个用户的,并且不能被共享缓存缓存。这允许源服务器说明响应的指定部分仅用于一个用户,并且对于其他用户的请求无效。私有(非共享)缓存可以缓存响应。注意:该词的“private”使用仅控制响应可以被缓存的位置,并不能确保消息内容的隐私。

因此,看起来更多是关于“共享缓存”而不是中间缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接