当源站响应内容 因用户身份而异 时,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 区分缓存版本(慎用,命中率极低) |