Cookie 应存储小体积时效性数据,合理设置 Max-Age、Secure、HttpOnly、SameSite 等属性,仅存 ID 或短令牌,服务端必须校验并清理过期/失效 Cookie。

用 Cookie 存储带有时效性与安全限制的小体积数据,核心是合理设置 Expires/Max-Age、Secure、HttpOnly 和 SameSite 属性,同时控制数据体积(建议 ≤ 4KB,实际建议 ≤ 1KB)。
设置明确的过期时间
避免使用 session cookie(无过期时间)来存需自动清理的数据。优先用 Max-Age(秒数),它比 Expires 更可靠(不受客户端时钟影响):
- 例如:30 分钟后过期 →
Max-Age=1800 - 服务端设置示例(Node.js/Express):
res.cookie('token', 'abc123', { maxAge: 1800000, httpOnly: true, secure: true, sameSite: 'strict' }) - 前端 JS 设置不推荐(破坏
HttpOnly),如必须用document.cookie,需手动拼接字符串:document.cookie = "theme=dark; max-age=86400; path=/; secure; httponly; samesite=lax"
启用关键安全属性
四项属性协同使用,能显著降低泄露与滥用风险:
- Secure:仅通过 HTTPS 传输,防止明文窃听(HTTP 站点无法设置)
- HttpOnly:禁止 JavaScript 访问,防御 XSS 盗取(如 session token 必须设)
-
SameSite:推荐
Lax(默认主流浏览器行为),可防 CSRF;敏感操作(如支付)可用Strict;完全跨站需求才考虑None(但必须搭配Secure) - 路径与域限制:
path=/app限定作用范围;domain=.example.com支持子域名共享(谨慎使用)
精简内容,避免敏感信息
Cookie 不是存储容器,而是轻量状态标记:
- 只存 ID、短令牌、用户偏好(如语言、主题),不要存明文密码、手机号、完整 JWT 载荷
- 值尽量 Base64 或 URL-safe 编码,避免特殊字符(如分号、逗号)导致解析错误
- 单个 Cookie 建议 ≤ 4096 字节,且整个请求头不宜超过 8KB(否则可能被服务器截断或拒绝)
- 多状态分散存储:如
user_id=123+theme=dark,而非合并成一个大 JSON 字符串
配合服务端验证与清理
Cookie 是客户端传递的“声明”,服务端必须校验其有效性:
- 收到 Cookie 后,查数据库或缓存确认是否未过期、未撤销(如登出时主动失效 token)
- 定期清理过期记录(如 Redis 中的 session),避免“僵尸 Cookie”长期存在
- 对高频变更的状态(如购物车临时项),优先考虑 localStorage + 定时同步后端,而非依赖 Cookie 生命周期










