浏览器通过检查cookie的expires或max-age属性判断有效性:当前时间超过expires或max-age≤0时即丢弃;未设过期时间则为会话cookie,关闭浏览器即失效;“删除”实为覆盖同名cookie并设过去过期时间,需path、domain、secure等参数严格匹配。

因为浏览器只保留未过期的 Cookie。把有效期设为过去时间,相当于告诉浏览器“这个 Cookie 已经作废”,它就会立即从本地存储中移除,不再随请求发送给服务器。
浏览器如何判断 Cookie 是否有效
浏览器在每次发起 HTTP 请求前,会检查当前所有 Cookie 的 expires 或 max-age 属性:
- 如果当前时间早于 expires 时间(或 max-age 倒计时未归零),该 Cookie 被视为有效,自动加入请求头;
- 如果当前时间已超过 expires,或 max-age ≤ 0,浏览器直接忽略并丢弃该条目;
- 没有设置过期时间的 Cookie 默认是会话 Cookie,仅在标签页或浏览器打开期间存在,关闭即消失。
为什么不是真正“删除”,却等效于删除
HTTP 协议本身不提供“删除命令”,Cookie 的管理完全由浏览器自主执行。所谓“删除”,其实是服务端或前端通过响应头或脚本,向浏览器下发一条新的 Set-Cookie 指令,内容为:
- 相同的 name、path、domain;
- 空值或任意占位值(如 "");
- expires 设为一个确定的过去时间点(例如 Thu, 01 Jan 1970 00:00:00 GMT);
- 其他属性(secure、httponly、samesite)必须与原始设置严格一致,否则可能匹配不到原 Cookie。
常见失效原因:参数不匹配
即使时间设对了,以下任一参数不一致,都会导致旧 Cookie 仍残留:
-
path:比如原 Cookie 是
path=/admin,删除时用了path=/,浏览器认为这是另一个 Cookie; -
secure:HTTPS 页面设的 secure Cookie,必须用
secure=true删除,否则无效; - httponly:JS 无法修改 httponly Cookie,只能靠服务端响应头删除;
-
domain:子域设置的 Cookie(如
domain=.example.com),删除时 domain 必须完全相同。
不同语言中的典型写法
本质逻辑统一:覆盖同名 Cookie,并强制其过期。
-
PHP:
setcookie('token', '', time() - 3600, '/', '', true, true); -
JavaScript:
document.cookie = "token=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; SameSite=Strict"; -
Python(Flask):
response.set_cookie('token', '', expires=0)(Flask 内部会转为 Unix 时间戳 0,即 1970 年) -
Django:
response.delete_cookie('token')(底层仍是调用 set_cookie + 过期时间)










