我查了许多关于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.com 是否有可能为fuu.example.com
设置一个cookie。我知道 example.com 可能也为 example.com 的所有子域设置了.example.com
的cookie,但这不是我想要的。
如何为子域设置Cookie?我没有在子域请求中看到cookie。
答案 0 :(得分:43)
没有。 此外(请参阅下面的更新) cookie would get rejected: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 2109的当前规范RFC 6265确实忽略了前导点。但有效域的处理方式相同:
[...]如果Domain属性的值是 “
example.com
”,用户代理将在Cookie中包含Cookie 向 example.com , www.example.com 发出HTTP请求时的标头,以及 www.corp.example.com 。 (请注意,前导%x2E(“.
”),如果存在, 即使不允许该字符,也会被忽略,但是a 尾随%x2E(“.
”)(如果存在)将导致用户代理忽略 属性。)[...]用户代理将接受带有的cookie 来自“
example.com
”或“foo.example.com
”的域属性 foo.example.com ,但用户代理不接受带有的Cookie 域名属性为“bar.example.com
”或“baz.foo.example.com
”。
答案 1 :(得分:8)
如果域名在Set-Cookie标头中明确命名,则2个域example.com
和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。
总结,如果你设置一个类似于example.com
上面第二个例子的cookie,foo.example.com
可以访问它,反之亦然。
答案 2 :(得分:0)
实际上,在原始域和子域之间共享 cookie 有一种简单且完全跨浏览器的支持方式,但您应该在设置时间共享它,以便在我使用的浏览器中轻松处理 cookie 内容js-cookie
使用以下设置 cookie,它可以在原始域及其所有子域之间共享:
Cookie.set('key', 'value', { domain: '.domain.com' })
// a . added before domain name
提示:添加此 .
将与所有子域共享 cookie。