2016-09-17 80 views
1

最近我一直在研究WebSockets,我認爲它們非常酷。但是,如果我看看here,有些事情對我來說還不清楚。WebSocket密鑰如何工作?

請求:

GET /chat HTTP/1.1 
Host: server.example.com 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13 
Origin: http://example.com 

響應:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 
Sec-WebSocket-Protocol: chat 

請求者指定主機,所以中間服務器將知道請求應該到達。請求者發送一個隨機字符串編碼到base64中,並且服務器發回一個經過SHA1加密的密鑰。在連接處於活動狀態時,這兩個鍵在兩者之間使用嗎?如果是這樣,即使連接斷開,這個密鑰可以重用嗎?

回答

3

因爲它在你的維基百科鏈接的提到:

除了升級頭,客戶端發送一個二段的WebSocket-Key標頭包含base64編碼的隨機字節,並且服務器在Sec-WebSocket-Accept頭中使用密鑰的散列回覆。 這旨在防止緩存代理重新發送先前的WebSocket對話,並且不提供任何身份驗證,隱私或完整性。

Sec-WebSocket-Key只用於握手內部,不用於實際的通信。

該密鑰旨在通過發送隨機密鑰來防止代理緩存請求。如果代理仍然返回緩存響應,則可以通過驗證Sec-WebSocket-Accept標頭進行檢查。

客戶端可能會忽略Sec-WebSocket-Accept標頭(並希望響應沒有被緩存),並且WebSocket協議仍能正常工作。
在這種情況下,服務器可以實現爲忽略Sec-WebSocket-Key標頭而不返回Sec-WebSocket-Accept標頭。
generate "Sec-WebSocket-Accept" from "Sec-WebSocket-Key"

如何產生響應或驗證Sec-WebSocket-Accept頭可這個答案館內閱讀