此 Set-Cookie 未指定“SameSite”属性,默认为“SameSite=Lax”-Localhost

Posted

技术标签:

【中文标题】此 Set-Cookie 未指定“SameSite”属性,默认为“SameSite=Lax”-Localhost【英文标题】:This Set-Cookie didn't specify a "SameSite" attribute and was default to "SameSite=Lax" - Localhost 【发布时间】:2021-08-21 14:12:04 【问题描述】:

我是一名前端开发人员,正在开发一个应用程序,其中login/ 响应在客户端上放置了一个 Session-Cookie。由于用户“登录”,以后的请求将被授权。

从 Chrome 80 开始

所有没有 SameSite 属性的 cookie 都将被视为指定了 SameSite=Lax。换句话说,它们将仅限于第一方(同一域上的服务器和客户端)。 如果您需要第三方 cookie(服务器和客户端在不同的域上),那么它们必须标有SameSite=None

默认限制为第一方

Set-Cookie: cname=cvalue; SameSite=Lax

在第三方环境中允许

Set-Cookie: cname=cvalue; SameSite=None; Secure

对于我的应用程序,我想要默认行为。我的客户端和服务器在 生产 中的同一域上运行。但在开发中,我在localhost(不同的域)工作。 到目前为止,chrome 在chrome://flags 下有特殊标志 - SameSite by default cookie。我可以在我的开发机器上启用这个标志并且登录通过了。在生产中,我不需要这个标志,因为我想要默认行为。

从 Chrome 91 开始

SameSite by default cookie 标志已被移除。这意味着从这个版本开始,如果不将其部署到生产环境,我将无法登录我的应用程序。

有谁知道我在本地工作时如何获取 Session-Cookie。但仍然保持SameSite=Lax 的安全性。如果可能,仅对客户端进行更改,但如果需要,也对服务器进行更改。

Chrome DevTools - SameSite 错误消息

Chrome 80 标志菜单 - 这些标志已在 Chrome 91 中删除

更新

我试图通过让服务器使用SameSite=None(仅限开发)来解决这个问题。 这会导致另一个错误:Connection isn't secure。这是因为在使用SameSite=None 时,您需要添加后缀Secure,并且诅咒使用HTTPS 连接。 安全连接有其自身的问题,例如必须为开发中的证书付费。

【问题讨论】:

您是否尝试过将此标志 chrome://flags/#schemeful-same-site 设置为 Disabled 【参考方案1】:

解决方法:降级 Chrome

这不是解决方案!对于像我这样的人来说,这只是一个临时的解决方法,他的工作是如何因为这次更新而停止的。

卸载 Chrome 转到“添加或删除程序”并卸载 Chrome。请注意,Cookie 和保存的浏览器密码等用户数据可能会丢失。 从slimjet.com 或任何其他网站下载 Chrome v90。然后安装 Chrome。 防止自动更新 Chrome,根据这个***解决方案:打开C:\Program Files (x86)\Google\Update 将文件 GoogleUpdate.exe 重命名为 GoogleUpdate2.exe。 这将导致 Chrome 找不到更新包。 更新标志 - 打开 Chrome 并输入:chrome://flags 搜索 #same-site-by-default-cookies禁用标记

【讨论】:

如果您不想卸载当前的 Chrome,您可以使用来自 cypress 的 Chromium dev build:chromium.cypress.io/mac/beta/90.0.4430.40。另外,感谢您可以跳过此“防止自动更新”步骤【参考方案2】:

我找到了解决方法并与大家分享:-)

描述出现在问题部分:

如果应该发送 cookie,请指定 SameSite=None 和 Secure 跨站请求。这允许第三方使用。

在开发者工具部分,转到应用程序选项卡,然后在左侧转到 Cookie:

您要与其他域共享的cookie,标记安全 检查并在 Samesite 中放置无。在本地更新站点选项卡,您 将能够使用允许您通过 来源域

我希望这会让你的一天更加美好

【讨论】:

正如我在提供相同解决方案的不同答案中已经提到的 - 这不起作用!在“应用程序”选项卡中,您只会看到已成功设置的 cookie。但在我的情况下,cookie 设置失败,所以它没有出现在该列表中 抱歉,但该解决方案的目的是使第三方 cookie 可以被其他站点(例如 localhost)使用,这就是 Samesite 属性的基础。要在 localhost 上设置开发 cookie,您必须在浏览器选项卡中访问开发环境,如果 cookie 存在,应用修改 Samesite = None Secure-> 检查,以便可以从 localhost 选项卡使用它【参考方案3】:

在我们的例子中,我们还可以在不同的端口上本地运行我们的服务器,并将我们的客户端应用程序指向该 localhost 地址以用于开发目的。

例如,我在localhost:1234 上运行客户端应用程序,并向localhost:5678 上运行的服务器的本地副本发送请求。这可确保成功设置 cookie,因为客户端和服务器现在是“SameSite”。

诚然,这可能更像是一种变通方法而不是解决方案,但我希望它在短期内有所帮助。

【讨论】:

开发过程中无法在同一台机器上运行服务器和客户端【参考方案4】:

您可以在开发工具中手动将 SameSite 属性设置为“无”+勾选“安全”。

这样您就不必修改生产环境(将 cookie 保持为 SameSite=Lax)。

【讨论】:

如何在开发工具中设置cookie属性? 在“应用程序”选项卡中,转到左侧的“Cookies”。然后您将看到当前站点的所有 cookie,选择站点并在列表中双击您要更改的 cookie 条目。对于 ***,它是这样的:Application -> Cookies -> ...***....-> 然后有 5 个 cookie 的列表,双击最后一个的 SameSite 条目,输入“None” - Done。跨度> 不幸的是,这不起作用。在“应用程序”选项卡中,您只会看到已成功设置的 cookie。但在我的情况下,cookie 设置失败,所以它没有出现在该列表中

以上是关于此 Set-Cookie 未指定“SameSite”属性,默认为“SameSite=Lax”-Localhost的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 SameSite 属性?

即使指定了 samesite=none,浏览器也会使用 samesite=lax

Set-Cookie后,Cookie丢失问题解决(跨域)

Chrome升级后禁用三方Cookie,理解Cookie的SameSite新属性!

为啥我会收到“通过指定其 SameSite 属性指示是不是在跨站点请求中发送 cookie”?

Chrome Beta 问题:尽管 SameSite cookie 设置为“无”且安全,但未收到第三方 cookie