В разделе 1.3 "Открытие рукопожатия" draft-ietf-hybi-thewebsocketprotocol-17 он описывает Sec-WebSocket-Key
следующим образом:
Чтобы подтвердить, что рукопожатие получено, сервер должен взять две части информации и объединить их для формирования ответа. Первая часть информации поступает из | Sec-WebSocket-Key | заголовочное поле в квитировании клиента:
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Для этого поля заголовка сервер должен принять значение (как указано в поле заголовка, например, в кодировке base64 [RFC4648] минус любое начальное и конечное пустое пространство) и объединить это с глобально уникальным идентификатором (GUID, [RFC4122]) "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" в строковой форме, что вряд ли будет использоваться конечными точками сети, которые не понимают протокол WebSocket. Хэш в SHA-1 (160 бит), base64-кодированный (см. Раздел 4 из [RFC4648]), этой конкатенации затем возвращается в квитировании сервера [FIPS.180-2.2002].
Здесь вещь, которую я не могу понять: почему бы просто не вернуть код 101? Если правильное использование Sec-WebSocket-Key
предназначено для обеспечения безопасности или для подтверждения того, что они могут обрабатывать запросы websocket, то любой сервер может вернуть ожидаемый ключ, если они захотят, и притвориться, что они являются сервером WebSocket.