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

연결 닫기

~10 min · browser, close-codes

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

close(code, reason)

ws.close() 를 호출하면 종료 핸드셰이크가 시작돼. 브라우저가 닫기 프레임을 보내고 서버도 닫기 프레임으로 답한 뒤, 아래의 TCP 소켓이 닫히지. 닫기 코드와 이유는 선택해서 전달할 수 있어. 이유는 최대 123바이트인 UTF-8 문자열이라 ‘세션 만료’ 같은 설명에는 충분하면서도 닫기 프레임을 가볍게 유지해.

애플리케이션 닫기 코드(4000-4999)

4000~4999 는 애플리케이션이 정의하는 코드 영역이야. 프로토콜에서 4001 unauthorized, 4029 too many connections, 4040 room not found 처럼 안정적인 값을 정해 두면 클라이언트가 상황별로 명확히 분기할 수 있어. 1001 이나 1011 같은 1xxx 코드는 RFC 가 이미 의미를 정했으니 애플리케이션 로직에 재사용하지 않는 게 좋아.

wasClean 이 종료 상태를 알려 줘

close 이벤트에는 wasClean 불리언 값이 있어. true 라면 종료 핸드셰이크를 제대로 마쳤으므로 닫기 코드에 의미가 있어. false 라면 연결이 갑자기 끊긴 것으로, 코드는 보통 1006 이고 이유는 비어 있어.

Code

이유와 함께 연결 닫기·javascript
// Normal user-initiated logout
ws.close(1000, 'user logged out');

// Application-defined: "your token has expired"
ws.close(4001, 'token expired');

// React to close codes on the listener side
ws.addEventListener('close', (e) => {
  if (!e.wasClean) {
    console.warn('connection lost — schedule reconnect');
    return scheduleReconnect();
  }
  switch (e.code) {
    case 1000: return console.log('clean close');
    case 1001: return console.log('server going away');
    case 4001: return redirectToLogin();
    case 4029: return showRateLimitToast();
    default:   return console.warn('unexpected close', e.code, e.reason);
  }
});

External links

Exercise

가상의 채팅 앱에 5줄짜리 닫기 코드 표를 정의해. 1000 정상 종료, 4001 인증 안 됨, 4029 요청 제한, 4040 방 없음, 4503 서버 과부하야. 클라이언트에 switch 문을 작성해 코드마다 다른 토스트를 띄우고, 서버에서 각 상황을 일으켜 UI 가 알맞게 반응하는지 확인해.

Progress

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

댓글 0

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

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