RFC 6265声明用户代理在收到Set-Cookie标头时应按以下方式继续:
如果设置了Domain属性:
false
。如果域属性不设置:
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,还是应该存储它们?
答案 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。