Cookie域中的点前缀是什么意思?


Answers:


57

local.test.com将用于域,同时.local.test.com也将用于子域。


11
因此local.test.com将不适用于x.local.test.com,但同时.local.test.com适用于local.test.comx.local.test.com
ripper234'3

29
我相信这是不正确的。Cookies与任何和所有下游子域(带或不带点)共享。您可以将子域视为其父级的“继承” cookie。因此,在example.com上设置Cookie会将其设置为blog.example.com和my.blog.example.com。在blog.example.com上设置cookie会将其设置在this.is.my.blog.example.com以及介于两者之间的每个子域中。但是,就像继承一样,事实并非如此。在blog.example.com上设置cookie不会在example.com上设置它。
geddski

6
就是说,您可以通过根本不设置Cookie的域(或将其设置为空字符串)来将cookie限制为仅主机。奇怪的是,它将仅为主机(example.com)而不是其任何子域设置cookie。
geddski

8
为了根据另一个答案进行澄清,该点曾经有所作为,但现在没有了。cookie将被发送到指定域的任何子域(带或不带前导点)。实际控制是否将其传递给子域的是您是否在Cookie上设置了域。如果您根本没有设置任何域,那么cookie将仅发送到发出它的确切域。永远不会将其发送到不太特定的父域(例如,“ test.com”的请求中将不包含“ local.test.com”),并且仅在您设置了域值时才将其发送到匹配的子域。
Triynko

4
@Triynko,当您要更新cookie时,点会有所不同。我没有设法隔离所有规则,但是我看到结果会根据是否存在前导点而有所不同,并且并非一帆风顺。它的工作方式因浏览器而异,并且并非全部直观。控制cookiename在浏览器上是否带有前导点并不是我做过的最简单的编程任务。
DanAllen

82

前导点表示Cookie也对子域有效;但是,最近的HTTP规范(RFC 6265)更改了此规则,因此现代浏览器不应在意前导点。实施不推荐使用的RFC 2109的旧浏览器可能需要该点。

RFC 6265第4.1.2.3节

例如,如果“域”属性的值为“ example.com”,则在向example.com,www.example.com和www.corp.example发出HTTP请求时,用户代理会将cookie包含在Cookie标头中。 com。(请注意,即使不允许该字符,也会忽略前导%x2E(“。”)(如果存在),但如果存在尾随%x2E(“。”),则会导致用户代理忽略该属性。 )


1
RFC的日期为2011年4月。IE8和IE9均在该日期之前首次发布,但遗憾的是仍在使用。所以我最好的猜测(没有尝试过)是他们需要前导点。有人知道旧的RFC上仍在运行多少浏览器吗?
BlaM

erik.io/blog/2014/03/04/definitive-guide-to-cookie-domains建议在希望包含子域时使用前导点以实现最佳兼容性。此兼容性要求只会继续降低。(对于6255,不是必需的,但与2109的要求相同,并且最终结果相同。)
user2864740

12

摘自文章Cookie域的权威指南,以及为什么www-prefix使您的网站更安全的原因

结论

尽管定义有些不同,但我们可以将这些实现简化为:

  • 当Cookie中未设置任何域时,该Cookie应该仅与请求的确切主机名匹配。[注意:这与返回带有无点域的Set-Cookie有所不同!]没有子域,没有部分匹配。这意味着根本不包括domain属性-设置空的domain属性无效。不幸的是,Internet Explorer似乎将此与所有子域一起当作主机名

  • 在Cookie中设置域名时,安全的选择是在域名前加点号,例如.erik.io。Cookie将与所有子域匹配。

  • 在RFC 2109实现中,设置没有erik.io之类的没有前一个点的cookie域在RFC 2109实现中是无效的,并且将产生与其他实现中的前一个点相同的行为。在没有包含子域的情况下,无法将Cookie限制为特定的显式设置域。

其他有价值的观察:
  • 在所有RFC中,按照正常匹配,指定的cookie域必须与当前主机名匹配。在erik.io的响应中为www.erik.io设置cookie是无效的,因为域名为www.erik.io的cookie与erik.io不匹配,前者更为具体。

  • 在RFC 6265中,在解析Set-Cookie标头时,域明确地小写。


1

Chrome浏览器使用“ Domain = local.test.com”集(或相同的“ Domain = .local.test.com”集)查看Cookie的方式就是“ .local.test.com”中的前导点。

不带“ Domain = something”的Set-Cookie定义查看没有前导点的域(= host)。

因此,chrome中的前导点不反映服务器是否使用了前导点,而是反映该cookie是否在服务器中定义为“ Domain = something”。(如果有的话,Cookie也将发送到子域)。

至少这是我的测试所显示的。Chrome浏览器应使其更易于阅读,例如查看定义cookie的确切字符串以及接收cookie的时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.