配置 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