WebSocket密钥如何工作?

Laj*_*pad 3 browser websocket

最近,我一直在研究WebSockets,我认为它们非常酷。但是,如果我在这里看看,有些事情对我来说还不清楚。

请求:

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
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Run Code Online (Sandbox Code Playgroud)

请求者指定了主机,因此中间服务器将知道请求应到达的位置。请求者发送一个编码为base64的随机字符串,服务器返回一个经过加密的SHA1加密密钥。连接处于活动状态时,是否会在两者之间使用此密钥?如果是这样,即使连接断开,有没有办法可以重用此密钥?

gre*_*gor 5

正如您在Wikipedia链接中提到的:

除了“升级”标头之外,客户端还会发送一个Sec-WebSocket-Key标头,其中包含base64编码的随机字节,服务器会在Sec-WebSocket-Accept标头中使用键的哈希值进行回复。这是为了防止缓存代理重新发送以前的WebSocket会话,并且不提供任何身份验证,隐私或完整性。

Sec-WebSocket-Key 仅用于握手期间,不用于实际通信。

密钥旨在通过发送随机密钥来防止代理缓存请求。如果代理仍然返回缓存的响应,则可以通过验证Sec-WebSocket-Accept标头来对其进行检查。

客户端可以忽略Sec-WebSocket-Accept标头(并希望响应不会被缓存),并且WebSocket协议仍然可以正常工作。
在这种情况下,服务器可以实现为忽略Sec-WebSocket-Key标头而不返回Sec-WebSocket-Accept标头。

Sec-WebSocket-Accept可以在此答案中阅读如何生成用于响应或验证的标头:
从“ Sec-WebSocket-Key”生成“ Sec-WebSocket-Accept”