2017-10-06 108 views
0

典型場景:初次握手後,我可以安全地依靠WebSocket連接嗎?

1)客戶端通過使用HTTPS的POST請求將其憑據發送到服務器。

2)服務器驗證憑證是否正確並驗證用戶。因此它返回一個JWT(JSON Web Token)給客戶端。

3)客戶端打開非安全 WebSocket連接(ws://)。因此,客戶端和服務器現在有一個輕鬆交換數據的渠道(確切的原因在這裏並不重要)。

4)用戶通過WebSocket和JWT向服務器發送任何類型的請求,以便服務器可以驗證這些請求是否合法。

5)服務器在成功驗證每個請求的JWT後,使用WebSocket通道返回用戶詢問的數據。

由於我們使用HTTPS,我們假設智威湯遜發佈時並未被盜(HTTPS可能被擊敗,但讓我們假設它對我們的目的是理智的)。

事實上,我們使用非安全的WebSocket意味着有人可以嗅探WebSocket頻道的流量並以心跳竊取智威湯遜。因此,我們使用WebSocket Secure(wss://)來代替並應用相同的以前的方案。

既然我們正在使用WebSocket Secure,那麼當我們使用WSS通道時,我們是否需要在每次向服務器發送請求時都發送JWT?或者是WebSocket安全通道足夠安全,所以服務器和客戶端都100%確定(只要TLS未被擊敗)該通道是合法的?

換句話說:一旦WSS頻道安全建立,我們可以信任它嗎? (直到連接明顯關閉)

我不太瞭解WSS連接是如何建立的以及它在建立後如何工作。我的理解是:關鍵部分是握手,一旦握手完成,您就可以安全地依賴WSS通道(因爲它阻止了使用TLS進行的MITM攻擊,WS不這麼做)。

我讀了很多這些最後的日子關於這一切,但一些概念仍不清楚。任何幫助將不勝感激!

回答

1

Websockets使用持久的TCP/IP連接。

使用wss與使用HTTPS相似,這意味着一旦SSL/TLS握手完成,所有Websocket數據就會在TLS包中「包裝」(通常是編碼)。

假設TLS/SSL連接是安全的,Websocket連接將保持安全並且可能(並且可能應該)只驗證一次。

因此,沒有理由繼續發送智威湯遜一遍又一遍。爲了將用戶「分配」到連接,使用連接的持久狀態是一個更好的解決方案。

側面說明:雖然不安全,倒不如用「中明確」 WebSocket連接時發送的智威湯遜甚至一度(ws://),因爲有少嗅出了智威湯遜的機會。