← 뒤로

프로젝트 요약

문제(AS-IS)

목표(TO-BE)


설계/선택(Key decisions)

  1. 권한 기반 전달: 유저별 전용 채널 /topic/user/{uuid}/... — 권한 회수 시 전송 차단·사용자 단위 스트림 통일
  2. 인증: CONNECT 시 헤더 토큰. /app/auth/refresh 토픽으로 auth 갱신
  3. 구독 검증: topic uuid = principal 검증, 불일치 시 거부
  4. 응답 형식:
    • /queue/session/{sessionId}/exception (예외 큐) 구현
    • /queue/session/{sessionId}/reply (응답/결과 큐) 구현
  5. 만료 처리: 만료 → 인바운드·Heartbeat 검사 후 ERROR·종료. 만료 임박 → auth 큐로 token_expiring_soon 전송, 클라이언트 갱신

결과(Impact)

아래 링크에서 실제 구현 확인 가능 message.rahoon.site/websocket-docs


구현 상세


1) 권한 기반 메시지 전달·구독 검증

배경: 기존에는 채팅방·토픽 단위로 브로드캐스트하고 있어, 한 번 구독한 사용자는 채팅방에서 나가더라도(인가가 취소되어도) 계속 메시지를 받을 수 있었다. “이 유저에게만” 전달하는 단위가 없어서, 권한 회수 시 수신을 끊을 수 없었다.

후보 검토: (A) 유저별 전용 채널, (B) 채팅방 토픽 + 구독 시 권한 검증만, (C) A와 B 혼합.

트레이드오프: 채팅방 메시지는 참여자 수만큼 유저 채널로 전송되므로 트래픽이 늘 수 있음. 수평 확장·Throughput 개선으로 상쇄 가능한 수준으로 판단.


2) 인증·갱신

배경:

선택: STOMP CONNECT 시 헤더로 토큰 전달.

갱신 API: 토큰 만료 전에 재연결 없이 갱신할 수단이 필요했다.

주의: auth 큐(/queue/session/{sessionId}/auth) 구독 시 sessionIdCONNECTED 프레임의 session 헤더 값을 써야 한다. StompSession.getSessionId()는 서버 session id와 다를 수 있음.


3) 만료·만료 임박

배경:

선택: “만료”와 “만료 임박”을 구분하여 처리한다.


4) 예외·성공 응답

배경:

선택:


5) 문서·주요 클래스

AsyncAPI info.description과 websocket-docs에 인증 규칙, 구독 권한, 갱신 API, 예외·성공 응답 형식에 대한 설명 추가


어떠한 날카로운 피드백이더라도 환영합니다. 사소한 의견도 괜찮습니다.

citron0137@gmail.com 또는 LinkedIn 을 통해 피드백을 보내주세요.