본문 바로가기
C.W.K.
Stream
Lesson 08 of 08 · published

연결 생명주기와 프레임 형식

~13 min · foundations, frames, close-codes

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

상태 기계로 보는 생명주기

WebSocket 연결은 네 상태를 차례로 거쳐. CONNECTING(핸드셰이크 중) 에서 OPEN(프레임 전송 가능), CLOSING(한쪽이 닫기 프레임을 보내고 상대의 확인을 기다리는 중), 마지막 CLOSED(종료) 로 이동하지. 브라우저는 WebSocket.readyState 에 이 상태를 0, 1, 2, 3 으로 드러내.

프레임

WebSocket 데이터는 단순한 바이트 스트림이 아니라 프레임 의 연속이야. 각 프레임에는 2~14바이트짜리 작은 헤더가 붙어. 메시지의 마지막 프레임인지를 나타내는 FIN 비트, 텍스트·바이너리·ping·pong·닫기·연속 프레임을 구분하는 opcode, 마스크 비트, 페이로드 길이가 들어 있지. 클라이언트에서 서버로 가는 프레임은 프레임마다 별도 XOR 키로 항상 마스킹하고, 반대 방향은 마스킹하지 않아. 이 마스킹은 캐시 오염 공격을 막기 위한 장치이지 보안이나 암호화가 아니야.

닫기 코드

정상적인 종료에는 모두 코드가 붙어. 1000 은 정상 종료, 1001 은 서버 종료나 페이지 이동처럼 연결 주체가 떠나는 상황이야. 1006 은 닫기 프레임을 받지 못한 채 연결이 끊겼음을 나타내는 특수한 비정상 종료 코드지. 4000-4999 는 애플리케이션이 자유롭게 정의하는 영역이라서 ‘세션 만료’나 ‘방에서 내보냄’ 같은 상황에 쓸 수 있어.

Code

RFC 6455 프레임 배치·text
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |            (16/64)            |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+-------------------------------+
|     Extended payload length continued, if payload len == 127  |
+---------------------------------------------------------------+
|                          Masking-key                          |
+---------------------------------------------------------------+
|                          Payload data ...                     |
+---------------------------------------------------------------+
opcode 참고표·text
0x0  continuation  - more of a fragmented message
0x1  text          - UTF-8 payload
0x2  binary        - bytes
0x8  close         - graceful shutdown
0x9  ping          - heartbeat request (RFC-level)
0xA  pong          - heartbeat response (RFC-level)
자주 쓰는 닫기 코드·text
1000  Normal closure        - clean shutdown
1001  Going away            - server shutting down or tab navigated
1002  Protocol error        - malformed frame
1003  Unsupported data      - text on a binary endpoint, e.g.
1006  Abnormal closure      - no close frame received (drop)
1008  Policy violation      - server-defined refusal
1009  Message too big
1011  Internal server error
4000-4999  Application use  - your codes (auth expired, room full, ...)

External links

Exercise

간단한 WebSocket 클라이언트를 띄우고 Wireshark 나 브라우저 개발자 도구로 프레임을 잡아 봐. 텍스트 메시지를 보내 클라이언트→서버 프레임이 마스킹된 것을 확인하고, 에코 응답을 받아 서버→클라이언트 프레임은 마스킹되지 않은 것도 확인해. 마지막으로 대화 중 탭을 갑자기 닫아 서버 로그에 1000 이 아닌 1006 종료가 남는지 살펴봐.

Progress

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

댓글 0

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

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