支持简单 HTTP 和 Websocket 的服务器上的用户身份验证

Posted

技术标签:

【中文标题】支持简单 HTTP 和 Websocket 的服务器上的用户身份验证【英文标题】:User authentication on server supporting both simple HTTP and Websocket 【发布时间】:2018-06-24 10:36:14 【问题描述】:

用户可以通过简单的 HTTP 或 Websocket 连接到服务器。

当 HTTP 会话过期时,Websocket 会话会发生什么? 当 Websocket 会话关闭时,HTTP 会话会发生什么?

如何在支持这两种协议的服务器上处理用户身份验证?

【问题讨论】:

请避免同时提出多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。 【参考方案1】:

RFC 6455 是定义 WebSockets 协议的文档,它没有规定任何特定的客户端身份验证方式:

10.5. WebSocket Client Authentication

此协议没有规定服务器可以在 WebSocket 握手期间验证客户端的任何特定方式。 WebSocket 服务器可以使用通用 HTTP 服务器可用的任何客户端身份验证机制,例如 cookie、HTTP 身份验证或 TLS 身份验证。

虽然 WebSocket 和 HTTP 可以从相同的基础设施(代理、过滤、身份验证)中受益,但请记住,HTTP 和 WebSocket 是不同的通信渠道,在设计身份验证机制:一个常见的误解是,在托管 Web 应用程序中进行身份验证的用户也在套接字流中进行身份验证。

【讨论】:

【参考方案2】:

这实际上取决于您的应用程序如何处理它。正如@Myst 提到的,通常只有一个会话cookie - HTTP 会话。当该会话无效时,您的服务器应用程序可以关闭 websocket,或者在下次建立连接之前保持打开状态。这只是您何时检查附加到 websocket 的会话的问题:仅在建立连接时?或收到消息时?

【讨论】:

【参考方案3】:

一般来说,通常只有一个会话 cookie - HTTP 会话。

由于 WebSocket 连接以 HTTP 开始,因此连接通常在 HTTP 阶段进行身份验证,并且只有在身份验证成功后才升级到 WebSocket...

...这取决于应用程序的设计,但通常是这样。

如果在 WebSocket 连接建立后会话无效,则连接将(通常)保持打开状态并经过身份验证(因为大多数应用程序在连接建立后不会重复身份验证阶段)。

【讨论】:

以上是关于支持简单 HTTP 和 Websocket 的服务器上的用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

websocket 服务器怎么启动

WebSocket的简单实现

Server-sent-events与 WebSocket的区别是什么?

WebSocket 服务器支持

netty实现WebSocket协议

WebSocket入门及使用指南