Sec-WebSocket-Key 头

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

HTTP Sec-WebSocket-Key 请求头用于 WebSocket 开启握手,以允许客户端(用户代理)确认它“确实想要”请求将 HTTP 客户端升级为 WebSocket。

密钥的值是使用 WebSocket 规范中定义的算法计算的,因此这不提供安全性。相反,它有助于防止非 WebSocket 客户端无意中或通过滥用请求 WebSocket 连接。

当脚本打开 WebSocket 时,用户代理会自动添加此头;不能使用 fetch()XMLHttpRequest.setRequestHeader() 方法添加此头。

服务器的 Sec-WebSocket-Accept 响应头应包含根据指定密钥值计算的值。然后用户代理可以在确认连接之前验证此值。

头类型 请求头
禁止请求头 是 (Sec- 前缀)

语法

http
Sec-WebSocket-Key: <key>

指令

<key>

此升级请求的密钥。这是一个随机选择的 16 字节 nonce,已进行 base64 编码和同构编码。用户代理在发起 WebSocket 连接时会添加此密钥。

示例

WebSocket 开启握手

客户端将发起一个 WebSocket 握手,请求示例如下。请注意,这首先是一个 HTTP GET 请求(HTTP/1.1 或更高版本),除了 Sec-WebSocket-Key 之外,请求还包含 Upgrade 头,表示打算从 HTTP 升级到 WebSocket 连接。

http
GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服务器的响应应包含 Sec-WebSocket-Accept 头,其值是根据请求中的 Sec-WebSocket-Key 头计算得出的,并确认打算将连接升级为 WebSocket 连接

http
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

规范

规范
WebSocket 协议
# section-11.3.1

浏览器兼容性

另见