浏览器cookie域如何工作?


380

由于我遇到的奇怪的域/子域Cookie问题,我想知道浏览器如何处理Cookie。如果他们以不同的方式来做,那么了解它们之间的差异也将很高兴。

换句话说-当浏览器收到一个cookie时,该cookie可能有一个域和一个附加的路径。是否可以,在这种情况下,浏览器可能会用一些默认值替代它们。问题1:它们是什么?

稍后,当浏览器将要发出请求时,它将检查其cookie并过滤出应为该请求发送的cookie。它通过将它们与请求路径和域进行匹配来实现。问题2:有哪些匹配规则?


添加:

我问这个的原因是因为我对一些极端情况感兴趣。喜欢:

  • .example.com可以使用Cookie www.example.com吗?
  • .example.com可以使用Cookie example.com吗?
  • example.com可以使用Cookie www.example.com吗?
  • example.com可以使用Cookie anotherexample.com吗?
  • www.example.com能够设置cookie中example.com
  • www.example.com能够设置cookie中www2.example.com
  • www.example.com能够设置cookie中.com
  • 等等。

新增2:

另外,有人可以建议我应该如何设置Cookie,以便:

  • 可以通过www.example.com或设置example.com
  • www.example.com和均可访问example.com

Answers:


367

尽管现在有应该定义cookie 的RFC 2965Set-Cookie2已经过时的RFC 2109),但是大多数浏览器并不完全支持cookie,而只是符合Netscape原始规范

属性值和有效域之间是有区别的:前者来自Set-Cookie标头字段,后者是对该属性值的解释。根据RFC 2965,以下内容应适用:

  • 如果Set-Cookie标头字段具有Domain属性,则有效域是请求的域。
  • 如果存在“ 域”属性,则其值将用作有效域(如果该值不以开头,.则它将由客户端添加)。

拥有有效域后,它还必须当前请求的域进行域匹配以进行设置;否则,cookie将被修改。相同的规则适用于选择要在请求中发送的cookie。


将这些知识映射到您的问题上,应遵循以下条件:

  • Cookie的使用Domain=.example.com 可用于www.example.com
  • Cookie的使用Domain=.example.com 可用于example.com
  • Cookie与Domain=example.com将被转换为.example.com并因此也可用于www.example.com
  • Cookie的使用Domain=example.com不会用于提供anotherexample.com
  • www.example.com 能够为example.com设置cookie
  • www.example.com无法www2.example.com设置cookie
  • www.example.com无法.com设置Cookie

并且要设置和读取www.example.comexample.com的cookie .www.example.com,请.example.com分别为和设置它。但是第一个(.www.example.com)仅可用于该域下的其他域(例如foo.www.example.combar.www.example.com),而example.com.example.com下的任何其他域(例如foo)也可以访问该域。 example.combar.example.com)。


@Gumbo所以abcexample.com可以使用域c.example.com访问cookie吗?
Pacerier

2
后期跟进的问题这一个。我自己的经验和经验:webmasters.stackexchange.com/questions/55790/…建议example.com的域不可用于www.example.com,但此示例另有建议。这个例子是错误的,还是我(很可能)误会了。抱歉,线程坏死了,但想确保对于像我这样的未来困惑新手来说,这个绝妙的答案是100%准确的:)
errah 2014年

7
这个答案有点过时了;请参阅下面的答案
宇2015年

1
为什么不将example.com设置可用于www.example.com?(因为它是example.com的“ www”子项?
Nabeel Khan

Set-Cookie2本身已过时。继续使用Set-Cookie。
joeforker

122

先前的答案有些过时。

RFC 6265于2011年发布,基于当时的浏览器共识。从那时起,公共后缀域出现了一些麻烦。我写了一篇文章解释当前情况-http://bayou.io/draft/cookie.domain.html

总而言之,有关Cookie域的规则如下:

  • Cookie 的原始域是原始请求的域。

  • 如果源域是IP,则不得设置cookie的域属性。

  • 如果未设置cookie的domain属性,则该cookie仅适用于其原始域。

  • 如果设置了cookie的domain属性,

    • Cookie适用于该域及其所有子域;
    • Cookie的域必须与原始域相同或作为其父域
    • Cookie的域不得为TLD,公共后缀或公共后缀的父级。

可以得出Cookie始终适用于其原始域的信息。

Cookie域不应像前面那样.foo.com-只需使用foo.com

举个例子,

  • x.y.z.com可以在Cookie域设置为自己或父母- ,x.y.z.com,。y.z.com z.com但不是com,这是一个公共后缀。
  • 与域一个cookie = y.z.com适用于y.z.comx.y.z.coma.x.y.z.com等。

公共后缀的例子- ,comeduuk,,co.ukblogspot.comcompute.amazonaws.com


5
@roelleor-相反。编写rfc6265是为了总结在实践中如何实际处理cookie :)是的,rfc可以准确反映主要浏览器的行为。我最近在浏览器上进行的测试证实了这一点。但是,在涉及公共后缀的特殊情况下,它们可能有所不同。
ZhongYu 2015年

2
前导点的后果是什么?
UpTheCreek

3
@UpTheCreek-根据rfc6265,客户应忽略前导点
ZhongYu

2
x.y.z.com可以将cookie设置为不是很奇怪z.com吗?
Royi Namir

1
因此,如果xyzcom可以将cookie设置为yzcom,并且域名为yzcom的cookie适用于wyzcom ...这是否意味着xyzcom可以将cookie设置为wyzcom
伊安娜(Ioanna)

9

有关广泛的内容,请查阅RFC2965的内容。当然,这并不一定意味着所有浏览器的行为都完全相同。

但是,通常,如果Cookie中未指定任何默认路径,则默认路径的规则是Set-Cookie标头从其到达的URL中的路径。同样,域的默认值是Set-Cookie到达的URL中的完整主机名。

域的匹配规则要求Cookie域与要向其发出请求的主机匹配。Cookie可以通过包含*指定更广泛的域匹配。在Set-Cookie的domain属性中(浏览器的这一区域可能有所不同)。匹配路径(假设域匹配)很简单,请求的路径必须在cookie上指定的路径内。通常,会话cookie是使用path = /或path = / applicationName /设置的,因此cookie可供应用程序中的所有请求使用。


回复:

  • .example.com的cookie是否可用于www.example.com?
  • .example.com的cookie是否可用于example.com? 不知道
  • www.example.com是否可以使用example.com的cookie?应该不会,但... *
  • example.com的cookie是否可用于anotherexample.com? 没有
  • www.example.com可以为example.com设置cookie吗?
  • www.example.com能够为www2.example.com设置cookie吗? (通过.example.com除外)
  • www.example.com可以为.com设置cookie吗? (无法在Cookie的名称空间上设置cookie,也不能为.co.uk之类的设置cookie)

*我现在无法对此进行测试,但我暗示至少IE7 / 6会将路径example.com视为真实路径 .example.com


我在问题中添加了一些有趣的边缘案例。你可以赞一下吗?
Vilx-

8

此问题的最后一个(确切地说是第三个)RFC是RFC-6265(已淘汰RFC-2965,而后者又淘汰了RFC-2109)。

根据它,如果服务器省略了Domain属性,则用户代理将cookie仅返回到原始服务器(给定资源所在的服务器)。但这同时也警告某些现有用户代理将缺少的Domain属性视为存在Domain属性并包含当前主机名(例如,如果example.com返回不带Domain属性的Set-Cookie标头,则这些用户代理会也会将Cookie错误地发送到www.example.com)。

指定了Domain属性后,它将被视为完整的域名(如果属性中有前导点,它将被忽略)。服务器应匹配属性中指定的域(具有完全相同的域名或作为其子域)以获取此cookie。更准确地说是在这里指定的

因此,例如:

  • cookie属性Domain=.example.com等效于Domain=example.com
  • 具有此类Domain属性的Cookie将用于example.comwww.example.com
  • 具有此类Domain属性的Cookie 不适用于 another-example.com
  • 指定类似cookie的属性Domain=www.example.com将关闭www4.example.com的方式

PS:“域”属性中的尾部逗号将导致用户代理忽略该属性=(


6

我在2019年的最新Chrome,Firefox,Safari中测试了所有情况。

回复:

  • .example.com的cookie是否可用于www.example.com?
  • .example.com的cookie是否可用于example.com?
  • www.example.com是否可以使用example.com的cookie?,没有通配符的域只能匹配自己。
  • example.com的cookie是否可用于anotherexample.com?没有
  • www.example.com可以为example.com设置cookie吗?,它将能够为“ .example.com”设置cookie,但不能为“ example.com”设置cookie。
  • www.example.com能够为www2.example.com设置cookie吗?NO。但是它可以为.example.com设置cookie,www2.example.com可以访问它。
  • www.example.com可以为.com设置cookie吗?没有


3

有一些规则可以确定浏览器是否接受Set-header响应头(服务器端cookie编写),使用Javascript设置cookie的规则/解释稍有不同(我尚未测试VBScript)。

然后是确定浏览器是否将与页面请求一起发送cookie的规则。

主要浏览器引擎之间的区别在于如何处理域匹配以及如何解释路径值中的参数。您可以在文章“不同的浏览器如何不同地处理Cookie”中找到一些经验证据。


2

我很惊讶地阅读有关拒绝Cookie的3.3.2节:

http://tools.ietf.org/html/rfc2965

也就是说,浏览器应拒绝域为.z.com的xyzcom的cookie,因为“ xy”包含一个点。因此,除非我对RFC和/或以上问题有误解,否则可能会添加以下问题:

.example.com的cookie是否可用于www.yyy.example.com?没有。

由源服务器www.yyy.example.com(域为.example.com)设置的cookie是否具有由用户代理发送到xxx.example.com的值?没有。


2
那个rfc已经过时了。根据浏览器共识,新的rfc 6265允许将cookie z.com用于z.com所有子域。
中雨

1

www.example.com能够设置cookie中.com

否,但是example.com.fr可以为设置Cookie example2.com.fr。Firefox通过维护TLD列表来防止这种情况:http : //securitylabs.websense.com/content/Blogs/3108.aspx

显然Internet Explorer不允许两个字母的域设置cookie,我想这解释了为什么o2.ie简单地重定向到o2online.ie。我经常想知道。


“ com.fr”被称为“公共后缀”。cookie域不能是公共后缀。参见rfc 6265和publicsuffix.org
2015年

是的,有一个解决方案,但这是一个非常混乱的解决方案。此类标签应放入DNS中,而不是单独进行。
TRiG 2015年

是的,也许您指的是“ dbound”。但这可能会带来更多问题。例如,这对http客户端实现构成了挑战。
2015年

如果此信息以某种方式从浏览器公开到javascript,将很有用。否则,无法以编程方式确定是否可以在特定级别的域上设置Cookie。毕竟,您无法每次通话都查看该列表!
迪普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.