【发布时间】:2020-12-03 17:39:59
【问题描述】:
背景
我今天正在玩弄为我的 cookie 实现 SameSite 的方面。我已经有了HttpOnly 和Secure,所以我认为这可能没什么大不了的。
为什么会坏
好吧,结果是,一旦我实施了这个设置,很多东西就坏了。 SameSite=Lax 和 SameSite=Strict 都发生了这种情况。我做了一些研究,发现这是因为 SSO 容易在使用 Lax 或 Strict 的 SameSite 设置(而不是 None)时损坏:
- Upcoming Browser Behavior Changes: What Developers Need to Know
- SameSite Cookie Attribute: What It Is And Why It Matters
- Site compatibility-impacting changes coming to Microsoft Edge
- Microsoft Warns SameSite Cookie Changes Could Break Some Apps
- Adventures in Single-Sign-On: SameSite Doomsday
- SameSite cookies explained
我的主要浏览器(Iron 70)基于 Chromium 70,所以我之前从未遇到过在 2 月份向 Chrome 80 用户推出的更改,据说默认没有 SameSite 值的 cookie 为 Lax。我安装了最新的 Google Chrome Portable 来检查它,有趣的是,该功能目前不(谢天谢地)默认为 SameSite=Lax,因为它可能已经习惯了 - 我的网站只有在我显式启用以下标头:
Header edit Set-Cookie ^(.*)$ $1;SameSite=Lax
这似乎是因为没有明确的SameSite,Chromium 默认将其视为"LAX + POST w/ 2-minute rule"(我正在快速测试,所以在 2 分钟内)。
不过,即使使用Lax,我的所有单点登录都已损坏,并且我的实时聊天不再起作用 - 无论是使用 Websockets 还是 XHR 请求。当我尝试进行单点登录时,不知何故我最终退出了主网站,这也没有多大意义 - 基本上,一切都搞砸了。
-
有没有希望让 XHR 或 Websockets 再次与
Lax一起工作?我在chat.example.com上聊天,但我也允许在sub.someotherdomain.org的侧面板中访问它。我的猜测是这里的答案是否,解决它的唯一方法是在同一个域上提供一个 URL,Apache 只是在幕后指向同一个脚本。烦人,但它可以完成 - 但还有其他方法吗? -
我更大的问题是:单点登录本质上与
Lax和Strict不兼容吗?我并没有真正找到太多这样的方式。所有文章似乎都将使用Lax破坏 SSO 视为不可避免,甚至还有一些图表解释了它为什么它会破坏,但 SSO 必须是这样吗?
主流解决方法
大多数网站都说要使用SameSite=None 来解决这个问题并强制所有用户代理中的旧行为。从技术上讲,这是可行的,但我想知道是否有任何希望能够使用 Lax 代替?如何在不屈服于SameSite=None 的情况下使其工作?
【问题讨论】:
-
“Strict 对我来说似乎没什么用,因为如果一个指向您网站页面的链接被发布到论坛上,当人们点击它时,他们突然就不再登录了” - 我认为您对 Strict 的理解在这里不正确。 MDN 将其表述为,“Cookie 将仅在第一方上下文中发送,不会与第三方网站发起的请求一起发送。” - 首先在顶部浏览上下文中打开链接 -派对,[…]
-
[…] 并且仅单击链接也不是由第 3 方站点发起的请求。 (这将适用于通过 JS 发出的对脚本、样式表、图像或后台请求等嵌入式资源的请求。)
-
@CBroe 啊,感谢您的澄清,尽管在我测试时,我似乎确实注意到了这一点。那我需要多玩一点。无论如何,CSS、XHR 和 WS 似乎都已退出 Strict,也许还有 Lax。
标签: post cookies get single-sign-on samesite