子域的域设置 cookie

Posted

技术标签:

【中文标题】子域的域设置 cookie【英文标题】:Domain set cookie for subdomain 【发布时间】:2011-07-12 14:27:30 【问题描述】:

我查看了很多关于 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 设置 cookie。我知道 example.com 有可能为 .example.com 设置一个 cookie,也可以为 example.com 的所有子域设置 cookie,但这不是我想要的。

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

【问题讨论】:

【参考方案1】:

没有。 除了fuu.example.com 是一个无效的 值(它必须以. 开头,即.fuu.example.com(参见下面的更新)cookie would get rejected:

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

请求主机是完全限定域名(不是 IP 地址),格式为 HD,其中 D域的值 属性,H 是一个包含一个或多个点的字符串。

请求主机为example.com属性值为foo.example.com。但是请求主机example.com 不具有HD 形式,其中D 将是foo.example.com。因此 cookie 被拒绝。


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

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

[...] 用户代理将接受一个带有 “example.com”或“foo.example.com”的域属性来自 foo.example.com,但用户代理不会接受带有 “bar.example.com”或“baz.foo.example.com”的域属性。

【讨论】:

【参考方案2】:

example.comfoo.example.com 2 个域只能在 Set-Cookie 标头中明确指定域的情况下共享 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。

总而言之,如果您从example.com 设置一个类似于上面第二个示例的cookie,则foo.example.com 可以访问它,反之亦然。

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

【讨论】:

foo1.example.comfoo2.example.com 之间共享cookie 怎么样?如果没有foo3.example.com 得到它,这可能吗? 你有相同的解决方案吗@DushyantBangal @PranavBilurkar 来自我所做的研发,服务器只能为自己设置一个适用于foo2.example.com 或其通配符子域适用于*.foo2.example.com 的cookie。 @PranavBilurkar ...所以要实现我所提到的,必须在foo1.example.comfoo2.example.com 上调用API,然后它们将设置各自的cookie。 实际上我的问题是“我有 7 个带有 .example.com 的站点,它们在所有站点上共享 cookie,我想排除在 media.example.com 上共享 cookie【参考方案3】:

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

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

// a . added before domain name

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

【讨论】:

以上是关于子域的域设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

我在 info.plist 中的 NSAppTransportSecurity 设置不适用于所有已定义的域和子域

单点登录(SSO)初识

javascript 在子域/读取cookie之间设置javascript cookie

如果 cookie 设置为同一域上的所有子域,则删​​除 cookie 不起作用

为与 javascript 不同的域设置 cookie

是否可以在子域之间共享 cookie