RFC 6265是强制性协议规范,浏览器严格按其解析Set-Cookie头;Max-Age=0表示立即过期,Max-Age=-1触发删除,两者不可混淆;安全属性如Secure、SameSite等必须拼写正确、值合规且位置准确,否则被忽略或失效。

因为浏览器只认 RFC 6265 定义的语义,不遵循就可能被忽略、截断、报错,甚至完全失效。
浏览器实现完全基于标准条款
RFC 6265 不是建议,而是强制性协议规范。Chrome、Firefox、Safari、Edge 等主流浏览器的 Cookie 模块均严格按该文档解析 Set-Cookie 头:
- 遇到非法 domain(如以点开头
.example.com或含端口),Tomcat 9+ 直接抛异常,不再设 Cookie; - name 中含空格、中文、
[]、()或以$开头,新处理器直接拒绝写入; - value 含空格、逗号、分号,未做 URL 编码时会被浏览器截断(如
abc def只存下abc); - Expires 值无法解析为合法时间(如格式错、年份超限),整个属性被静默丢弃,退化为会话 Cookie。
Max-Age 和 Expires 的优先级与行为有明确定义
规范明确要求:当两者同时存在,必须以 Max-Age 为准;若 Max-Age 非数字或 ≤0,浏览器须将其视作“立即过期”:
-
Max-Age=0→ 浏览器标记该 Cookie 为过期,并在后续请求中不再发送(但开发者工具里仍可能显示为灰色“Expired”); -
Max-Age=-1→ 触发删除逻辑,多数浏览器会立即从存储中移除; - 不设 Max-Age 也不设 Expires → 默认为会话 Cookie,关闭浏览器即失效(无例外)。
安全属性依赖标准字段的精确解释
像 Secure、HttpOnly、SameSite 这些关键安全控制,其生效前提就是字段名拼写正确、值符合枚举范围、且位置合规:
-
Secure在 HTTP 协议下(如http://localhost:8080)会被浏览器彻底忽略——不存、不发、不报错; -
SameSite=Strict或Lax若拼成same-site或samesite=strict(大小写/连字符错),老版本浏览器可能识别失败; -
Domain设为.localhost是非法域名,浏览器静默丢弃,导致跨子域共享失效。
服务端框架已全面转向 RFC 6265 兼容模式
现代框架默认启用严格校验,不再容忍历史宽松行为:
- ThinkPHP 的
Cookie::forever()实际写入的是远期 Expires(如 2035 年),并非“永久”,这是对 RFC “必须带过期语义”的遵守; - Gin 设置
maxAge = -1才等效于删除,设0反而回退到无 Expires 的会话行为; - Tomcat 9+ 默认
Rfc6265CookieProcessor已废弃Version=1、Comment等旧字段,监控系统若还依赖这些,就会解析失败。


















