Sec-Websocket-key trong websocket

Mình đang tìm hiểu về websocket, có một thắc mắc về Sec-Websocket-key như này. Đọc tài liệu về websocket của IETF thì nó nói link tài liệu):

To prove that the handshake was received, the server has to take two pieces of information and combine them to form a response. The first piece of information comes from the |Sec-WebSocket-Key| header field in the client handshake:

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

For this header field, the server has to take the value (as present in the header field, e.g. the base64-encoded [RFC4648] version minus any leading and trailing whitespace), and concatenate this with the Globally Unique Identifier (GUID, [RFC4122]) “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” in string form, which is unlikely to be used by network endpoints that do not understand the WebSocket protocol. A SHA-1 hash (160 bits), base64-encoded (see Section 4 of [RFC4648]), of this concatenation is then returned in the server’s handshake [FIPS.180-2.2002].

Để mở một kết nối tới server websocket, thì client sẽ gửi một header chứa trường Sec-Websocket-key là một chuỗi ngẫu nhiên, độ dài 16 byte.

Xong server sẽ nối key này với chuỗi cố định “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”

xong sau đó chuỗi sau khi nối này được mã hóa bằng sha1, rồi lại mã hóa bằng base64.

Sau đó server trả về chuỗi mã hóa base64 này cho client, ghi vào trường Sec-Websocket-Accept trong response.

Mình không thể hiểu làm cái này để làm gì

Nếu cái server websocket nó chỉ làm cái mã hóa chuỗi như vậy, thì bây giờ mình dùng 1 server khác (ko phải websocket) thực hiện mã hóa cái chuỗi Sec-websocket-key cũng được vậy. Vậy cái này nó mục đích là gì thế.

Với lại, nếu server muốn xác nhận là nhận được handshake từ client, thì trả về HTTP code 101 là được rùi, cần thêm cái này làm gì zậy ta. Ai có thể giải thích cho mình với

  • Khi làm việc công an bạn cần CMND
  • Khi giao dịch ngân hàng, cần CMND và chữ kí
  • Khi vào công ty cần thẻ nhân viên
  • Khi đi thi cần thẻ sinh viên
  • Khi vô nhà cần chìa khoá
  • Khi sử dụng Websocket cần socket key “dGhlIHNhbXBsZSBub25jZQ==”
1 Like

FYI: This seemingly overcomplicated process exists so that it’s obvious to the client whether or not the server supports WebSockets. This is important because security issues might arise if the server accepts a WebSockets connection but interprets the data as a HTTP request.

nó làm trò như vậy để chứng tỏ server nó có hỗ trợ WebSocket. Nếu chỉ trả về 101 bình thường thì làm sao biết server có hỗ trợ websocket hay ko?

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?