netnr 2026-04-01

当源站响应内容 因用户身份而异 时,CDN 会将首个用户的响应缓存并分发给后续所有用户,导致数据泄露或内容错乱。

登录用户 A → 请求 /123.json → CDN MISS → 回源 → 缓存响应 A
匿名用户 B → 请求 /123.json → CDN HIT  → 直接拿到用户 A 的内容 ❌

若资源对所有用户完全一致(纯公共资源),则不存在此问题。

情形 是否安全 说明
响应内容与用户无关 ✅ 安全 可放心使用 public 缓存
响应内容因登录状态不同 ❌ 不安全 必须处理
响应包含用户私有数据 ❌ 不安全 必须处理

方案一:Cache-Control: private

禁止 CDN 缓存,仅允许浏览器本地缓存。

// 含用户状态的响应
Response.Headers["Cache-Control"] = "private, no-store";

// 纯公共资源
Response.Headers["Cache-Control"] = "public, s-maxage=86400";

适用场景: 该资源访问量不大,可接受每次回源。

方案二:分离路由

将公共资源与用户资源拆分到不同路径,CDN 仅缓存公共路径。

/public/{id}.json  → Cache-Control: public   → CDN 缓存
/user/{id}.json    → Cache-Control: private  → 始终回源

适用场景: 架构允许路由拆分。


关键 HTTP 头速查

头 / 指令 作用
Cache-Control: public 允许 CDN 缓存并共享
Cache-Control: private 仅浏览器可缓存,CDN 不得缓存
Cache-Control: no-store 完全禁止缓存
s-maxage=N 单独控制 CDN 缓存时长(覆盖 maxage
Vary: Cookie 按 Cookie 区分缓存版本(慎用,命中率极低)
登录写评论