【问题标题】:How to do authentication over web sockets?如何通过 Web 套接字进行身份验证?
【发布时间】:2021-08-01 20:04:41
【问题描述】:

我为什么要使用 websockets?

我正在通过 WebSocket 路由我的所有 HTTPS 请求,因为我的应用程序具有聊天功能,并且我需要在应用程序运行时保持 WebSocket 处于打开状态,所以为什么不直接通过它路由所有请求。

我的问题。

事实证明,说起来容易做起来难。我是否应该使用相同的访问令牌和刷新令牌来验证客户端身份验证。或者我应该在连接打开时验证它,然后只要它打开就信任它。所以这是我的问题:

  1. wss(Web 套接字安全)是否足以阻止中间人攻击?
  2. 我是否应该为每个 WebSocket 连接生成一种票证机制,持续 2 到 10 分钟,然后断开连接并要求客户端重新连接?
  3. 或者我应该对来自客户端的每个请求都有一个访问令牌。
  4. 如何确保服务器在发送数据时将数据发送到正确的客户端。
  5. 我是否应该对所有负载进行端到端加密以避免出现很多问题?

【问题讨论】:

    标签: node.js flutter security authentication websocket


    【解决方案1】:

    或者我应该在连接打开时验证它,然后只要它打开就信任它。

    只要连接是通过受信任的渠道(例如ssl/tls。

    1. wss(Web 套接字安全)是否足以阻止中间人攻击?

    是的。 Wss 只是 ws over ssl/tls。

    1. 我是否应该为每个 WebSocket 连接生成一种票证机制,持续 2 到 10 分钟,然后断开连接并要求客户端重新连接?

    我不知道你为什么要这样做。相反,对于类似聊天的应用程序,您希望尽可能长时间地保持连接打开。尽管我建议在客户端实现 ping 调用并在服务器端实现超时。使用这种方法,您可以要求客户端每隔 30 秒执行一次操作。

    1. 或者我应该对来自客户端的每个请求都有一个访问令牌。

    没有必要。使用 ssl/tls,您可以对整个连接进行一次身份验证,并且只需记住经过身份验证的服务器端。令牌与经典 HTTP 一起使用,因为它更容易水平扩展此类应用程序,例如连接到哪个服务器都没有关系,您甚至可以在调用之间切换服务器,这不会影响身份验证。但是对于类似聊天的应用程序(或任何需要双向通信的应用程序),连接必须从一开始就保持不变,因此令牌会引入不必要的开销。

    1. 如何确保服务器在发送数据时将数据发送到正确的客户端。

    我不确定你的意思。无论如何,这几乎就是 tcp + ssl/tls 所保证的。对于任何其他基于安全 tcp 的协议也是如此。还是您的意思是在应用程序级别?好吧,一旦通过身份验证,您就必须将用户与相应的连接匹配。服务器必须对此进行跟踪。

    1. 我是否应该对所有负载进行端到端加密以避免出现很多问题?

    什么问题? E2E 加密的目的非常不同:它保证您(也称为服务器)无法读取消息。它保证了高度的隐私,因此即使服务器也无法读取消息,只能读取对等方。所以这是一个商业决策,而不是技术或安全决策。您想完全控制对话吗?那么显然你不能使用 E2E。另一方面,如果您想为用户提供最高级别的隐私,那么这是一个很好的(如果不是强制性的)方法。请注意,全功能 E2E 本质上比非 E2E 更难实现。

    我需要在应用程序运行时保持 WebSocket 处于打开状态,所以为什么不直接通过它路由所有请求。

    这是一个有趣的方法。我自己正在考虑这样做(并且很可能会尝试一下)。优点是整个通信都通过一个更容易调试的协议。另一个优点是,通过适当的协议,您可以获得更高的性能。缺点是经典的 HTTP 很好理解,有很多工具和子协议(例如 REST)覆盖它。安全性、二进制流(例如文件服务)等通常是开箱即用的。所以感觉有点像重新发明轮子。不管怎样,我祝你好运,希望你能回来告诉我们进展如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2012-02-10
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多