WebSockets身份验证

时间:2010-04-23 19:21:50

标签: security websocket

使用websocket连接时,对用户进行身份验证的可能方法是什么?

示例场景:基于Web的多用户聊天应用程序通过加密的websocket连接。如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且在连接过程中假冒用户模拟“无法”利用它。

3 个答案:

答案 0 :(得分:42)

如果您已经对应用程序的非websocket部分进行身份验证,则只需在连接后将会话cookie作为第一条消息传递,并像往常一样检查cookie。

警告:有人指出使用闪光灯时以下内容不起作用:
如果您使用socket.io,则更容易 - Cookie会在连接时自动传递,并且可以像下面这样访问:

var io = require('socket.io');
var socket = io.listen(app); 
socket.on('connection', function(client){ 
    cookies = client.headers['cookie'];
});

答案 1 :(得分:3)

SSL / TLS可用于使用X.509证书对客户端和服务器进行身份验证。这取决于您使用的Web应用程序平台。在apache中,可以针对有效的已知证书列表检查SSL_CLIENT_CERT environment variable的有效性。这不需要使用完整的PKI,也不需要您为每个客户购买证书。虽然我建议使用CA来支持服务器的ssl证书。

答案 2 :(得分:0)

有两种方法。

一种方法是允许任何人打开websocket连接。打开连接后,让客户端发送授权令牌作为第一条消息。如果客户端在一段时间内未发送有效令牌,请关闭连接。

另一种方法是使用cookie(浏览器会在每次请求时自动发送cookie)。这就要求您实施CSRF保护(比起正常情况还要多,因为Websocket没有相同的原始策略(SOP)。您可以找到详细信息here。概述如下:

  1. 使用网站的常规身份验证从js向后端发出“ websocket preauth”请求
  2. 后端在响应正文中返回CSRF令牌,并在响应标头中使用SameSite=Strict设置“ websocket auth” cookie
  3. 尝试与后端建立Websocket连接,并在查询参数中添加CSRF令牌
  4. 后端检查
    • websocket身份验证cookie和CSRF令牌有效
    • Origin标头的值与批准的域匹配
  5. 后端发送响应并升级连接以使用websockets

第一种方法较为简单,但缺点是它要求您具有一些服务器端状态,以等待客户端进行身份验证。这可以使攻击者通过消耗所有可用的套接字来执行拒绝服务攻击。