【问题标题】:How to do authentication over web sockets?如何通过 Web 套接字进行身份验证?
【发布时间】:2021-08-01 20:04:41
【问题描述】:
我为什么要使用 websockets?
我正在通过 WebSocket 路由我的所有 HTTPS 请求,因为我的应用程序具有聊天功能,并且我需要在应用程序运行时保持 WebSocket 处于打开状态,所以为什么不直接通过它路由所有请求。
我的问题。
事实证明,说起来容易做起来难。我是否应该使用相同的访问令牌和刷新令牌来验证客户端身份验证。或者我应该在连接打开时验证它,然后只要它打开就信任它。所以这是我的问题:
- wss(Web 套接字安全)是否足以阻止中间人攻击?
- 我是否应该为每个 WebSocket 连接生成一种票证机制,持续 2 到 10 分钟,然后断开连接并要求客户端重新连接?
- 或者我应该对来自客户端的每个请求都有一个访问令牌。
- 如何确保服务器在发送数据时将数据发送到正确的客户端。
- 我是否应该对所有负载进行端到端加密以避免出现很多问题?
【问题讨论】:
标签:
node.js
flutter
security
authentication
websocket
【解决方案1】:
或者我应该在连接打开时验证它,然后只要它打开就信任它。
只要连接是通过受信任的渠道(例如ssl/tls。
- wss(Web 套接字安全)是否足以阻止中间人攻击?
是的。 Wss 只是 ws over ssl/tls。
- 我是否应该为每个 WebSocket 连接生成一种票证机制,持续 2 到 10 分钟,然后断开连接并要求客户端重新连接?
我不知道你为什么要这样做。相反,对于类似聊天的应用程序,您希望尽可能长时间地保持连接打开。尽管我建议在客户端实现 ping 调用并在服务器端实现超时。使用这种方法,您可以要求客户端每隔 30 秒执行一次操作。
- 或者我应该对来自客户端的每个请求都有一个访问令牌。
没有必要。使用 ssl/tls,您可以对整个连接进行一次身份验证,并且只需记住经过身份验证的服务器端。令牌与经典 HTTP 一起使用,因为它更容易水平扩展此类应用程序,例如连接到哪个服务器都没有关系,您甚至可以在调用之间切换服务器,这不会影响身份验证。但是对于类似聊天的应用程序(或任何需要双向通信的应用程序),连接必须从一开始就保持不变,因此令牌会引入不必要的开销。
- 如何确保服务器在发送数据时将数据发送到正确的客户端。
我不确定你的意思。无论如何,这几乎就是 tcp + ssl/tls 所保证的。对于任何其他基于安全 tcp 的协议也是如此。还是您的意思是在应用程序级别?好吧,一旦通过身份验证,您就必须将用户与相应的连接匹配。服务器必须对此进行跟踪。
- 我是否应该对所有负载进行端到端加密以避免出现很多问题?
什么问题? E2E 加密的目的非常不同:它保证您(也称为服务器)无法读取消息。它保证了高度的隐私,因此即使服务器也无法读取消息,只能读取对等方。所以这是一个商业决策,而不是技术或安全决策。您想完全控制对话吗?那么显然你不能使用 E2E。另一方面,如果您想为用户提供最高级别的隐私,那么这是一个很好的(如果不是强制性的)方法。请注意,全功能 E2E 本质上比非 E2E 更难实现。
我需要在应用程序运行时保持 WebSocket 处于打开状态,所以为什么不直接通过它路由所有请求。
这是一个有趣的方法。我自己正在考虑这样做(并且很可能会尝试一下)。优点是整个通信都通过一个更容易调试的协议。另一个优点是,通过适当的协议,您可以获得更高的性能。缺点是经典的 HTTP 很好理解,有很多工具和子协议(例如 REST)覆盖它。安全性、二进制流(例如文件服务)等通常是开箱即用的。所以感觉有点像重新发明轮子。不管怎样,我祝你好运,希望你能回来告诉我们进展如何。