浏览器中 Cookie 的作用域由 Domain
与 Path
共同决定,这两者的精确匹配算法构成了 Cookie 是否会被携带的基础逻辑,是理解身份验证、用户状态管理、安全策略(如 CSRF 防护)等系统的核心之一。
关键词: Cookie、作用域、Domain、Path、精确匹配、SameSite、安全性
一、前言
在浏览器中,Cookie 是保存状态的核心机制。Cookie 不只是存和取那么简单,它的发送(是否携带)行为由作用域匹配机制严格控制。
作用域包含两部分:
Domain
:限制 Cookie 可被哪些主机名访问Path
:限制 Cookie 可在哪些路径下访问
只有当浏览器请求的 URL 与 Cookie 的 Domain
和 Path
同时满足匹配规则时,浏览器才会将该 Cookie 附加在请求头中。
二、Cookie 的 Domain 匹配机制详解
1. 默认行为:当前主机精确匹配
当 Cookie 不显式指定 Domain
时,它仅对当前主机名有效。
Set-Cookie: userId=123; Path=/account;
浏览器访问 www.example.com/account
会发送该 Cookie;但访问 sub.example.com/account
不会发送。
2. 显式指定 Domain:包含子域
Set-Cookie: userId=123; Domain=example.com; Path=/account;
此时 Cookie 作用于:
example.com
www.example.com
sub.example.com
注意:不能跨顶级域名,例如:example.com ≠ evil.com
3. Domain 匹配算法
浏览器会根据请求的 host header 与 Cookie 的 Domain
字段进行如下匹配:
规则:请求的 host 必须是 Domain 的子域或完全相同
if (request_host === cookie_domain)
match
else if (request_host endsWith (“.” + cookie_domain))
match
else
reject
实例分析:
Cookie Domain | 请求 Host | 是否携带 |
---|---|---|
example.com | example.com | ✅ |
example.com | www.example.com | ✅ |
example.com | evil.com | ❌ |
www.example.com | example.com | ❌ |
sub.example.com | sub.example.com | ✅ |
三、Path 的精确匹配机制
Path
限制了 Cookie 的“目录”级别的作用范围。浏览器在发送请求时,会比较请求路径和 Cookie 的 Path
字段是否匹配。
1. 默认行为:当前路径及其子路径
如果没有显式设置 Path
,则使用当前请求路径的“目录部分”。
GET /foo/bar.html
=> Set-Cookie: token=abc123;
自动推导 Path 为:/foo/
2. Path 匹配算法
根据 RFC 6265 §5.1.4 标准:
If request_path starts with cookie_path
Then match
Else
Do not send
注意:必须是前缀匹配,但要保证是路径完整片段,而不是字符串包含。
实例分析:
Cookie Path | 请求 URL | 携带 Cookie? | 说明 |
---|---|---|---|
/ | /login | ✅ | 根路径匹配所有路径 |
/user | /user/profile | ✅ | 前缀匹配 |
/user | /userx | ❌ | 不是前缀的路径片段 |
/user/ | /user | ❌ | 缺少尾部 / ,严格匹配失败 |
/admin/ | /admin/settings | ✅ | 子路径匹配成功 |
四、Domain + Path 的联合判断逻辑
浏览器在发送 Cookie 时必须同时满足 Domain 匹配 && Path 匹配。
示例:
Set-Cookie: session_id=abc123; Domain=example.com; Path=/admin;
Host: www.example.com
URL: /admin/dashboard
→ ✅ 携带Host: api.example.com
URL: /user/info
→ ❌ 不匹配 PathHost: evil.com
URL: /admin/
→ ❌ 不匹配 Domain
五、攻击面与安全误区
1. Cookie 泄露风险
若不当设置 Domain
为顶级域,会导致子域之间 Cookie 共享:
Set-Cookie: auth=admin; Domain=example.com;
这会允许 sub1.example.com
窃取 sub2.example.com
的 Cookie。
建议使用最小范围作用域原则。
2. 同路径不同 Cookie 重名
浏览器对重名 Cookie 只会携带最后一个 Set-Cookie
,但 Path
会作为区分依据。
Set-Cookie: id=abc; Path=/
Set-Cookie: id=def; Path=/admin
访问 /admin/settings
会携带 id=def
,其他路径为 id=abc
。
六、现代浏览器优化行为(附加)
- Chrome 采用 分区 Cookie(Partitioned Cookies) ,与 third-party iframe 行为关联
- Firefox 实现了 两层作用域筛选逻辑:优先匹配最长 Path 的 Cookie(即最长路径匹配)
- 所有主流浏览器都会在有多个 Cookie 时进行 路径长度优先匹配 + 发送顺序排序
七、调试技巧和命令
在开发中可以用以下方式调试:
- 浏览器控制台查看 Cookie:
document.cookie
- Chrome DevTools → Application → Cookies
- 服务器端日志观察 Cookie 头部:
Cookie: session_id=abc123; user_id=42
八、总结
属性 | 匹配方式 | 是否支持通配 | 默认值行为 |
---|---|---|---|
Domain | 完全等于或为子域 | 否(但子域名后缀有效) | 当前 host |
Path | 路径前缀匹配(严格) | 否 | 当前请求路径的“目录” |
正确理解 Domain 和 Path 的精确匹配机制,不仅有助于构建更安全的身份认证系统,也能避免因作用域错误引发的奇怪 Bug,比如:
- Cookie 不发送
- Cookie 被意外覆盖
- 子域权限泄露
九、结语
Cookie 的 Domain 和 Path 看似简单,实则蕴含了浏览器精密的匹配算法。很多前端开发者会在使用 Set-Cookie
时随手写上 Domain=example.com
,却不知这可能会带来巨大的安全后门。
精确控制 Cookie 作用域,是前端安全和性能的重要基石。