【问题标题】:Can I safely rely on a WebSocket connection after initial handshake?初次握手后我可以安全地依赖 WebSocket 连接吗?
【发布时间】:2018-03-18 07:37:55
【问题描述】:

典型场景:

1) 客户端使用 HTTPS 在 POST 请求中将其凭据发送到服务器。

2) 服务器验证凭据是否正确并对用户进行身份验证。因此它会向客户端返回一个 JWT(JSON Web Token)。

3) 客户端打开一个 非安全 WebSocket 连接 (ws://)。所以客户端和服务器现在有了一个可以轻松交换数据的通道(具体原因在这里并不重要)。

4) 用户通过 WebSocket 连同 JWT 一起向服务器发送任何类型的请求,因此服务器可以验证这些请求是否合法。

5) 服务端在成功验证每个请求的 JWT 后,使用 WebSocket 通道返回用户请求的数据。

由于我们使用 HTTPS,我们假设 JWT 在发布时没有被盗(HTTPS 可能会被击败,但我们假设它对我们的目的来说是正常的)。

我们使用非安全 WebSocket 的事实意味着有人可以嗅探 WebSocket 通道的流量并在心跳中窃取 JWT。所以我们改用 WebSocket Secure (wss://) 并应用与之前相同的场景。

现在我们使用了 WebSocket Secure,当我们使用 WSS 通道时,我们是否需要在向服务器发出的每个请求中继续发送 JWT?或者 WebSocket 安全通道是否足够安全,因此服务器和客户端都 100% 确定(只要 TLS 未被破坏)该通道是合法的?

换句话说:一旦安全地建立了 WSS 通道,我们可以信任它吗? (直到连接明显关闭)

我真的不明白 WSS 连接是如何建立的,以及建立后它是如何工作的。我的理解是:关键部分是握手,一旦握手完成,您就可以安全地依赖 WSS 通道(因为它可以防止使用 TLS 的 MITM 攻击,而 WS 不会这样做)。

最近几天我阅读了很多关于这一切的资料,但有些概念仍然不清楚。任何帮助将不胜感激!

【问题讨论】:

    标签: ssl websocket


    【解决方案1】:

    Websocket 使用持久的 TCP/IP 连接。

    使用wss 类似于使用HTTPS,这意味着一旦SSL/TLS 握手完成,所有Websocket 数据都被“包装”(通常是编码)在TLS 包中。

    假设 TLS/SSL 连接是安全的,则 Websocket 连接将保持安全,并且可以(并且可能应该)只验证一次。

    因此,没有理由一遍又一遍地发送 JWT。使用连接的持久状态将用户“分配”到连接是更好的解决方案。

    旁注:虽然不安全,但即使使用“明文”(ws://) 的 Websocket 连接也最好发送一次 JWT,因为嗅出的机会较少智威汤逊。

    【讨论】:

    • 这正是我需要的答案。非常感谢!
    • @cluxter,很乐意提供帮助 :-)
    • 您能否在答案中引用官方消息来支持这一说法?提前谢谢你。
    • @Wilt,我不确定您要问的是我的哪一项声明...如果您要问的是wss,而不是wss is "secure"it's required to use TLS...如果您问的是我的 JWT 旁注,那么我的陈述本质上是统计性的。
    • 感谢您提供的链接,我想我之前在答案中误解了一些东西。再次查看链接并仔细阅读您的答案有助于我理解您的主张,现在很明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多