带有host-only-flag的cookie是否应该替换没有它的cookie?

时间:2013-04-30 13:54:41

标签: http cookies

RFC 6265声明用户代理在收到Set-Cookie标头时应按以下方式继续:

如果设置了Domain属性:

  • 将Cookie的域设置为domain-attribute。
  • 将Cookie的host-only-flag设置为false

如果域属性设置:

  • 将cookie的域设置为canonicalized request-host。
  • 将Cookie的host-only-flag设置为true

这一切都很清楚。这段话引起了混淆:

  

如果用户代理收到具有相同cookie名称的新cookie,   domain-value和path-value作为它已经存储的cookie,   现有的cookie被驱逐并替换为新的cookie。

我们举一个例子,在域www.example.com上收到两个Cookie:

Set-cookie: name=value
Set-Cookie: name=value; Domain=www.example.com

两个cookie的域(和路径)都是相同的,但第一个将主机标记设置为true,第二个标记设置为false

阅读RFC时,看起来比较两个cookie并不重要,无论如何它们应该被视为等效,但我不确定我的解释是否正确。

用户代理应该用第二个cookie替换第一个cookie,还是应该存储它们?

1 个答案:

答案 0 :(得分:5)

让您感到困惑的段落是为Cookie分配新值的能力(以及更改/刷新Cookie过期日期)。如果没有这样编写,HTTP客户端将需要存储多个具有相同名称的cookie,并且需要决定在下一次请求时发送到HTTP服务器的另一个标准。

关于问题的第二部分:

如果在同一请求中指定了这两个cookie,则第二个cookie“获胜”,因此将存储包含host-only-flag = false的cookie。

如果这两个cookie来自不同的请求,则第二个会覆盖第一个,因为它们匹配cookie-name(指定),domain-value(一旦指定,一旦派生)和path-value(派生)。存储它们时,浏览器的cookie数据库中的条目仅在host-only-flag中不同。

当客户端向服务器发出新请求(snippet from RFC6265)时,此host-only-flag生效:

The user agent MUST use an algorithm equivalent to the following
algorithm to compute the "cookie-string" from a cookie store and a
request-uri:

1.  Let cookie-list be the set of cookies from the cookie store that
    meets all of the following requirements:

    *  Either:

           The cookie's host-only-flag is true and the canonicalized
           request-host is identical to the cookie's domain.

        Or:

           The cookie's host-only-flag is false and the canonicalized
           request-host domain-matches the cookie's domain.

详细的细节是如何比较域名。匹配算法在section 5.1.3中指定。

如果使用前导“。”指定域,则基本上您可以让cookie对所有子域都有效。

但是,当省略域时(因此服务器从请求中暗示),情况永远不会是这种情况,因为域中总是需要相同的匹配。

进一步研究确定:

在实践中,浏览器会存储已在Cookie中指定的带有前置.的域(对于www.example.com它将存储.www.example.com),以便向subdomain.www.example.com发出请求也将返回该cookie。如果未指定域,则将存储没有前置.的纯域,因此对子域的请求将不包含该cookie。