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

时间:2017-04-10 13:27:09

标签: http url cookies

我现在搜索了很多内容并找到了相互矛盾的答案。所以我的问题是:浏览器如何处理没有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

在向https://m.example.com/a/b提出请求时是否应包含Cookie?

https://example.com/zzzz怎么样?

https://example.com/a

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

https://example.com

2 个答案:

答案 0 :(得分:6)

对于没有Set-Cookie属性的domain,Cookie的域值为“原始服务器”。根据{{​​3}}:

  

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

有以下例外:

  

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

也许这就是你找到相互矛盾的答案的原因。

对于没有Set-Cookie属性的pathRFC6265说明:

  

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

对于您的示例,答案是:

在向RFC6265提出请求时是否应包含Cookie?

没有。因为m.example.com不是原始服务器(example.com)。

https://m.example.com/a/b怎么样?

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

https://example.com/zzzz

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

https://example.com/a

是。因为/a/b/c位于“目录”/a/b下。

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

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

答案 1 :(得分:2)

对于一种情况,接受的答案是错误的:

https://example.com/a?

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

如果您只关心Internet Explorer,那是真的。如果您在乎标准和符合该标准的浏览器,那就不用了。

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

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

  1. 如果这样的话,让uri-path成为request-uri的路径部分 部分存在(否则为空)。例如,如果 request-uri仅包含一个路径(和可选的查询字符串), 那么uri-path是该路径(不带%x3F(“?”)字符) 或查询字符串),以及request-uri是否包含完整的 absoluteURI,uri-path是该URI的路径组成部分。

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

  3. 如果uri路径包含不超过一个%x2F(“ /”)字符, 输出%x2F(“ /”)并跳过其余步骤。

  4. 从第一个字符开始输出uri-path的字符 ,但不包括最右边的%x2F(“/")。

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

但是,正如大多数Web开发人员所知,“应该”是一回事,而“确实”是另一回事。因此,我写了一个小型的Web应用程序来测试这种确切的情况:将没有设置为/a/b的显式Path属性的cookie发送到对/a的请求中吗?调查结果(最新的浏览器版本,Windows 10):

Chrome-是

Firefox-是

边缘-是

Internet Explorer-否