📌

在 Web 项目中,Cookie 经常用于存储登录状态、用户设置或会话信息。虽然它的存储方式很简单,但 Cookie 与“域名(Domain)”之间的关系常常让人困惑:为什么有的子域能读到 Cookie,有的读不到?为什么换了域名后登录状态就失效?为什么多级域名不一定能共享 Cookie?

理解这些问题的关键,就是Cookie 的 Domain 规则

本文将用最简洁的方式解释:
Cookie 是什么?为什么要和域名绑定?如何设置?多级域名能否共享 Cookie?以及 Cookie 跨域的完整规则。


1️⃣ Cookie 是什么?

Cookie 是浏览器存储的一小段文本数据,常见用途包括:

  • 登录状态(token、session id)
  • 用户偏好(语言、主题)
  • 分析与统计
  • 业务状态记录

浏览器的行为是:
只要请求的域名满足 Cookie 的 Domain 规则,它就会自动把 Cookie 发送给服务器。

这就是“Cookie 会跟着请求自动携带”的原理。


2️⃣ 为什么 Cookie 必须绑定域名?

出于安全考虑。

如果所有网站都能读同一个 Cookie,会出现:

  • 登录状态被其他网站窃取
  • 个人信息泄露
  • 跨站攻击更加容易

所以浏览器规定:
Cookie 必须属于一个特定的 Domain(域名),且只有满足规则的域名才能访问它。


3️⃣ Cookie 的 Domain 是如何控制访问范围的?

Domain 决定“哪些域名能读/写这个 Cookie”。

例如:

Set-Cookie: token=123; Domain=example.com;

所有以 example.com 结尾的域名都能访问:

✔ 无论域名有几级,只要以 example.com 结尾,就都能访问。


4️⃣ Cookie Domain 的核心规则(最重要部分)

✔ 规则 1:不设置 Domain → 只属于当前域名

www.example.com 设置:

document.cookie = "a=1";

Domain 默认是 www.example.com

其他域名访问不了:

  • × example.com
  • × api.example.com

✔ 规则 2:设置为主域 → 所有子域共享

Set-Cookie: token=abc; Domain=example.com;

以下域名全部可以读取:

✔ 无论几级域名,只要以 example.com 结尾即可。


✔ 规则 3:子域设置 Cookie → 父域无法访问

Set-Cookie: uid=1; Domain=api.example.com;

访问情况:

域名 能否访问
api.example.com
v1.api.example.com
example.com
www.example.com

子域只能向“更下一级”扩展,而不能向上扩展到主域。


✔ 规则 4:层级数量不重要,只看“后缀匹配”

判断 Cookie 是否可访问的逻辑只有一个:

请求域名.endsWith(cookie.Domain)

例如:

cookie.Domain = example.com
请求域名 = a.b.c.d.example.com

a.b.c.d.example.comexample.com 结尾
✔ Cookie 可访问

因此:

跨 2 级、3 级、5 级域名都没问题,只要是“子域”即可。
是否能访问 Cookie与域名级数完全无关。


5️⃣ 多级域名 Cookie 共享的清晰总结

假设 Cookie 设置 Domain = example.com:

域名 能访问? 原因
example.com 完全匹配
www.example.com 子域
api.example.com 子域
a.b.c.d.e.f.example.com 多级子域

结论:

✔ 五级域名可以访问三级域的 Cookie

✔ 十级域名也可以访问

✔ 只要是子域就可以

❌ 只要不是子域就不可以


6️⃣ 设置共享 Cookie 的正确方式(跨子域常用)

想让所有子域共享 Cookie,例如:

需要设置:

Set-Cookie: token=xxx; Domain=example.com; Path=/; SameSite=None; Secure;

注意:

  • Domain 必须写成主域(example.com)
  • 跨域请求必须设置 SameSite=None; Secure
  • 本地的 localhost 不支持跨子域 Cookie

7️⃣ 常见错误与陷阱

错误情况 原因
子域无法访问 Cookie Domain 设置过于具体
登录状态跨子域失效 Domain 没写成主域
Cookie 设置无效 试图设置一级域(如 com),浏览器禁止
跨域请求 Cookie 不带上 缺少 SameSite=None; Secure
localhost 不能共享 Cookie localhost 不是真实域名

🔚 最终总结(最易懂版本)

  1. Cookie 是否能跨多级域名共享,不看域名有几级,只看是否是子域。
  2. 判断规则就是:请求域名是否以 Cookie 的 Domain 结尾。
  3. 主域设置 Cookie → 所有子域(任意多级)都能读。
  4. 子域设置 Cookie → 只能向下共享,不能向上共享。
  5. 跨域场景需要设置 SameSite=NoneSecure
  6. localhost 不能做多级域名调试。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐