如何设置 Cookie 的过期时间?Max-Age 和 Expires 有什么区别?
·

Cookie 过期时间设置全攻略:Max-Age vs Expires,一篇讲透
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 既好用又安全。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)