忘记或滥用 Cache-Control 标头可能会对您网站的安全性和用户的隐私造成不利影响。
默认情况下,系统始终允许任何类型的缓存缓存资源。不使用或滥用 Cache-Control
标头可能会对您网站的安全性和用户的隐私造成不利影响。
对于您不想公开的个性化回答,我们建议您执行以下操作之一:
- 防止中介缓存资源。设置
Cache-Control: private
。 - 设置适当的次级缓存键。如果响应因 Cookie 而异(Cookie 存储凭据时可能会发生这种情况),请设置
Vary: Cookie
。
请继续阅读,了解为何这很重要,并了解以下内容:
- 您可能不知道的安全和隐私问题
- 不同类型的 HTTP 缓存和常见误解
- 针对高价值网站的建议措施
与缓存相关的安全和隐私风险
存在 Spectre 漏洞的资源存在泄露问题
Spectre 漏洞会允许某个页面读取操作系统进程的内存。这意味着,攻击者可以未经授权访问跨源数据。因此,新型网络浏览器限制了某些功能(例如 SharedArrayBuffer
或高分辨率计时器)在具有跨源隔离的网页中的使用。
新式网络浏览器会强制执行跨源嵌入器政策 (COEP)。这可确保跨源资源要么:
- 无需 Cookie 即可请求的公共资源
- 明确允许通过 CORS 或 CORP 标头跨源共享的资源
COEP 设置无法阻止攻击者利用 Spectre 漏洞。不过,它可确保跨源资源对攻击者没有价值(当浏览器将其作为公共资源加载时),也不允许与攻击者共享(当与 CORP: cross-origin
共享时)。
HTTP 缓存对 Spectre 有何影响?
如果未正确设置 Cache-Control
标头,攻击者可能会执行攻击。例如:
- 系统会缓存具有凭据的资源。
- 攻击者加载跨源隔离的网页。
- 攻击者再次请求资源。
COEP:credentialless
由浏览器设置,因此系统会在不使用 Cookie 的情况下提取资源。不过,缓存可能会改为返回使用凭据的响应。- 然后,攻击者可以使用 Spectre 攻击来读取个性化资源。
虽然在实践中,网络浏览器的 HTTP 缓存不允许发生此类攻击,但浏览器无法直接控制的其他缓存也存在。这可能会导致此攻击成功。
关于 HTTP 缓存的常见误解
1. 资源仅由浏览器缓存
通常有多个层缓存。有些缓存专用于单个用户,有些则可供多位用户使用。有些由服务器控制,有些由用户控制,有些由中介控制。
- 浏览器缓存。这些缓存由单个用户拥有并专用于该用户,在其网络浏览器中实现。它们通过避免多次提取相同的响应来提高性能。
- 本地代理。此类应用可能是由用户安装的,但也可能由中介(例如用户的公司、组织或互联网服务提供商)管理。本地代理通常会为多位用户缓存单个响应,这构成了“公共”缓存。本地代理具有多种角色。
- 源服务器缓存 / CDN。这由服务器控制。源服务器缓存的目标是为多个用户缓存相同的响应,从而减轻源服务器的负载。CDN 的目标与此类服务类似,但分布在全球各地,并分配给离用户最近的一组用户,以缩短延迟时间。

2. SSL 可防止中介缓存 HTTPS 资源
许多用户都会定期使用本地配置的代理,无论是出于访问目的(例如共享计量连接)、病毒检查还是数据泄露防范 (DLP) 目的。中间缓存正在执行 TLS 拦截。
中间缓存通常安装在公司员工的工作站上。网络浏览器配置为信任本地代理的证书。
最终,这些本地代理可能会缓存某些 HTTPS 资源。
HTTP 缓存的运作方式
- 默认情况下,系统默认允许缓存资源。
- 主要缓存键由网址和方法组成。(网址, method)
- 辅助缓存键是
Vary
标头中包含的标头。Vary: Cookie
表示响应依赖于Cookie
。 Cache-Control
标头可提供更精细的控制。
针对您的网站采取以下建议的措施
高价值网站(包括流量较大和与个人身份信息互动的网站)的开发者应立即采取行动来提高安全性。
当对资源的访问权限因 Cookie 而异时,风险最大。如果未采取预防措施,中间缓存可能会针对未使用 Cookie 发出的请求返回使用 Cookie 发出的请求的响应。
我们建议您采取以下某个步骤:
- 防止中介缓存资源。设置
Cache-Control: private
。 - 设置适当的次级缓存键。如果响应因 Cookie 而异(Cookie 存储凭据时可能会发生这种情况),请设置
Vary: Cookie
。
具体而言,请更改默认行为:始终定义 Cache-Control
或 Vary
。
其他注意事项
还有其他类似的攻击会使用 HTTP 缓存,但这些攻击依赖于与跨源隔离不同的机制。例如,Jake Archibald 在 How to win at CORS 中介绍了一些攻击。
一些网络浏览器会拆分其 HTTP 缓存,以便根据是否使用凭据请求资源响应来缓解这些攻击。自 2022 年起,Firefox 会拆分缓存,而 Chrome 和 Safari 不会。 Chrome 未来可能会拆分缓存。请注意,这些攻击与按顶级源拆分不同,但可以互为补充。
即使可以缓解网络浏览器存在的这个问题,但该问题仍会存在于本地代理缓存中。因此,我们仍建议您遵循上述建议。
标题照片由 Unsplash 用户 Ben Pattinson 拍摄。