是否不可能通过 WebSocket 握手跨域传递 cookie?



上下文:

我正在本地开发一个前端应用程序,跨域调用 API 等(从本地主机开发服务器到本地网络内另一台机器上的服务器(。由于我们的本地网络是隔离的,后端服务器启用了 CORS,这不会导致安全问题;这在生产中是不同的(CORS 已禁用(。

我们在应用程序中引入了 WebSocket 连接,为了通过授权保护它,我们在握手时添加了 cookie 检查。(XHR 请求通过授权标头进行授权,cookie 不在那里使用;但它们实际上可以使用;WebSocket接口只允许一组有限的标头,如果我们不通过 WS 消息授权,cookie 似乎是唯一明智的选择;好吧,实际上我没有找到是否可以在没有浏览器标准提示的情况下实现基本的HTTP身份验证,以及如何做到这一点(

问题:

虽然这实际上适用于生产环境(当前端和后端位于同一域时(,并且 cookie 是在Cookie标头内的握手请求中发送的(代码很简单:我只是在获得身份验证令牌后设置 cookie(,但这在开发环境中不起作用(本地主机 + 另一个域上的后端(:握手中没有Cookie标头。上面的链接显示XHR需要withCredentials选项来尝试跨域传递cookie;但是,我还没有找到一个明确的答案,WS是否有类似的东西。在这里,类似问题的作者只是假设没有这样的事情,但真的是这样吗?

仔细检查您正在使用的 cookie 是否设置为 SameSite=None 并且是否secure

我遇到了同样的问题,认为 cookie 没有被发送,因为 chrome 检查器不会在 websocket 连接请求中显示它们,但是一旦您使用相同的站点nonesecure标记它们,它们似乎就会显示。

或者,要快速检查这是否是问题所在,您可以在chrome://flags/中禁用SameSite要求

在另一个项目中,我学会了一种"正确"的方法来解决这个问题。通常,WS 使用更高级别的协议,例如 STOMP 协议。它具有针对身份验证的特定实现,因此实际上不需要cookie;它在 CORS 方面没有缺点。

最新更新