乐闻世界logo
搜索文章和话题

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

3月6日 23:40

Expires 和 Max-Age 都是用于控制 Cookie 过期时间的属性,但它们的实现方式和行为有所不同。

Expires 属性

特点

  • 使用绝对时间(GMT 格式)
  • 指定 Cookie 的具体过期日期和时间
  • 兼容性更好,支持旧版浏览器

语法

javascript
// 设置 Expires const expires = new Date(); expires.setDate(expires.getDate() + 7); // 7天后过期 document.cookie = "token=abc; Expires=" + expires.toUTCString(); // 完整示例 document.cookie = "token=abc; Expires=Wed, 09 Jun 2026 10:18:14 GMT; Path=/";

注意事项

  • 时间格式必须是 UTC (GMT)
  • 如果设置的时间早于当前时间,Cookie 立即删除
  • 客户端和服务器端时间不同步可能导致问题

Max-Age 属性

特点

  • 使用相对时间(秒数)
  • 指定 Cookie 从创建开始的有效期
  • 更现代的属性,优先级高于 Expires

语法

javascript
// 设置 Max-Age(单位:秒) document.cookie = "token=abc; Max-Age=3600"; // 1小时后过期 // 完整示例 document.cookie = "token=abc; Max-Age=86400; Path=/"; // 1天后过期

特殊值

  • Max-Age=0:立即删除 Cookie
  • Max-Age 为负数:立即删除 Cookie
  • 不设置 Max-Age:会话 Cookie,浏览器关闭时删除

两者对比

特性ExpiresMax-Age
时间类型绝对时间相对时间
单位日期时间字符串秒数
优先级
兼容性所有浏览器现代浏览器
时区问题

优先级规则

javascript
// 同时设置时,Max-Age 优先 document.cookie = "token=abc; Expires=Wed, 09 Jun 2026 10:18:14 GMT; Max-Age=3600"; // Cookie 会在 1 小时后过期,而不是指定日期

使用场景

  1. 会话 Cookie
javascript
// 不设置过期时间 document.cookie = "sessionId=abc"; // 浏览器关闭时删除
  1. 短期 Cookie
javascript
// 使用 Max-Age 更清晰 document.cookie = "tempToken=abc; Max-Age=1800"; // 30分钟
  1. 长期 Cookie
javascript
// 使用 Expires 更直观 const expires = new Date(); expires.setFullYear(expires.getFullYear() + 1); document.cookie = "rememberMe=true; Expires=" + expires.toUTCString();
  1. 删除 Cookie
javascript
// 方法 1:设置过去的 Expires document.cookie = "token=abc; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/"; // 方法 2:设置 Max-Age=0 document.cookie = "token=abc; Max-Age=0; Path=/";

最佳实践

  1. 优先使用 Max-Age
javascript
// 推荐 document.cookie = "token=abc; Max-Age=3600"; // 不推荐(除非需要兼容旧浏览器) document.cookie = "token=abc; Expires=" + new Date(Date.now() + 3600000).toUTCString();
  1. 兼容性处理
javascript
function setCookieWithExpiry(name, value, seconds) { let cookieString = `${name}=${value}`; // 优先使用 Max-Age if (typeof seconds === 'number') { cookieString += `; Max-Age=${seconds}`; } else { // 降级使用 Expires const expires = new Date(); expires.setSeconds(expires.getSeconds() + seconds); cookieString += `; Expires=${expires.toUTCString()}`; } document.cookie = cookieString; }
  1. 安全考虑
  • 敏感信息使用短期过期时间
  • "记住我"功能使用长期过期时间
  • 定期轮换 Token 并更新过期时间

实际应用示例

javascript
// 登录成功后设置 Cookie function setLoginCookie(token, rememberMe) { const options = { httpOnly: true, secure: true, sameSite: 'strict', path: '/' }; if (rememberMe) { // 记住我:30天 options.maxAge = 30 * 24 * 60 * 60; } else { // 不记住:1小时 options.maxAge = 60 * 60; } // 服务器端设置(Node.js Express 示例) res.cookie('authToken', token, options); }
标签:Cookie