C.W.K.
Stream
Lesson 07 of 08 · published

WebSocket Handshake

~13 min · foundations, rfc-6455, handshake

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

HTTP/1.1 에서 WebSocket 으로

마법 뒤를 보면 WebSocket handshake 는 그냥 네 개 결정적인 헤더 가진 HTTP/1.1 GET 이야: Upgrade: websocket, Connection: Upgrade, Sec-WebSocket-Key, Sec-WebSocket-Version: 13. 서버 일은 이걸 알아채고, 파생값 계산하고, 101 Switching Protocols 로 응답.

Sec-WebSocket-Accept hash

클라가 base64 인코딩된 random nonce 를 Sec-WebSocket-Key 로 보내. 서버는 거기에 고정된 magic GUID (258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 를 붙이고, SHA-1 떠서 base64 한 걸 Sec-WebSocket-Accept 로 돌려줘. 이거로 서버가 진짜 WebSocket protocol 이해한다는 걸 증명. 일반 HTTP 서버가 우연히 handshake 완료 못 해.

Optional handshake 헤더

Sec-WebSocket-Protocolgraphql-wsmqtt 같은 subprotocol negotiation. Sec-WebSocket-Extensions 는 extension, 가장 흔하게 permessage-deflate (compression). Origin 은 호출하는 page identify — 서버가 이거 validation 해야 해.

Code

Sec-WebSocket-Accept 직접 계산·python
import hashlib, base64

GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

def server_accept(client_key: str) -> str:
    raw = (client_key + GUID).encode('ascii')
    digest = hashlib.sha1(raw).digest()
    return base64.b64encode(digest).decode('ascii')

# From RFC 6455
print(server_accept('dGhlIHNhbXBsZSBub25jZQ=='))
# -> 's3pPLMBiTxaQ9kYGzzhZRbK+xOo='
accept 전에 Origin validate·python
ALLOWED = {'https://app.example.com', 'https://admin.example.com'}

@app.websocket('/ws')
async def ws_endpoint(websocket: WebSocket):
    origin = websocket.headers.get('origin', '')
    if origin not in ALLOWED:
        # Reject during handshake — never .accept()
        await websocket.close(code=4003, reason='forbidden origin')
        return
    await websocket.accept()
    # ...

External links

Exercise

server_accept 함수를 random base64 client key 세 개에 돌려. 그 다음 브라우저 network panel 에서 실제 WebSocket handshake 캡처 (chat 사이트 아무거나 됨). request 의 Sec-WebSocket-Key 에서 함수가 계산한 값과 응답 Sec-WebSocket-Accept 가 일치하는지 손으로 verify.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.