상태 기계로 보는 생명주기
WebSocket 연결은 네 상태를 차례로 거쳐. CONNECTING(핸드셰이크 중) 에서 OPEN(프레임 전송 가능), CLOSING(한쪽이 닫기 프레임을 보내고 상대의 확인을 기다리는 중), 마지막 CLOSED(종료) 로 이동하지. 브라우저는 WebSocket.readyState 에 이 상태를 0, 1, 2, 3 으로 드러내.
프레임
WebSocket 데이터는 단순한 바이트 스트림이 아니라 프레임 의 연속이야. 각 프레임에는 2~14바이트짜리 작은 헤더가 붙어. 메시지의 마지막 프레임인지를 나타내는 FIN 비트, 텍스트·바이너리·ping·pong·닫기·연속 프레임을 구분하는 opcode, 마스크 비트, 페이로드 길이가 들어 있지. 클라이언트에서 서버로 가는 프레임은 프레임마다 별도 XOR 키로 항상 마스킹하고, 반대 방향은 마스킹하지 않아. 이 마스킹은 캐시 오염 공격을 막기 위한 장치이지 보안이나 암호화가 아니야.
닫기 코드
정상적인 종료에는 모두 코드가 붙어. 1000 은 정상 종료, 1001 은 서버 종료나 페이지 이동처럼 연결 주체가 떠나는 상황이야. 1006 은 닫기 프레임을 받지 못한 채 연결이 끊겼음을 나타내는 특수한 비정상 종료 코드지. 4000-4999 는 애플리케이션이 자유롭게 정의하는 영역이라서 ‘세션 만료’나 ‘방에서 내보냄’ 같은 상황에 쓸 수 있어.