SameSite cookies、框架、子域名和重定向

16

SameSite属性对于Cookies的概念确实很难理解...

为了应对Chrome 80的更改,我正在尝试衡量缺少SameSite属性对我的cookies的影响。我有以下配置:

  1. 用户最初访问main.mysite.com
  2. main.mysite.com设置SomeCookie (Set-Cookie: SomeCookie=value; path=/; secure; httponly)并重定向到auth.mysite.com
  3. 用户在auth.mysite.com上进行身份验证并被重定向回main.mysite.com (POST请求)

因为在main.mysite.comauth.mysite.com之间的重定向被视为同一站点,并且因为Chrome 80将缺少SameSite属性视为SameSite=Lax,所以这样做是可以正常工作的。

然而,当main.mysite.com嵌入到托管在另一个站点(比如othersite.com)上的页面中时,SomeCookie不会在步骤3中发送回main.mysite.com

Illustration showing what the problem happening

这是正常的吗?为什么会这样?

2个回答

35

上面的回答是不正确的...让我澄清一些混淆点。

1. 在SameSite中,什么情况下两个站点被视为“同一站点”?

无论cookie的Domain属性如何,当两个站点的eTLD+1(也称可注册域)相同时,它们被认为是相同的。有关更详细的说明,请参见我的答案这里

因此,在这种情况下,假设eTLD为“.com”,我们会认为auth.mysite.com和main.mysite.com是同一个站点,因为它们的eTLD+1都是mysite.com。另一方面,anything.mysite.com和othersite.com始终是跨站点的。无论是顶级导航还是子资源请求(例如iframe中的图像或文档),这都是正确的。

2. Domain属性是什么意思?

如果使用Set-Cookie:cookiename=cookievalue; Domain=mysite.com设置了cookie,则该cookie将在发送到匹配*.mysite.com的任何域的请求上发送(即所有子域)。

这是调整cookie范围的一种方式。例如,您可以使用Domain=mysite.com设置全局cookie,所有您的域都关心,以及Domain=corp.mysite.com用于所有公司内部域都关心的cookie(但不包括您的外部面向域,例如)。

默认情况下(对于未明确设置Domain属性的cookie),仅将cookie发送到设置cookie的域。 (没有子域。)

您无法设置与请求URL不匹配的Domain属性。

(此外,不存在cookie的“origin”属性。)

3. 那么Domain与SameSite有什么关系?

没有关系。它们是独立的cookie属性。Domain不关心同一站点/跨站点上下文,而SameSite不关心cookie的域/子域范围。

4. 当mysite.com嵌入othersite.com的iframe中时,默认的Lax cookie为什么不会被发送?

这被视为跨站点上下文,因为用户URL栏中的站点是othersite.com,而请求是针对mysite.com进行的,这两个站点具有不同的eTLD +1。

因为它在iframe中,所以这不是顶级导航,因此所有跨站点请求都将排除SameSite cookie。

如果它是一个顶级导航(用户单击链接从othersite.com转到mysite.com),那么请求方法将很重要。在绝大多数情况下,这将是一个GET请求,因此处于Lax模式的cookie将会被发送。

希望这可以帮助您!您可以参考最新版本的规范获取更多详细信息。


感谢您提供详细的答案,我认为这4个要点非常有道理。然而,它并没有真正回答我的问题。如果您看一下问题中的场景,并在框架内进行操作,当_auth.mysite.com_重定向回_main.mysite.com_时,对我来说仍然不合理,因为两者被视为Same-Site(所有这些都发生在框架内)。您如何解释这一点? - Gyum Fox
答案肯定在这里:https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-5.2.1(感谢@chlily指向规范),但我很难解释它(它非常复杂!) - Gyum Fox
3
好的,请告诉我是否理解正确:1.用户访问othersite.com,该网站嵌入了main.mysite.com的iframe。2.在对main.mysite.com的请求中,服务器发送一个包含SomeCookie的Set-Cookie,然后重定向到auth.mysite.com。3.(仍在iframe内)auth.mysite.com回传给main.mysite.com,此时这个POST请求缺少SomeCookie。-- 在这种情况下,步骤1中对main.mysite.com的请求是跨站点的,并且由于它不是顶级请求,在第2步中浏览器将不接受任何SameSite cookie。因此,在第3步中,甚至没有可以发送的cookie。 - chlily
2
@GermanQuinteros 这一定是其他问题。如果 SameSite='None',则应该提供 cookie。确保属性实际应用于 cookie 中,有时需要更新框架才能设置属性(例如,我们使用的是 .Net Core 2.2,并且必须更新到最新的 2.2.8 版本)。 - Gyum Fox
@GyumFox,感谢您的回复。是的,问题与我使用的处理cookie的库有关。解决方案是更新该库,现在它按预期工作。 - German Quinteros
显示剩余6条评论

3
首先,我假设cookie的"domain"属性设置为"auth.mysite.com"而不是".mysite.com"。如果cookie的域属性是"auth.mysite.com",那么"auth.mysite.com"和"main.mysite.com"不被视为SameSite。
您需要将cookie的域属性设置为".mysite.com",以便浏览器可以看到两个站点之间的共享源,并将它们视为同一站点。
对于你的问题,我的回答是:当你使用iframes时,SomeCookie不被发送回main.mysite.com是正常的,原因如下:
- 在缺少"sameSite"属性的情况下,属性值被视为"Lax" - "SameSite=Lax"几乎与"SameSite=Strict"完全相同,除了事实上"SameSite=Lax"也允许在"Top-level navigations"中发送cookie。顶级导航是指URL栏中的值更改的导航类型。iframe上下文不被解释为顶级导航。
如果要使cookie在iframe上下文中可用,您可以执行以下两个操作:
- 将"sameSite"属性值设置为"none",同时将"secure"属性值设置为"true"。通过这种方式,您明确告诉浏览器您的意图(即跨站点身份验证)。 - 如果您将cookie的"domain"属性设置为".mysite.com",则甚至可以使用"SameSite=Strict",即它们将被解释为同一站点,因此不需要额外的注意。

你猜对了,cookie是为每个子域设置的。而且,SameSite=None也可以正常工作。不过,“同一站点”的概念还是有点困惑,因为我从这个答案中了解到_auth.mysite.com_和_main.mysite.com_会被视为“同一站点”(因为TLD是_.com_)。我猜这只在“顶级导航”的上下文中才会这样处理。 - Gyum Fox
想象一下,有人将“ .com”分配给Cookie的域属性。如果浏览器不检查公共后缀列表(PSL)并接受它,那么该Cookie将被附加到以.com结尾的每个请求中,无论是gmail.com还是facebook.com。正是PSL能够说“此Cookie的“.com属性不足以说明gmail.com和facebook.com是相同的站点”。在您的示例中,您的Cookie不需要经过PSL检查,因为它已经足够长,可以排除授权子域名和主子域名,反之亦然。 - Omer Gurarslan
如果cookie的域属性是auth.mysite.com,则不认为auth.mysite.com和main.mysite.com是SameSite。实际上,这是错误的,供您参考。Cookie的域属性与SameSite属性是分开的。两个站点是否为“同一站点”的概念基于公共后缀列表。有关更多详细信息,请参见我在此处的回复(https://dev59.com/p7joa4cB1Zd3GeqPCq0V#59773164)。因此,auth.mysite.com和main.mysite.com始终是同一站点。 - chlily
抱歉,我不同意。这可以很容易地进行测试,我已经测试过了。要将两个URI视为同一站点,需要满足两个条件:1- cookie的域属性必须与URI匹配;2- PSL检查必须通过。 - Omer Gurarslan
引用自MDN: "Cookie与特定的域和协议(如http或https)相关联,如果设置了Set-Cookie Domain属性,则还可以与子域相关联。如果cookie域和协议与当前页面匹配,则将cookie视为来自页面相同的站点,并称其为第一方Cookie"。- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies#third-party_cookies - Omer Gurarslan

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