WebSocket密钥如何工作?
最近我一直在研究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加密的密钥。在连接处于活动状态时,这两个键在两者之间使用吗?如果是这样,即使连接断开,这个密钥可以重用吗?
因为它在你的维基百科链接的提到:
除了升级头,客户端发送一个二段的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
头可这个答案馆内阅读
哈希函数追加固定字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11(一个GUID)以从 仲丁基WebSocket的密钥标题中的值(其不从BASE64解码),适用 的SHA-1哈希函数,并使用base64编码结果。
https://en.wikipedia.org/wiki/WebSocket#Protocol%20handshake