浏览器如何处理没有路径和域的cookie

Kaa*_*rde 5 cookies url http

我现在在Google上搜索了很多,找到了矛盾的答案。所以我的问题是:浏览器如何处理domain没有path属性且没有属性的HTTP cookie ?

例如,来自服务器的以下响应:

200 OK https://example.com/a/b (6047ms) 
Set-Cookie: x-my-cookie=1.0; Max-Age=86400000; Expires=Sun, 05-Jan-2020    08:30:25 GMT
Run Code Online (Sandbox Code Playgroud)

向发出请求时是否应包含cookie https://m.example.com/a/b

https://example.com/zzzz

还有https://example.com/a

还有https://example.com/a/b/c

还有https://example.com

sha*_*ncs 7

对于Set-Cookie没有domain属性,cookie的域值为“原始服务器”。根据RFC6265

除非cookie的属性另有说明,否则cookie仅返回到原始服务器(而不返回到任何子域)...如果服务器省略Domain属性,则用户代理将cookie仅返回到原始服务器。

除了以下例外:

警告:一些现有的用户代理将缺少的“域”属性视为存在“域”属性并包含当前主机名。例如,如果exam​​ple.com返回不带Domain属性的Set-Cookie标头,则这些用户代理也会错误地将cookie发送到www.example.com。

也许这就是为什么您发现矛盾的答案。


对于Set-Cookiepath属性,RFC6265声明:

如果服务器省略Path属性,则用户代理将使用request-uri的路径组件的“目录”作为默认值。


对于您的示例,答案将是:

https://m.example.com/a/b发出请求时是否应包含cookie ?

否。因为m.example.com不是源服务器(example.com)。

那么https://example.com/zzzz呢?

否。因为/zzz不在“目录”下/a/b

还有https://example.com/a

否。因为/a不在“目录”下/a/b

还有https://example.com/a/b/c

是。因为/a/b/cIS在“目录”下/a/b

还有https://example.com

否。因为/不在“目录”下/a/b

  • @shaochuancs 关于第三种情况:“不。因为`/a`不在“目录”`/a/b`下。” 我认为这是不正确的。[Section 5.1.4](https://tools.ietf.org/html/rfc6265#section-5.1.4),default-path 算法的第 4 步指出:“从第一个字符开始输出 uri-path 的字符字符直到但不包括最右边的 %x2F (“/”)。” 在这种情况下,路径中没有尾随“/”,最右边的“/”在“b”之前,所以默认路径不是“/a”,因此这将是“是”? (3认同)

Tod*_*ier 5

对于一种情况,接受的答案是不正确的:

还有https://example.com/a?

不,因为/a不在“目录”下/a/b

如果您只关心 Internet Explorer,那就对了。如果您关心标准和遵守该标准的浏览器,那么事实并非如此。

RFC 6265 提供了以下算法Path来计算属性不存在时要使用的默认 cookie 路径:

用户代理必须使用与以下算法等效的算法来计算 cookie 的默认路径:

  1. 如果存在请求 uri 的路径部分(否则为空),则将 uri-path 设为请求 uri 的路径部分。例如,如果 request-uri 仅包含路径(和可选的查询字符串),则 uri-path 就是该路径(不带 %x3F(“?”)字符或查询字符串),并且如果 request-uri 包含完整的绝对 URI,uri-path 是该 URI 的路径组成部分。

  2. 如果 uri-path 为空或者 uri-path 的第一个字符不是 %x2F(“/”)字符,则输出 %x2F(“/”)并跳过其余步骤。

  3. 如果 uri-path 包含不超过 1 个 %x2F ("/") 字符,则输出 %x2F ("/") 并跳过剩余步骤。

  4. 输出 uri 路径中从第一个字符到(但不包括)最右边的 %x2F(“/”)的字符。

我强调了#4,因为这是重要的部分。对于在 uri-path 设置的 cookie /a/b,“最右侧”/是 之前的 cookie b。该算法表示在此停止,因此默认 cookie 路径为/a,因此 cookie发送到https://example.com/a

但正如大多数 Web 开发人员所知,“应该”是一回事,“做”是另一回事。因此,我编写了一个小型 Web 应用程序来测试这个确切的场景:未设置显式 Path 属性的 cookie 是否会/a/b在请求中发送到/a这是我的发现(最新浏览器版本,Windows 10):

铬 - 是的

火狐浏览器 - 是的

边缘 - 是

Internet Explorer - 否