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:立即删除 CookieMax-Age为负数:立即删除 Cookie- 不设置 Max-Age:会话 Cookie,浏览器关闭时删除
两者对比
| 特性 | Expires | Max-Age |
|---|---|---|
| 时间类型 | 绝对时间 | 相对时间 |
| 单位 | 日期时间字符串 | 秒数 |
| 优先级 | 低 | 高 |
| 兼容性 | 所有浏览器 | 现代浏览器 |
| 时区问题 | 有 | 无 |
优先级规则
javascript// 同时设置时,Max-Age 优先 document.cookie = "token=abc; Expires=Wed, 09 Jun 2026 10:18:14 GMT; Max-Age=3600"; // Cookie 会在 1 小时后过期,而不是指定日期
使用场景
- 会话 Cookie
javascript// 不设置过期时间 document.cookie = "sessionId=abc"; // 浏览器关闭时删除
- 短期 Cookie
javascript// 使用 Max-Age 更清晰 document.cookie = "tempToken=abc; Max-Age=1800"; // 30分钟
- 长期 Cookie
javascript// 使用 Expires 更直观 const expires = new Date(); expires.setFullYear(expires.getFullYear() + 1); document.cookie = "rememberMe=true; Expires=" + expires.toUTCString();
- 删除 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=/";
最佳实践
- 优先使用 Max-Age
javascript// 推荐 document.cookie = "token=abc; Max-Age=3600"; // 不推荐(除非需要兼容旧浏览器) document.cookie = "token=abc; Expires=" + new Date(Date.now() + 3600000).toUTCString();
- 兼容性处理
javascriptfunction 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; }
- 安全考虑
- 敏感信息使用短期过期时间
- "记住我"功能使用长期过期时间
- 定期轮换 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); }