Cookie应仅传递轻量必要身份凭证,禁存偏好、购物车详情、展示字段及敏感信息;严格控体积(≤4KB)、用作用域隔离、优先以localStorage等替代非必需状态存储。

核心思路是:只让 Cookie 承担它该干的事——传递轻量、必要、服务端必须实时拿到的身份凭证,其余一切“可选”“可延迟”“可本地缓存”的数据,全部移出 Cookie。
明确什么不该进 Cookie
Cookie 不是前端数据库。以下内容一律禁止写入:
- 用户偏好设置(主题、字体大小、通知开关)→ 改用 localStorage
- 购物车完整商品列表 → 只存 cart_ids=1001,1002(几十字节),页面加载后用 ID 拉取详情
- 用户头像 URL、昵称、积分等展示型字段 → 前端首次登录后缓存,或由接口按需返回
- 敏感信息(手机号、明文 token、权限数组)→ 后端管理 session,Cookie 中仅存不可逆的 session_id 或 token_id
严格控制单个 Cookie 的体积
4KB 是硬上限,但实际安全阈值更低。操作时必须:
- 用 new TextEncoder().encode(str).length 计算真实字节数,别信
str.length(中文、emoji 占多字节) - 写入前预估总长:name 字节数 +
encodeURIComponent(value)后字节数 + 属性开销(约 40 字节) - 预留至少 100 字节余量,防止因日期格式、浏览器差异导致静默截断
- 超限时主动截断并加标记,例如
"…truncated",后端识别后走补全逻辑
用作用域和域名隔离减少无效携带
静态资源(JS/CSS/图片)根本不需要 Cookie,却常因同域而被强制携带:
立即学习“Java免费学习笔记(深入)”;
- 把静态资源部署到独立子域,如 static.example.com,主站 www.example.com 的 Cookie 不会发过去
- 设置 Cookie 的 path 尽可能精确(如
path=/api),避免全站生效 - 确认 domain 设置准确(
.example.com允许子域共享,example.com仅限精确匹配)
优先用替代方案替代 Cookie 写入
不是所有状态都必须走 Cookie。更合理的方式是:
- 登录态、支付凭证等必须随请求自动发送的 → 留在 Cookie(带
HttpOnly+Secure+SameSite=Lax) - 界面配置、表单草稿、分页状态等 → 存 localStorage,关键操作时再通过轻量 API 同步到后端
- 临时上下文(如来源页、活动参数)→ 用 URL query 参数 或 sessionStorage
- 中等体量结构化数据(如用户布局快照)→ 考虑前端压缩(pako)+ Base64 编码,但权衡 CPU 开销;通常不如换存储方案


















