安全删除 Cookie 必须精确匹配原始 path 和 domain 参数并设置 expires 过去时间或 max-age=0,同时对含特殊字符的 name 进行 encodeURIComponent 编码,且需配合服务端同步销毁 session 才能彻底生效。

安全删除 Cookie 的核心不是“清空”或“覆盖”,而是让浏览器立即失效该 Cookie,并阻断它被后续请求携带的可能。单纯赋空值或忽略属性,很可能留下残留风险。
必须设置过期时间为过去时间
浏览器只认 expires 或 max-age=0 为删除信号。仅写 name= 或 name=; 不足以触发删除,尤其在存在同名但不同 path/domain 的 Cookie 时,旧条目仍可能生效。
- 用 UTC 时间字符串(推荐):
document.cookie = "token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.example.com"; - 或用 max-age:
document.cookie = "token=; max-age=0; path=/; domain=.example.com"; - path 和 domain 必须与当初设置时完全一致,否则只是新建一个作用域不同的 Cookie,原 Cookie 依然存在
务必匹配原始作用域参数
Cookie 的删除是“精确匹配”操作。如果原始 Cookie 是通过 path=/admin; domain=app.example.com 设置的,删除时漏掉 path 或写错 domain,浏览器会把它当作一条新 Cookie 存储,而不会触碰原来的凭证。
- 常见错误:删除时只写
path=/,但原始是path=/auth→ 原 Cookie 仍在 - 子域名注意:设为
domain=example.com的 Cookie,可用domain=.example.com删除;但反过来不行 - 开发阶段建议记录每次 set 的完整参数,或统一用工具函数封装读/写/删逻辑
配合服务端同步清理更可靠
前端删除只是客户端行为,无法保证服务端 session 也已销毁。若仅删前端 Cookie 而服务端 session 仍有效,攻击者可能复用旧 token 或 sessionId 继续访问。
立即学习“Java免费学习笔记(深入)”;
- 登出时,先发请求到后端执行 session 失效(如调用
/api/logout),再执行前端 Cookie 删除 - 对敏感凭证(如 refresh token),建议服务端生成时就设为
HttpOnly,前端根本无法读写,删除完全由后端控制 - 前端只操作非敏感、短时效的标识类 Cookie(如用户偏好),避免存储 access token 等高危信息
编码处理不可省略
如果 Cookie 名或值含特殊字符(空格、中文、符号),未编码直接删除,可能导致匹配失败,实际未删掉。
- 删除前对 name 做
encodeURIComponent():const key = encodeURIComponent("auth_token"); - 拼接时保持一致性:
document.cookie = `${key}=; expires=...` - 读取和删除使用同一套编码逻辑,否则 name 对不上,等于白删


















