
一、概念先分清
“缓存”这个词在 WAF 和 CDN 语境下含义不同:
- CDN 缓存:缓存的是内容——图片、CSS、JS 文件本身,用户直接拿到
- WAF 缓存:缓存的是判定结果——”这个 IP 是恶意的””这条规则刚刚匹配过”,用于加速决策
二、WAF 层的”缓存”是什么
2.1 判定结果缓存
WAF 检测每个请求都要跑一遍规则。如果同一个 IP 在短时间内发了大量请求,每次都完整检测就浪费性能。所以 WAF 会缓存判定结果:
优化前:
请求 1 → 完整检测(20ms) → 判定恶意
请求 2 → 完整检测(20ms) → 判定恶意
请求 3 → 完整检测(20ms) → 判定恶意
... 1000 次 → 累计 20 秒
优化后:
请求 1 → 完整检测 → 判定恶意 → 写入缓存
请求 2 → 命中缓存(0.1ms) → 直接拦截
请求 3 → 命中缓存(0.1ms) → 直接拦截
... 1000 次 → 累计 0.3 秒
2.2 信誉缓存
IP 信誉、JA3 指纹、Bot 判定这些结果都会被缓存一段时间(通常几分钟到几小时),避免重复计算。
2.3 静态资源直通
部分 WAF 对静态资源(.jpg/.css/.js)做特殊处理:只做轻量检测或直接放行,把性能留给动态请求。
三、CDN 缓存的作用
CDN 缓存是真正的”内容缓存”,它决定了一个请求是否需要回到源站:
CDN 缓存命中:
用户 → CDN 节点(有缓存)→ 直接返回 ✅
完全不消耗源站资源,延迟极低
CDN 缓存未命中:
用户 → CDN 节点(无缓存)→ 回源取内容 → 缓存 → 返回
首次稍慢,后续命中
3.1 常见缓存规则
| 资源类型 | 缓存时长 | 说明 |
|---|---|---|
| 图片/视频 | 30 天 | 带版本号或 hash |
| CSS/JS | 7-30 天 | 文件名带 hash 最佳 |
| HTML 页面 | 0-5 分钟 | 动态内容慎缓存 |
| API 接口 | 0(不缓存) | 除非是纯查询 |
| 字体文件 | 30 天 | 很少变动 |
四、两者的协作关系
标准链路是”WAF 先安检,CDN 后缓存”:
用户请求
↓
[WAF 层] 安全检查:SQL注入?CC?Bot?
↓ 放行
[CDN 层] 缓存查找:有缓存吗?
↓ 命中 ↓ 未命中
直接返回 回源取内容 → 缓存 → 返回
这个顺序的好处是:恶意请求在进入缓存层之前就被拦掉,不会污染缓存,也不会消耗 CDN 流量。
五、配置建议
5.1 静态资源
├─ 交给 CDN 长缓存(7-30 天)
├─ WAF 对静态资源只做轻量检测
├─ 文件名带 hash 或版本号(便于更新)
└─ 开启 gzip/brotli 压缩
5.2 动态页面
├─ 不缓存或极短缓存(0-60 秒)
├─ 注意 Cookie 场景:带登录态的请求不缓存
├─ 可用"边缘缓存 + 缓存键"精细控制
└─ API 接口默认不缓存
5.3 缓存键设计
缓存键决定了"什么样的请求算同一个缓存"。
建议包含:
├─ URL 路径
├─ 查询参数(部分)
└─ 设备类型(移动/PC,如做了差异化)
不建议包含:
├─ Cookie(会导致缓存失效)
└─ 时间戳类参数
六、缓存带来的风险
| 风险 | 说明 | 防范 |
|---|---|---|
| 缓存投毒 | 攻击者构造请求污染缓存,影响其他用户 | WAF 先安检 + 校验缓存键 |
| 敏感信息泄露 | 缓存了带用户信息的页面 | 带 Cookie 的请求不缓存 |
| 更新不及时 | 内容改了但缓存没更新 | 主动刷新 + 版本号 |
| 缓存穿透 | 大量不存在的 URL 每次都回源 | 缓存空结果 + 限速 |
七、小结
WAF 缓存的是”判定结果”,用于加速安全决策;CDN 缓存的是”内容”,用于加速分发。两者职责不同但要协同:WAF 在前做安检,CDN 在后做缓存。配置上,静态资源长缓存、动态内容慎缓存、带 Cookie 的请求不缓存,是最基本的三条原则。
如果你的站点正被恶意爬虫、CC 攻击困扰,或需要一套开箱即用的 Web 应用防护,可以了解百度云防护 Web 应用防火墙(专业版 299 元/月,年付 2399 元,可联系主机吧客服购买)——支持自定义访问策略、URI 频率限制、BOT 防护、威胁情报与 API 防护,无需改动源站代码,改 DNS 即可接入。包年包月计费,流量峰值买多少防多少,无后付费陷阱。
