SameSite cookie、框架、子域和重定向
SameSite cookies, frames, sub domains and redirections
Cookies 的 SameSite
概念绝对是一个很难掌握的概念...
为准备 Chrome 80 的更改,我正在尝试衡量缺少 SameSite
属性对我的 cookie 的影响。我有以下配置:
- 用户最初访问main.mysite.com
- main.mysite.com 设置 SomeCookie (
Set-Cookie: SomeCookie=value; path=/; secure; httponly
) 并重定向到 auth.mysite.com
- 用户在 auth.mysite.com 上进行身份验证并被重定向回 main.mysite.com(POST 请求)
因为 main.mysite.com 和 auth.mysite.com 之间的重定向被视为同一站点,并且因为缺少 SameSite
属性被 Chrome 80 视为 SameSite=Lax
,这很好用。
但是,当 main.mysite.com 嵌入到另一个站点托管的页面的框架中时(比如 othersite.com), SomeCookie 在第 3 步没有发送回 main.mysite.com:
这正常吗?为什么?
首先,我假设 cookie 的 domain
属性设置为 auth.mysite.com
而不是 .mysite.com
。如果 cookie 的 domain 属性是 auth.mysite.com
,则 auth.mysite.com 和main.mysite.com 不 被视为 SameSite。
您需要将 cookie 域 属性 设置为 .mysite.com
以便浏览器可以看到两个站点之间的共享来源并将它们视为同一站点.
我对你的问题的回复:是的,SomeCookie没有发回是正常的main.mysite.com,当你在使用iframe时,原因如下:
- 在没有
sameSite
属性的情况下,属性的值被视为Lax
SameSite=Lax
与 SameSite=Strict
几乎完全相同,除了 SameSite=Lax
还允许随 'Top-level navigations'[=55= 发送 cookie ].顶级导航是当 URL 栏内的值发生变化时的导航类型。 iframe 上下文未被解释为顶级导航。
如果您想让您的 cookie 可用于 iframe 上下文,您可以做两件事:
- 将
sameSite
属性值设置为none
,同时将secure
属性值设置为true
这样,你明确地告诉浏览器你的意图(这是跨站点身份验证)。
- 如果你将 cookie 的
domain
属性设置为 .mysite.com
,那么你甚至可以使用 SameSite=Strict
,即它们将是解释为同一站点,因此无需额外注意。
上面的答案是不正确的...让我澄清一些困惑。
1.就 SameSite 而言,2 个站点何时是“同一站点”?
无论 cookie 的域属性如何,如果两个站点的 eTLD+1(也称为可注册域)相同,则它们被视为相同。请参阅我的回答 以获得更详细的解释。
所以在这种情况下,假设 eTLD 是“.com”,我们会认为 auth.mysite.com 和 main.mysite.com 是同一个站点,因为 eTLD+1 是 mysite.com两个都。另一方面,anything.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(但不是您的外部域,例如)。
默认设置(对于未明确设置域属性的 cookie)是仅将 cookie 发送到设置了 cookie 的域。 (没有子域。)
您不能设置与请求的 URL 不匹配的域属性。
(此外,cookie 不存在“来源”属性。)
3。那么Domain和SameSite有什么关系呢?
没有。它们是独立的 cookie 属性。 Domain 不关心 same-site/cross-site 上下文,SameSite 不关心 cookie 的 domain/subdomain 范围。
4.当 mysite.com 嵌入到 othersite.com 上的 iframe 中时,为什么不发送 default-Lax cookie?
这被认为是跨站点上下文,因为用户 URL 栏中的站点是 othersite.com 而请求是向 mysite.com 发出的,并且它们有两个不同的 eTLD +1。
因为它在 iframe 中,所以这不是顶级导航,因此所有跨站点请求都将排除 SameSite cookie。
如果它 是 顶级导航(用户点击 link 将他们从 othersite.com 带到 mysite.com),那么请求方法很重要。在绝大多数情况下,这将是一个 GET 请求,因此将发送处于 Lax 模式的 cookie 。
希望这对您有所帮助!详情请参考最新版spec
Cookies 的 SameSite
概念绝对是一个很难掌握的概念...
为准备 Chrome 80 的更改,我正在尝试衡量缺少 SameSite
属性对我的 cookie 的影响。我有以下配置:
- 用户最初访问main.mysite.com
- main.mysite.com 设置 SomeCookie (
Set-Cookie: SomeCookie=value; path=/; secure; httponly
) 并重定向到 auth.mysite.com - 用户在 auth.mysite.com 上进行身份验证并被重定向回 main.mysite.com(POST 请求)
因为 main.mysite.com 和 auth.mysite.com 之间的重定向被视为同一站点,并且因为缺少 SameSite
属性被 Chrome 80 视为 SameSite=Lax
,这很好用。
但是,当 main.mysite.com 嵌入到另一个站点托管的页面的框架中时(比如 othersite.com), SomeCookie 在第 3 步没有发送回 main.mysite.com:
这正常吗?为什么?
首先,我假设 cookie 的 domain
属性设置为 auth.mysite.com
而不是 .mysite.com
。如果 cookie 的 domain 属性是 auth.mysite.com
,则 auth.mysite.com 和main.mysite.com 不 被视为 SameSite。
您需要将 cookie 域 属性 设置为 .mysite.com
以便浏览器可以看到两个站点之间的共享来源并将它们视为同一站点.
我对你的问题的回复:是的,SomeCookie没有发回是正常的main.mysite.com,当你在使用iframe时,原因如下:
- 在没有
sameSite
属性的情况下,属性的值被视为Lax
SameSite=Lax
与SameSite=Strict
几乎完全相同,除了SameSite=Lax
还允许随 'Top-level navigations'[=55= 发送 cookie ].顶级导航是当 URL 栏内的值发生变化时的导航类型。 iframe 上下文未被解释为顶级导航。
如果您想让您的 cookie 可用于 iframe 上下文,您可以做两件事:
- 将
sameSite
属性值设置为none
,同时将secure
属性值设置为true
这样,你明确地告诉浏览器你的意图(这是跨站点身份验证)。 - 如果你将 cookie 的
domain
属性设置为.mysite.com
,那么你甚至可以使用SameSite=Strict
,即它们将是解释为同一站点,因此无需额外注意。
上面的答案是不正确的...让我澄清一些困惑。
1.就 SameSite 而言,2 个站点何时是“同一站点”?
无论 cookie 的域属性如何,如果两个站点的 eTLD+1(也称为可注册域)相同,则它们被视为相同。请参阅我的回答
所以在这种情况下,假设 eTLD 是“.com”,我们会认为 auth.mysite.com 和 main.mysite.com 是同一个站点,因为 eTLD+1 是 mysite.com两个都。另一方面,anything.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(但不是您的外部域,例如)。
默认设置(对于未明确设置域属性的 cookie)是仅将 cookie 发送到设置了 cookie 的域。 (没有子域。)
您不能设置与请求的 URL 不匹配的域属性。
(此外,cookie 不存在“来源”属性。)
3。那么Domain和SameSite有什么关系呢?
没有。它们是独立的 cookie 属性。 Domain 不关心 same-site/cross-site 上下文,SameSite 不关心 cookie 的 domain/subdomain 范围。
4.当 mysite.com 嵌入到 othersite.com 上的 iframe 中时,为什么不发送 default-Lax cookie?
这被认为是跨站点上下文,因为用户 URL 栏中的站点是 othersite.com 而请求是向 mysite.com 发出的,并且它们有两个不同的 eTLD +1。
因为它在 iframe 中,所以这不是顶级导航,因此所有跨站点请求都将排除 SameSite cookie。
如果它 是 顶级导航(用户点击 link 将他们从 othersite.com 带到 mysite.com),那么请求方法很重要。在绝大多数情况下,这将是一个 GET 请求,因此将发送处于 Lax 模式的 cookie 。
希望这对您有所帮助!详情请参考最新版spec