Cookie的SameSite
概念绝对很难理解...
为准备Chrome 80的更改,我正在尝试评估缺少SameSite
属性对我的cookie的影响。我有以下配置:
Set-Cookie: SomeCookie=value; path=/; secure; httponly
)并重定向到 auth.mysite.com 由于 main.mysite.com 和 auth.mysite.com 之间的重定向被视为同一站点,并且因为缺少SameSite
属性被视为SameSite=Lax
在Chrome 80上运行正常。
但是,当 main.mysite.com 嵌入另一个网站(例如 othersite.com )托管的页面的框架中时, SomeCookie 在步骤3中不会发送回 main.mysite.com 。
这正常吗?为什么?
答案 0 :(得分:7)
上面的答案是不正确的...让我澄清一些困惑。
1。对于SameSite而言,两个站点何时是“相同站点”?
无论cookie的Domain属性如何,当两个站点的eTLD + 1(又称为可注册域)相同时,它们被视为相同。有关更详细的说明,请参见我的答案here。
因此,在这种情况下,假设eTLD为“ .com”,我们将auth.mysite.com和main.mysite.com视为同一站点,因为这两个eTLD + 1均为mysite.com。另一方面,everything.mysite.com和othersite.com始终是跨站点的。无论是顶层导航还是子资源请求(例如iframe中的图像或文档),都是如此。
2。域属性是什么意思?
如果将Cookie设置为Set-Cookie: cookiename=cookievalue; Domain=mysite.com
,则该Cookie将根据请求发送到与* .mysite.com匹配的任何域(即所有子域)。
这是一种调整Cookie范围的方法。例如,您可以将Domain=mysite.com
用作您所有域都关心的全局cookie,并将Domain=corp.mysite.com
用作公司所有内部域都关心的cookie(但不使用面向外部的域,例如)。
默认设置(对于未明确设置Domain属性的cookie)是仅将cookie发送到设置cookie的域。 (无子域。)
您不能设置与请求的网址不匹配的域属性。
(而且,没有cookie的“起源”属性之类的东西。)
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请求,因此会发送 松散模式的cookie。
希望这会有所帮助!您可以参考spec的最新版本以了解更多详细信息。
答案 1 :(得分:0)
首先,我假设Cookie的domain
属性设置为 auth.mysite.com
而不是 .mysite.com
em>。如果Cookie的 domain 属性是 auth.mysite.com
,则 auth.mysite.com 和 main.mysite.com < / em>被 不是 视为SameSite。
您需要将cookie域属性设置为 .mysite.com
,以便浏览器可以看到两个站点之间的共享来源并将它们视为同一站点。
我对您问题的回答:是的,当您将 SomeCookie 不发送回 main.mysite.com 是正常的由于以下原因而使用iframe:
sameSite
属性的情况下,该属性的值被视为Lax
SameSite=Lax
与SameSite=Strict
几乎完全相同,除了SameSite=Lax
还允许沿着“顶级导航” 发送cookie。网址栏内的值更改时,顶级导航是一种导航类型。 iframe上下文不会被解释为顶级导航。如果您想让Cookie适用于iframe上下文,则可以做两件事:
sameSite
属性值设置为none
,同时将secure
属性值设置为true
这样,您可以明确告诉浏览器您的意图(是跨站点身份验证)。 domain
属性设置为 .mysite.com
,那么您甚至可以使用SameSite=Strict
,即它们将被解释为同一站点因此不需要额外的注意。