本文要点
省略Domain时,Cookie的发送范围由“设置它的host”决定,而不是由整个域决定
显式指定Domain后,发送范围从单个host扩大到整个域,子域名一般一并纳入
两种写法对应两种需求,选哪种取决于这条Cookie要给谁用

本文目录
先给结论:省略锁在当前host,写了才可能覆盖子域名
如果你在服务器上设置一条Cookie,纠结要不要写Domain,先记住一句话:不写Domain,这条Cookie只发给设置它的那个host;写了Domain,发送范围一般会扩大到该域及其子域名。
依据是MDN的HTTP Cookie说明:Domain指定了哪些主机可以接受Cookie。如果不指定,该属性默认为同一host设置cookie,不包含子域名。如果指定了Domain,则一般包含子域名。文档还直接点明,指定Domain比省略它的限制要少。
所以判断顺序是:先看这条Cookie是在哪个host上设置的,再看Set-Cookie里有没有Domain这一项。没有,范围就停在当前host;有,范围一般往下延伸到子域名。
一个自建情境(示例,不是对某个真实站点的记录):假设你在练习里用三个主机名,www.example.test、api.example.test、shop.example.test,它们同属example.test这个域。下面所有主机名和Cookie值都是练习用的自建数据。
省略Domain:范围锁在设置它的那个host上
省略Domain时,Cookie的发送范围由“设置它的host”决定,而不是由整个域决定。
按MDN的表述,不指定Domain时默认同一host,不包含子域名。这句话可以拆成两层。第一层,设置动作发生在哪个host,Cookie就归哪个host。第二层,这个host下面的子域名不在范围内。
举一个自建例子说明发送结果(示例,不是实测记录):
- 在www.example.test上设置一条不带Domain的Cookie,例如Set-Cookie: theme=light。
- 之后请求www.example.test,浏览器会带上这条Cookie。
- 之后请求api.example.test或shop.example.test,浏览器不会带上它。
这里容易误解的地方是:www.example.test本身看起来像example.test的子域名,但省略Domain时,判断依据是“设置时的host”这个完整主机名,不是它属于哪个域。所以api.example.test收不到,不是因为它是子域名,而是因为它不是设置这条Cookie的那个host。
显式写Domain:发送范围一般扩到该域及其子域名
显式指定Domain后,发送范围从单个host扩大到整个域,子域名一般一并纳入。
按MDN的说明,如果指定了Domain,则一般包含子域名;文档给的例子是,设置Domain=mozilla.org,则Cookie也包含在子域名中,如developer.mozilla.org。
换成自建主机名(示例,不是实测记录):
- 在www.example.test上设置Set-Cookie: theme=light; Domain=example.test。
- 之后请求www.example.test,会带上这条Cookie。
- 之后请求api.example.test,也会带上。
- 之后请求shop.example.test,也会带上。
所以“子域名能不能收到”这个问题,答案取决于Domain写没写:省略,收不到;显式写成共同的上级域,收得到。
需要说明的是,资料用的是“一般包含子域名”,没有把每一种Domain取值下的匹配结果都列出来。本文只讲写共同上级域这一种情形,不替资料补其他取值的结论。
为什么范围大不等于更好:共享需求与代价同时存在
两种写法对应两种需求,选哪种取决于这条Cookie要给谁用。
该省略的情况:这条Cookie只服务于设置它的那个host。比如只在www.example.test上用的界面偏好,别的子域名不需要读它。省略Domain,范围最小,不会扩散到不需要的地方。
该显式写的情况:多个子域名需要共享同一份信息。MDN的说明里提到,当子域需要共享有关用户的信息时,指定Domain可能会有所帮助。
但扩大范围是有代价的。MDN在讲Cookie前缀的段落里提到,子域上的易受攻击的应用程序可以使用Domain属性设置cookie,从而可以访问所有其他子域上的该cookie,会话劫持攻击中可能会滥用此机制。需要说清语境:这句话出现在讲Cookie前缀机制的段落里,用来说明前缀为什么被设计成“domain-locked”。它不表示每一条写了Domain的普通Cookie都等同于会话劫持风险,只说明扩大范围会让更多子域参与这条Cookie的读写。
本文只讲发送范围的差异,不涉及SameSite和Secure,也不讨论登录状态怎么设计。
自查方法:在存储查看器里看这条Cookie的Domain一栏
想确认某条Cookie实际落在哪个范围,可以在浏览器开发者工具里打开存储查看器,选中Cookie,看它的Domain一栏。
按MDN的备注,要查看Cookie存储,可以在开发者工具中启用存储查看器(Storage Inspector)功能,并在存储树上选中Cookie。
核对顺序建议这样走(以下为编辑整理的检查方法,不是对某个真实站点的测试记录):
1. 在设置Cookie的那个host上打开页面,进入开发者工具的存储面板,找到Cookie列表。
2. 找到你刚设置的那条Cookie,读它的Domain一栏,记下这个值。
3. 把这一栏的值和你设置时写的Set-Cookie对照:值等于设置它的完整host,还是等于你写的那个域。
这一步只用来观察你自己站点上的Cookie属性,不要复制或展示真实的Cookie值。练习时用自建的主机名和自建的Cookie值。
资料只说明存储查看器可以查看Cookie,没有说明它是否会跨host展示其他子域名的Cookie,也没有说明Domain一栏的显示值与“省略/显式指定”之间的对应规则。所以本文不给出“看到某种显示就等于省略”这类判断,只让你把看到的值和设置时写的值并排记下来。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回浏览器工具 →