请添加图片描述

1. 引言:一张超市小票的“有效期”

想象你去超市购物,结账后拿到一张购物小票(Cookie)。小票上可能印着“当天有效”(会话级),也可能写着“一个月内可凭此退换”(持久化)。如果你把小票上的日期从“3月27日”改成“3月28日”,超市的系统(服务器)并不会认——因为小票的有效期是由超市系统统一决定并印在上面的,而不是你自己涂改的。

在 Web 世界里,Cookie 的过期时间就是由服务器“印”在上面的“有效期”。它决定了这张“小票”在浏览器里存活多久。本文将带你彻底搞懂设置 Cookie 过期时间的两种方式——Max-AgeExpires,以及它们之间的核心区别。


2. 前置知识:为什么需要设置 Cookie 过期时间?

2.1 Cookie 的两种生命周期

Cookie 可以活在两个地方:

  • 内存中:没有设置过期时间(或设为负数),称为会话级 Cookie。关闭浏览器,Cookie 就消失。
  • 硬盘中:设置了具体的过期时间(Max-AgeExpires),称为持久化 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-AgeExpires 都设置会叠加” ❌ 浏览器优先使用 Max-Age,忽略 Expires
Max-Age=-1 能立即删除 Cookie” -1 表示会话级,不是删除;删除用 0
Expires 格式随便写就行” ❌ 必须用 GMT 格式(如 Wed, 21 Oct 2026 07:28:00 GMT),否则被忽略。
“修改过期时间必须只改值” ❌ 修改时必须保持 PathDomain 完全一致,否则会生成新 Cookie。

7. 总结:如何选择?

场景 推荐方式 原因
新项目、现代浏览器 Max-Age 简洁、可靠、优先级高
兼容 HTTP/1.0 旧系统 Expires 老协议支持
身份凭证 Cookie Max-Age + 短时间(如 3600 秒) 减少泄露风险
“记住我”功能 Max-Age + 长时间(如 30 天) 持久化,但配合安全属性
登出操作 Max-Age=0 立即删除

一句话记住Max-Age 是“倒计时秒表”,Expires 是“日历上的日期”。现代开发中,优先用 Max-Age,它更可靠、更简单。无论哪种,记得配上 HttpOnlySecureSameSite,让 Cookie 既好用又安全。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐