max-age=0 是 rfc 6265 明确定义的强制删除指令,浏览器会立即清除匹配的 cookie,不依赖客户端时间、不需倒计时、不受 expires 影响,是登出等场景最可靠的清除方式。

因为 Max-Age=0 是 RFC 6265 协议明确定义的删除指令,不是“让它过期”,而是告诉浏览器:“立刻移除这个 Cookie”。浏览器收到 Set-Cookie 响应头中包含 Max-Age=0 时,必须立即将同名 Cookie 标记为过期,并从内存和磁盘存储中彻底清除——这是强制行为,所有现代浏览器(Chrome、Firefox、Safari、Edge)都严格遵守。
Max-Age=0 的实际效果
它不依赖客户端时间,不等待倒计时,也不看 Expires 字段。只要域名、Path、Secure、SameSite 等属性完全匹配,浏览器就会执行删除动作:
- 已存在的同名 Cookie 会被立即从 Cookies 存储中移除(开发者工具里将不再显示)
- 后续请求中不会再携带该 Cookie
- 即使用户手动修改了系统时间,也不影响删除行为
为什么不是“设成负数”或“不设”
Max-Age=-1 或完全不设 Max-Age 和 Expires,表示这是一个会话 Cookie,只驻留内存、随浏览器进程结束而消失——它根本没被“删除”,只是没写入磁盘。关闭标签页不等于结束会话,新开标签仍可能复用它。所以它不能用于登出、切换账号等需要即时清除的场景。
常见误区澄清
- Max-Age=0 ≠ Expires 设为过去时间:后者依赖客户端本地时间,若用户手机快了2小时,Expires 就可能被当成已过期而直接忽略写入;Max-Age=0 不受此影响
- 前端 document.cookie="key=; max-age=0" 有效,但有前提:必须确保 Path、Domain 等属性与原 Cookie 一致,否则只是新建一个无效的空值 Cookie,原 Cookie 依然存在
- 服务端调用 c.SetCookie(..., 0, ...)(如 Gin)本质就是设置 Max-Age=0,是最可靠的方式
真正起作用的,是协议层面的语义约定,而不是数值计算。0 在这里是一个信号,不是时间长度。










