Max-Age 优先于 Expires 控制 Cookie 生命周期:Max-Age 用相对秒数、不依赖系统时间,更可靠;Expires 用绝对 GMT 时间,易受设备时间影响;共存时 Max-Age 恒生效,Expires 被忽略。

Max-Age 和 Expires 都是用来控制 Cookie 生命周期的关键属性,但它们代表了不同时代的设计思路:Expires 是早期 HTTP/1.0 的遗留机制,而 Max-Age 是 HTTP/1.1 引入的现代化替代方案。现代开发中应以 Max-Age 为主,Expires 仅作兼容补充。
时间表达逻辑不同
Expires 使用绝对时间点(GMT 格式),例如 Expires=Wed, 21 Oct 2025 07:28:00 GMT。它要求客户端系统时间准确,一旦用户手动调快设备时间,Cookie 就可能提前失效;若调慢,则可能异常长期存在。
Max-Age 使用相对秒数,例如 Max-Age=3600 表示从浏览器收到该 Cookie 的那一刻起,再存活 3600 秒。这个计算完全由浏览器自主完成,不依赖本地时钟,更鲁棒可靠。
优先级与共存行为
当 Set-Cookie 响应头中同时包含 Max-Age 和 Expires 时:
- Max-Age 总是生效,Expires 被忽略
- 即使 Expires 设置的时间更晚,也不会延长实际有效期
- 这种设计确保了语义明确、行为可预测
兼容性与使用场景差异
Expires 自网景时代起就存在,所有浏览器都支持,包括老旧 IE(如 IE11 及更早版本不支持 Max-Age)。
Max-Age 在现代浏览器中已全面支持(Chrome、Firefox、Safari、Edge 均无问题),且被 RFC 6265 明确推荐为首选。
实际建议:
- 服务端设置 Cookie 时,优先使用 Max-Age
- 如需兼顾极旧客户端,可同时设置两者(Max-Age 主控 + Expires 同步换算为 GMT 时间作为兜底)
- JavaScript 中通过
document.cookie设置时,只能用expires(小写),需手动把秒数转为 Date 对象再调用toUTCString()
特殊值与边界行为
Max-Age 支持语义化控制:
-
Max-Age=0或负数 → 立即删除该 Cookie(常用于登出逻辑) - 省略 Max-Age 且未设 Expires → 视为会话 Cookie,关闭浏览器即清除
- Expires 若格式错误(如非 GMT、日期无效),整个字段会被浏览器静默忽略
不复杂但容易忽略











