配置 cookie 以使用 CORS,但仅限于子域
Configure a cookie to work with CORS, but only on subdomains
我正在尝试找出一种方法来使 cookie-based 身份验证工作,当前端和后端是两个不同的子域时,不会让我自己暴露于 CSRF 威胁。
目前,我正在将 cookie 属性 sameSite 设置为“None”。问题是,这完全使站点暴露于 CSRF 攻击。
例如,这是我的 cookie,sameSite 设置为“lax”:
cookieName=cookieValue; expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; httponly; SameSite=Lax; Secure; Domain=some-sub-domain.localhost;
如果我的 React 应用程序在 locahost:3000 上运行,这是相同的域但不同的子域(和端口..),这仅适用于 sameSite=None。如果 sameSite 更改为“宽松”或“严格”,我会在网络选项卡中收到以下错误,在 set-cookie header:
旁边
This attempt to set a cookie via Set-Cookie header was blocked because it had the "SameSite=Lax" attribute but came from a cross-site response which was not the response to a top-level navigation.
我尝试了所有可能的配置(包括“.localhost”),唯一似乎有效的方法是将 SameSite 设置为“None”,但这会使我的网站完全暴露在 CSRF 攻击之下(假设我不包含一些 CSRF 令牌,这是另一回事)。
我的想法是简单地允许 cookie 在子域之间传输,同时在不同的域上阻止它们。我的意思是,任何子域最终都会在我的控制之下。
能做到吗?
如果有人感兴趣,我发现了“问题”:
它是“localhost”。它不是“正常”域。它不是 localhost.com 或 localhost.net- 它只是普通的本地主机。
因此,设置像 frontend.localhost 和 backend.localhost 这样的“子域”是行不通的(除非你使用 sameSite=none),因为它们实际上是完全不同的域,而不是子域
要在本地解决此问题,您应该在操作系统的主机文件中设置虚拟主机。像 frontend.local.xyz 和 backend.local.xyz 这样的东西。 “local.xyz”是本例中的实际域,其他都是子域。这解决了“问题”,并允许“严格”cookie 在它们之间传输。
请注意,如果您的域在此列表中,这仍然无效:
https://publicsuffix.org/list/public_suffix_list.dat
我正在尝试找出一种方法来使 cookie-based 身份验证工作,当前端和后端是两个不同的子域时,不会让我自己暴露于 CSRF 威胁。
目前,我正在将 cookie 属性 sameSite 设置为“None”。问题是,这完全使站点暴露于 CSRF 攻击。
例如,这是我的 cookie,sameSite 设置为“lax”:
cookieName=cookieValue; expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; httponly; SameSite=Lax; Secure; Domain=some-sub-domain.localhost;
如果我的 React 应用程序在 locahost:3000 上运行,这是相同的域但不同的子域(和端口..),这仅适用于 sameSite=None。如果 sameSite 更改为“宽松”或“严格”,我会在网络选项卡中收到以下错误,在 set-cookie header:
旁边This attempt to set a cookie via Set-Cookie header was blocked because it had the "SameSite=Lax" attribute but came from a cross-site response which was not the response to a top-level navigation.
我尝试了所有可能的配置(包括“.localhost”),唯一似乎有效的方法是将 SameSite 设置为“None”,但这会使我的网站完全暴露在 CSRF 攻击之下(假设我不包含一些 CSRF 令牌,这是另一回事)。
我的想法是简单地允许 cookie 在子域之间传输,同时在不同的域上阻止它们。我的意思是,任何子域最终都会在我的控制之下。
能做到吗?
如果有人感兴趣,我发现了“问题”:
它是“localhost”。它不是“正常”域。它不是 localhost.com 或 localhost.net- 它只是普通的本地主机。
因此,设置像 frontend.localhost 和 backend.localhost 这样的“子域”是行不通的(除非你使用 sameSite=none),因为它们实际上是完全不同的域,而不是子域
要在本地解决此问题,您应该在操作系统的主机文件中设置虚拟主机。像 frontend.local.xyz 和 backend.local.xyz 这样的东西。 “local.xyz”是本例中的实际域,其他都是子域。这解决了“问题”,并允许“严格”cookie 在它们之间传输。
请注意,如果您的域在此列表中,这仍然无效: https://publicsuffix.org/list/public_suffix_list.dat