Cookie的携带规则
七崽爱吃小饼干2026/02/10阅读 1专栏 JavaScript
Cookie 自动携带规则
一、Cookie 什么时候会自动携带?
满足以下全部条件时,浏览器会在请求头里自动带上 Cookie:
- 域名匹配
- 请求的域名是 Cookie 的
Domain或其子域名。
- 请求的域名是 Cookie 的
- 路径匹配
- 请求路径是 Cookie 的
Path或其子路径。
- 请求路径是 Cookie 的
- 安全协议匹配(Secure)
- 带
Secure的 Cookie 只在 HTTPS 下携带。
- 带
- 跨站规则匹配(SameSite)
- 由
SameSite属性决定跨站时是否携带。
- 由
同站请求基本都会携带;跨站是否携带,看 SameSite。
二、同站 vs 跨站(最关键区分)
- 同站:根域名相同(如
a.example.com和b.example.com) - 跨站:根域名不同(如
a.com和b.com)
结论:
- 同站 = 一般都能携带 Cookie
- 跨站 = 能不能携带,由
SameSite决定
跨域 ≠ 跨站 跨域不一定跨站,跨站一定跨域。
三、SameSite 三个值的携带规则
1. SameSite=Strict(严格)
- 同站:携带
- 跨站跳转(链接):不携带
- 跨站表单 / AJAX / 资源:不携带
一句话:只要是跨站,一律不带 Cookie。
2. SameSite=Lax(宽松,浏览器默认)
- 同站:携带
- 跨站顶级导航跳转(GET):携带
- a 标签跳转
- GET 表单跳转
- 跨站POST 表单、AJAX、图片/脚本:不携带
一句话:跨站只允许跳转带,其他都不带。
3. SameSite=None
- 同站:携带
- 跨站任何请求:都携带
- 强制要求:必须搭配
Secure,且必须是 HTTPS- 不满足则浏览器直接丢弃 Cookie
一句话:允许跨站带,但必须 HTTPS + Secure。
四、HttpOnly 对携带的影响
- 不影响自动携带,该带还是带
- 只影响:JS 不能读/改这个 Cookie
- 作用:防 XSS 窃取 Cookie
五、补充关键细节(避免踩坑)
1. Lax 模式的「允许场景」有严格范围
Lax 仅允许安全的 HTTP 方法 + 顶级导航 携带 Cookie:
- ✅ 允许的场景:
<a href="https://目标域名">链接跳转(GET 方法,顶级导航);<link rel="prerender" href="目标域名">预渲染(GET 方法);form表单 GET 提交(<form method="GET" action="目标域名">);
- ❌ 禁止的场景:
form表单 POST/PUT/DELETE 提交(跨站);- AJAX/fetch 发起的任何跨站请求(无论 GET/POST);
- 图片/脚本等资源加载的跨站请求(比如
<img src="目标域名">)。
示例:
- 从
www.baidu.com点击<a href="https://www.example.com/home">→ 跨站跳转,Lax的 Cookie 会携带; - 从
www.baidu.com用fetch('https://www.example.com/api/user')→ 跨站 AJAX,Lax的 Cookie 不携带。
2. Strict 模式的「极端安全」会影响用户体验
Strict 不仅禁止跨站的表单/AJAX,连跨站链接跳转也禁止携带 Cookie:
- 比如你登录了
www.example.com(Cookie 设为Strict),从www.qq.com点击链接跳转到www.example.com,首次请求不会携带登录 Cookie,会显示未登录; - 只有在
www.example.com域名内的跳转(同站),才会携带 Cookie。 → 仅建议给「支付、改密码」等极高敏感操作的 Cookie 使用。
3. None 模式的「强制 Secure」是浏览器硬规则
- 只要
SameSite=None,浏览器就要求必须加Secure,否则 Cookie 会被静默丢弃(控制台可能有警告,但不会报错); Secure意味着 Cookie 仅在 HTTPS 连接中传输,本地开发的 HTTP 环境(比如localhost:8080)设置None + Secure会无效; → 本地开发测试None时,可临时用 HTTPS 代理(比如 ngrok),或直接测试Lax模式。
4. 「同站但跨域」的特殊场景
比如 www.example.com(前端)和 api.example.com(接口):
- 属于「跨域」(域名不同),但「同站」(根域名都是 example.com);
- 无论
SameSite是Strict/Lax,请求api.example.com时 Cookie 都会正常携带; - 跨域的问题仅需后端设置
Access-Control-Allow-Origin解决,和SameSite无关。
六、总结
| SameSite 值 | 同站请求 | 跨站链接跳转(GET) | 跨站表单/AJAX | 额外要求 |
|---|---|---|---|---|
| Strict | ✅ 携带 | ❌ 不携带 | ❌ 不携带 | 无 |
| Lax(默认) | ✅ 携带 | ✅ 携带 | ❌ 不携带 | 无 |
| None | ✅ 携带 | ✅ 携带 | ✅ 携带 | 必须加 Secure(HTTPS) |