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

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 既好用又安全。

企业文化怎么描写?掌握核心要点与实用技巧|各面值美元纸币面面观