What does the dot prefix in the cookie domain mean?

enter image description here

What is the difference between local.test.com and .local.test.com ? The screenshot is from Chrome.

64340 次浏览

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

前导点意味着 cookie 对于子域也是有效的; 然而最近的 HTTP 规范(RFC 6265)改变了这个规则,所以现代浏览器不应该关心前导点。点可能需要旧浏览器实现废弃的 RFC 2109。

RFC 6265第4.1.2.3节

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

来自 Cookie 域名的权威指南,以及为什么一个 www 前缀使您的网站更安全文章:

结论

虽然定义有些不同,< em > 我们可以简化它 对于这些 实施 中的任何一个,作为:

  • 当 Cookie 中未设置域时,Cookie 应该仅匹配 请求的确切主机名。 [注意: 这不同于返回一个没有点的域的 Set-Cookie! ]没有子域,没有部分匹配。 这意味着只是不包括域属性-它是无效的 设置一个空域属性。不幸的是,< em > Internet Explorer 似乎将此作为主机名以及任何子域 。

  • 在 Cookie 中设置域时,安全的选择是将它放在前面 一个点,比如.erik.io。 cookie 将与所有子域名匹配。

  • 设置一个没有前面一个点的 cookie 域,如 erik.io 在 RFC 2109实现中无效,并且将生成相同的 与其他实现上的前一个点相同的行为 无法将 cookie 限制在特定的显式设置的域中, 不包括子域

其他有价值的观察:
  • 在所有 RFC 中,指定的 Cookie 域必须与当前主机匹配 名称,每个正常匹配 来自 erik.io 的响应无效,作为一个带域的 cookie 与 erik.io 不匹配,前者更具体

  • 在 RFC6265中,当解析 Set-Cookie header.

“ . local.test.com”中最前面的点是如何通过设置“ Domain = local.test.com”(或者“ Domain = . local.test.com”,也是相同的)来查看 chrome cookie。

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

所以 chrome 中的前导点并不反映服务器是否使用了前导点,而是反映 cookie 的定义中是否有来自服务器的“ Domain = something”。(如果有的话,cookie 也会被发送到子域)。

至少我的检查结果是这样。Chrome 应该使这个更容易阅读,例如查看定义 cookie 的确切字符串以及收到 cookie 的时间。