浏览器 Cookie 作用域中 Domain 与 Path 的精确匹配算法解析

63 阅读4分钟

浏览器中 Cookie 的作用域由 DomainPath 共同决定,这两者的精确匹配算法构成了 Cookie 是否会被携带的基础逻辑,是理解身份验证、用户状态管理、安全策略(如 CSRF 防护)等系统的核心之一。

关键词: Cookie、作用域、Domain、Path、精确匹配、SameSite、安全性


一、前言

在浏览器中,Cookie 是保存状态的核心机制。Cookie 不只是存和取那么简单,它的发送(是否携带)行为由作用域匹配机制严格控制。

作用域包含两部分:

  • Domain:限制 Cookie 可被哪些主机名访问
  • Path:限制 Cookie 可在哪些路径下访问

只有当浏览器请求的 URL 与 Cookie 的 DomainPath 同时满足匹配规则时,浏览器才会将该 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.comexample.com
example.comwww.example.com
example.comevil.com
www.example.comexample.com
sub.example.comsub.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 → ❌ 不匹配 Path
  • Host: 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


六、现代浏览器优化行为(附加)

  1. Chrome 采用 分区 Cookie(Partitioned Cookies) ,与 third-party iframe 行为关联
  2. Firefox 实现了 两层作用域筛选逻辑:优先匹配最长 Path 的 Cookie(即最长路径匹配)
  3. 所有主流浏览器都会在有多个 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 作用域,是前端安全和性能的重要基石。