Cookie 的 Expires 和 Max-Age 属性有什么区别?如何设置 Cookie 的过期时间?
Expires 和 Max-Age 都是用于控制 Cookie 过期时间的属性,但它们的实现方式和行为有所不同。Expires 属性特点使用绝对时间(GMT 格式)指定 Cookie 的具体过期日期和时间兼容性更好,支持旧版浏览器语法// 设置 Expiresconst 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语法// 设置 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 ||------|---------|---------|| 时间类型 | 绝对时间 | 相对时间 || 单位 | 日期时间字符串 | 秒数 || 优先级 | 低 | 高 || 兼容性 | 所有浏览器 | 现代浏览器 || 时区问题 | 有 | 无 |优先级规则// 同时设置时,Max-Age 优先document.cookie = "token=abc; Expires=Wed, 09 Jun 2026 10:18:14 GMT; Max-Age=3600";// Cookie 会在 1 小时后过期,而不是指定日期使用场景会话 Cookie// 不设置过期时间document.cookie = "sessionId=abc";// 浏览器关闭时删除短期 Cookie// 使用 Max-Age 更清晰document.cookie = "tempToken=abc; Max-Age=1800"; // 30分钟长期 Cookie// 使用 Expires 更直观const expires = new Date();expires.setFullYear(expires.getFullYear() + 1);document.cookie = "rememberMe=true; Expires=" + expires.toUTCString();删除 Cookie// 方法 1:设置过去的 Expiresdocument.cookie = "token=abc; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/";// 方法 2:设置 Max-Age=0document.cookie = "token=abc; Max-Age=0; Path=/";最佳实践优先使用 Max-Age// 推荐document.cookie = "token=abc; Max-Age=3600";// 不推荐(除非需要兼容旧浏览器)document.cookie = "token=abc; Expires=" + new Date(Date.now() + 3600000).toUTCString();兼容性处理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;}安全考虑敏感信息使用短期过期时间"记住我"功能使用长期过期时间定期轮换 Token 并更新过期时间实际应用示例// 登录成功后设置 Cookiefunction 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);}