为子域设置cookie的域名集合

63

我查阅了很多有关cookies的问题,但在我的问题上没有找到答案。我有以下情况:

用户在 example.com 上创建登录并应该得到一个cookie,但只能针对子域名fuu.example.com 。 我生成以下HTTP头部分:

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

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

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

3个回答

59
除了以下更新外,原文中的fuu.example.com是无效的域名(必须以.开头,即.fuu.example.com)。如果出现以下情况,浏览器会拒绝(不存储)Cookie:[参考链接]

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

请求主机是example.com,而域名属性值是foo.example.com。但是请求主机example.com的形式不是HD,其中D应该是foo.example.com。因此,该Cookie被拒绝。


更新    当前规范RFC 6265取消了引用上述内容的RFC 2109,并忽略前导的点。但有效域名的处理方式相同:

[...] 如果域名属性值是“example.com”,则用户代理程序在向example.comwww.example.comwww.corp.example.com发送HTTP请求时,将在Cookie头中包含该Cookie。(注意,如果存在前导%x2E(“.”),尽管该字符不被允许,但一个结尾的%x2E(“.”)如果存在,将导致用户代理程序忽略该属性。

[...] 用户代理程序将接受来自foo.example.com的Domain属性为“example.com”或“foo.example.com”的cookie,但用户代理程序将不会接受Domain属性为“bar.example.com”或“baz.foo.example.com” 的cookie。


24

只有在Set-Cookie头中明确命名域时,example.comfoo.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。

总之,如果您像上面第二个例子一样从example.com设置了一个cookie,那么它会被foo.example.com访问,反之亦然。

更多详情请见:https://dev59.com/HWMl5IYBdhLWcg3wVltf#23086139


10
foo1.example.comfoo2.example.com 之间共享Cookie怎么样?这是否可能在 foo3.example.com 没有获取的情况下实现? - Dushyant Bangal
你有没有针对@DushyantBangal的相同问题找到任何解决方案? - PPB
根据我所做的研究,服务器只能为自己设置一个适用于 foo2.example.com 或其通配符子域名适用于 *.foo2.example.com 的 Cookie。 - Dushyant Bangal
1
@PranavBilurkar ... 所以要实现我所提到的,就必须在 foo1.example.comfoo2.example.com 上调用 API,并设置它们各自的 cookie。 - Dushyant Bangal
1
实际上我的问题是:“我有7个网站,都是以.example.com结尾的,这些网站共享同一个cookie。但是我想要在media.example.com上排除共享cookie。” - PPB
@sibin,这样做一个认证服务器是否推荐(并且安全)?例如,我有一个名为service.example.com的服务和一个登录页面在example.com。然后,在用户登录时在example.com设置一个cookie,我将能够从service.example.com使用该cookie。这样可以吗?您可以理解我没有其他程序使用example.com认证服务器。 - RealZombs

2

实际上,有一种简单而完全跨浏览器支持的方法可以在原始域和子域之间共享cookie,但您应该在设置时间内共享它,为了在浏览器中轻松处理cookie问题,我使用js-cookie,通过以下设置cookie,它可以在原始域和其所有子域之间共享:

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

// a . added before domain name

提示: 添加这个.将会与所有子域名共享cookie。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接