Cookie 过期时间设置全攻略:Max-Age vs Expires,一篇讲透
1. 引言:一张超市小票的“有效期”
2. 前置知识:为什么需要设置 Cookie 过期时间?
2.1 Cookie 的两种生命周期
2.2 过期时间的意义
3. 两种过期时间设置方式
3.1 `Max-Age`:相对时间,更可靠
3.2 `Expires`:绝对时间,需精确格式
4. 代码实战:如何设置过期时间?
4.1 服务端设置(Java Servlet 示例)
4.2 前端设置(JavaScript 示例)
5. 特殊值:会话级与立即删除
6. 常见误区与避坑
7. 总结:如何选择?
1. 引言:一张超市小票的“有效期”
想象你去超市购物,结账后拿到一张购物小票(Cookie)。小票上可能印着“当天有效”(会话级),也可能写着“一个月内可凭此退换”(持久化)。如果你把小票上的日期从“3月27日”改成“3月28日”,超市的系统(服务器)并不会认——因为小票的有效期是由超市系统统一决定并印在上面的,而不是你自己涂改的。
在 Web 世界里,Cookie 的过期时间就是由服务器“印”在上面的“有效期”。它决定了这张“小票”在浏览器里存活多久。本文将带你彻底搞懂设置 Cookie 过期时间的两种方式——Max-Age 与 Expires,以及它们之间的核心区别。
2. 前置知识:为什么需要设置 Cookie 过期时间?
2.1 Cookie 的两种生命周期
Cookie 可以活在两个地方:
内存中:没有设置过期时间(或设为负数),称为会话级 Cookie。关闭浏览器,Cookie 就消失。
硬盘中:设置了具体的过期时间(Max-Age 或 Expires),称为持久化 Cookie。即使关闭浏览器、重启电脑,只要没过期,它就在。
2.2 过期时间的意义
用户体验:“记住我”功能需要持久化 Cookie。
安全性:身份凭证 Cookie 不应设置过长过期时间,减少泄露风险。
资源管理:及时清理过期 Cookie,避免浏览器存储膨胀。
3. 两种过期时间设置方式
属性
格式
时间类型
优先级
推荐度
Max-Age
Max-Age=3600
相对秒数(从此刻开始计时)
高(同时存在时优先)
✅ 推荐
Expires
Expires=Wed, 21 Oct 2025 07:28:00 GMT
绝对时间点
低
⚠️ 仅用于兼容旧系统
3.1 Max-Age:相对时间,更可靠
原理:浏览器从收到 Cookie 那一刻开始倒计时,到期后自动删除。
示例(服务端):
Set-Cookie: sessionId=abc123; Max-Age=3600; HttpOnly; Secure
表示这个 Cookie 在 1 小时后过期(3600 秒)。
优点:
不依赖客户端系统时间,即使电脑时间不准也不影响。
简洁,单位秒,不易出错。
3.2 Expires:绝对时间,需精确格式
原理:指定一个具体的过期时间点,到达该时间后失效。
示例(服务端):
Set-Cookie: rememberMe=yes; Expires=Wed, 21 Oct 2026 07:28:00 GMT; Path=/
注意:
必须使用 GMT 格式(如 new Date().toUTCString() 生成),否则浏览器会忽略。
如果客户端系统时间被改到未来,可能提前失效;改到过去,可能延长寿命。
4. 代码实战:如何设置过期时间?
4.1 服务端设置(Java Servlet 示例)
// 方式一:使用 Max-Age(推荐)
Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setMaxAge(3600); // 1 小时后过期
cookie.setPath("/");
cookie.setHttpOnly(true);
cookie.setSecure(true);
response.addCookie(cookie);
// 方式二:使用 Expires(需手动构造日期)
Cookie oldStyleCookie = new Cookie("remember", "yes");
oldStyleCookie.setMaxAge(30 * 24 * 60 * 60); // 实际还是用 Max-Age,内部转换
// 不推荐手动设置 Expires 字符串
4.2 前端设置(JavaScript 示例)
// 设置一个 7 天后过期的 Cookie(通过 Max-Age)
document.cookie = "username=John; max-age=604800; path=/";
// 设置一个绝对时间过期的 Cookie(通过 Expires)
let expires = new Date();
expires.setDate(expires.getDate() + 7);
document.cookie = `username=John; expires=${expires.toUTCString()}; path=/`;
重要:前端无法设置 HttpOnly 的 Cookie。
5. 特殊值:会话级与立即删除
值
行为
示例
不设置
会话级 Cookie,关闭浏览器即失效
Set-Cookie: name=value
Max-Age=0
立即删除该 Cookie
常用于登出
Max-Age=-1
会话级 Cookie(与不设置等效)
极少显式使用
Expires 为过去时间
立即删除
常用于前端删除非 HttpOnly Cookie
删除 Cookie 的正确姿势:
// 服务端删除(必须 Path/Domain 一致)
Cookie cookie = new Cookie("sessionId", "");
cookie.setMaxAge(0); // 关键:0 表示立即删除
cookie.setPath("/");
response.addCookie(cookie);
// 前端删除(仅非 HttpOnly)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/";
6. 常见误区与避坑
误区
正解
“Max-Age 和 Expires 都设置会叠加”
❌ 浏览器优先使用 Max-Age,忽略 Expires。
“Max-Age=-1 能立即删除 Cookie”
❌ -1 表示会话级,不是删除;删除用 0。
“Expires 格式随便写就行”
❌ 必须用 GMT 格式(如 Wed, 21 Oct 2026 07:28:00 GMT),否则被忽略。
“修改过期时间必须只改值”
❌ 修改时必须保持 Path、Domain 完全一致,否则会生成新 Cookie。
7. 总结:如何选择?
场景
推荐方式
原因
新项目、现代浏览器
Max-Age
简洁、可靠、优先级高
兼容 HTTP/1.0 旧系统
Expires
老协议支持
身份凭证 Cookie
Max-Age + 短时间(如 3600 秒)
减少泄露风险
“记住我”功能
Max-Age + 长时间(如 30 天)
持久化,但配合安全属性
登出操作
Max-Age=0
立即删除
一句话记住:Max-Age 是“倒计时秒表”,Expires 是“日历上的日期”。现代开发中,优先用 Max-Age,它更可靠、更简单。无论哪种,记得配上 HttpOnly、Secure、SameSite,让 Cookie 既好用又安全。