54

我查看了很多关于 cookie 的问题,但没有找到关于我的问题的答案。我有以下情况:

用户在example.com上创建了一个登录名,并且应该获得一个 cookie,但仅限于子域fuu.example.com。我生成以下 HTTP 标头部分:

Set-Cookie: name=TestUser; Domain=fuu.example.com; Path=/; secure; HttpOnly 

但是当我向https://fuu.example.com发出请求时,cookie 不会添加到请求中。我想知道example.com是否有可能为fuu.example.com. 我知道 example.com 也可能example.com.example.com的所有子域设置一个 cookie,但这不是我想要的。

如何为子域设置 cookie?我没有在对子域的请求中看到 cookie。

4

3 回答 3

52

不。除此之外,fuu.example.com值无效(它必须以, ie开头)..fuu.example.com(请参阅下面的更新)cookie 将被拒绝

为防止可能的安全或隐私侵犯,如果以下任何一种情况属实,用户代理将拒绝 cookie(不应存储其信息):

  • request-host 是一个完全限定域名(不是 IP 地址),格式为HD,其中DDomain属性的值,H是一个包含一个或多个点的字符串。

请求主机是example.com属性值为foo.example.com。但是请求主机example.com没有HD的形式D将是foo.example.com。因此cookie被拒绝。


更新    当前规范RFC 6265,即上面引用的已过时的 RFC 2109 ,确实忽略了前导点。但有效域的处理方式相同:

[…] 如果 Domain 属性的值为 " ",当向example.comwww.example.comwww.corp.example.comexample.com发出 HTTP 请求时,用户代理将在 Cookie 标头中包含 cookie 。(请注意,如果存在前导 %x2E(“ ”),即使该字符是不允许的,也会被忽略,但尾随 %x2E(“ ”),如果存在,将导致用户代理忽略该属性。)..

[...] 用户代理将接受来自 foo.example.comexample.com的域属性为 " " 或 " "的 cookie,但用户代理不会接受域属性为 " " 或 " " 的 cookie。foo.example.combar.example.combaz.foo.example.com

于 2011-03-10T10:38:12.693 回答
17

example.com如果域在 Set-Cookie 标头中明确命名,则2 个域foo.example.com只能共享 cookie。否则,cookie 的范围仅限于请求主机。

例如,如果您从 发送以下标头foo.example.com

Set-Cookie: name=value

然后 cookie 将不会被发送到example.com. 但是,如果您使用以下内容,它将在两个域上都可用:

Set-Cookie: name=value; domain=example.com

在 RFC 2109 中,没有前导点的域意味着它不能用于子域,只有前导点 ( .example.com) 才允许跨子域使用它。

但是,现代浏览器遵循较新的规范 RFC 6265,并且会忽略任何前导点,这意味着您可以在子域和顶级域上使用 cookie。

总而言之,如果您像上面的第二个示例那样从 中设置 cookie example.com,它将可以通过 访问foo.example.com,反之亦然。

更多详情:https ://stackoverflow.com/a/23086139/5466401

于 2016-11-15T07:50:07.307 回答
1

实际上,有一种简单且完全跨浏览器支持的方式可以在原始域和子域之间共享 cookie,但您应该在设置时间共享它,以便在我正在使用的浏览器中轻松处理 cookie 内容,js-cookie并使用以下设置 cookie 它可以在原始域及其所有子域之间共享:

Cookie.set('key', 'value', { domain: '.domain.com' })

// a . added before domain name

提示:添加此项.将与所有子子域共享 cookie。

于 2021-07-26T21:54:36.623 回答