浏览器cookie域如何工作?

Vil*_*lx- 361 cookies dns rules http path

由于我遇到了奇怪的域/子域cookie问题,我想知道浏览器如何处理cookie.如果他们以不同的方式做到这一点,那么了解差异也会很好.

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

稍后,当浏览器即将发出请求时,它会检查其cookie并过滤掉它应该为该请求发送的cookie.它通过将它们与请求路径和域匹配来实现.问题2:匹配规则是什么?


添加:

我问这个的原因是因为我对一些边缘情况感兴趣.喜欢:

  • 饼干是否.example.com可供使用www.example.com
  • 饼干是否.example.com可供使用example.com
  • 饼干是否example.com可供使用www.example.com
  • 饼干是否example.com可供使用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.

Gum*_*mbo 348

虽然现在应该定义cookie 的RFC 2965(Set-Cookie2已经废弃的RFC 2109),但是大多数浏览器并不完全支持它,而只是遵守Netscape原始规范.

Domain属性值和有效域之间存在区别:前者取自Set-Cookieheader字段,后者是该属性值的解释.根据RFC 2965,以下内容应适用:

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

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


将这些知识映射到您的问题,以下内容应适用:

  • Cookie包含Domain=.example.com www.example.com上提供
  • Cookie.com 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).

  • 这个答案有点过时了; 请参阅下面的[我的回答](http://stackoverflow.com/a/30676300/2158288). (7认同)
  • *非常*跟进这个问题的后续问题.我自己的经验和这个:http://webmasters.stackexchange.com/questions/55790/setting-cookies-only-on-the-naked-domain建议example.com的域名不可用于www.example. com,但这个例子另有说明.这个例子是错误的,还是我(很可能)误解.对不起线程死灵,但想确保这个优秀的答案是100%准确的未来困惑的新手像我:) (2认同)

Zho*_*gYu 113

以前的答案有点过时了.

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

总结一下,有关cookie域的规则:

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

  • 如果原始域是IP,则不得设置cookie的域属性.

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

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

    • 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.com,x.y.z.com,a.x.y.z.com等.

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

  • @roelleor - 反过来了.编写rfc6265是为了总结实际上如何实际处理cookie :)是的,rfc非常准确地反映了主要浏览器的行为方式.我最近对浏览器的测试证实了这一点 但是,在涉及公共后缀的角落案件中,它们可能会有所不同. (5认同)
  • `xyzcom` 可以将 cookie 设置为 `z.com` 是不是很奇怪? (3认同)
  • 前导点的后果是什么? (2认同)
  • @UpTheCreek-根据rfc6265,客户端应忽略前导点 (2认同)
  • 那么如果xyzcom可以给yzcom设置一个cookie,一个域为yzcom的cookie就适用于wyzcom……那是不是意味着**xyzcom可以给wyzcom设置一个cookie**? (2认同)
  • @Ioanna,如果您在 xyzcom 的响应中谈论 cookie 的域属性值为 wyzcom,那么我认为答案是否定的。xyzcom 无法直接设置域为 wyzcom 的 cookie,因为 xyzcom 与 wyzcom 不进行域匹配,因为后者不是前者的后缀。但是,我认为 xyzcom 可以通过为 yzcom 设置 cookie 来间接为 wyzcom 设置 cookie,并且假设 yzcom 不是公共后缀,该 cookie 也会发送到 wyzcom (2认同)

Ant*_*nes 9

对于RFC2965的内容进行广泛的覆盖审查.当然,这并不一定意味着所有浏览器的行为都完全相同.

但是,一般情况下,如果cookie中没有指定默认路径,则规则是Set-Cookie标头到达的URL中的路径.类似地,域的默认值是Set-Cookie到达的URL中的完整主机名.

域的匹配规则要求cookie域与正在进行请求的主机匹配.Cookie可以通过include*指定更广泛的域匹配.在Set-Cookie的域属性中(浏览器可能会有所不同).匹配路径(假设域匹配)是一个简单的事情,请求的路径必须在cookie上指定的路径内.通常会话cookie使用path = /或path =/applicationName /设置,因此cookie可用于进入应用程序的所有请求.


对补充的回应:

  • www.example.com的.example.com cookie是否可用?
  • 是否可以为example.com提供.example.com的cookie? 不知道
  • www.example.com是否可以使用example.com的cookie?不应该......*
  • 是否可以为anotherexample.com提供example.com的cookie? 没有
  • www.example.com能否为example.com设置cookie?
  • www.example.com能否为www2.example.com设置cookie? (除了通过.example.com)
  • www.example.com能否为.com设置cookie? (不能在命名空间中设置一个cookie,也不能为.co.uk之类的东西设置一个).

*我现在无法对此进行测试,但我有一个暗示,至少IE7/6会像对待路径example.com那样对待 它.example.com.


Vic*_*mov 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
  • 具有此类“域”属性的Cookie将用于example.comwww.example.com
  • 具有此类Domain属性的Cookie 不适用于 another-example.com
  • 指定类似cookie的属性Domain=www.example.com将关闭www4.example.com的方式

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


xia*_*oke 8

我在 2019 年最新的 Chrome、Firefox、Safari 中测试了所有案例。

对补充的回应:

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

  • cookie 域中的前导域是一个用词不当。并且您的答案与 Mozilla 关于 Cookie 的文档直接矛盾:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie 请参阅域部分:`与早期规范相反,在域名(.example.com)将被忽略。` (2认同)

Jul*_*hke 5

众所周知,RFC 并不反映现实。

更好地检查Draft-ietf-httpstate-cookie,工作正在进行中。