创见博客
Cookie的携带规则
七崽爱吃小饼干2026/02/10阅读 1专栏 JavaScript

Cookie 自动携带规则

一、Cookie 什么时候会自动携带?

满足以下全部条件时,浏览器会在请求头里自动带上 Cookie:

  1. 域名匹配
    • 请求的域名是 Cookie 的 Domain 或其子域名。
  2. 路径匹配
    • 请求路径是 Cookie 的 Path 或其子路径。
  3. 安全协议匹配(Secure)
    • 带 Secure 的 Cookie 只在 HTTPS 下携带。
  4. 跨站规则匹配(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)
评论
0/100