1. 기능 개요
- 1:1 채팅(Direct Message, DM) 기능을 제공합니다.
- WebSocket(STOMP) 기반 실시간 전송 + REST API 기반 조회를 지원합니다.
- 메시지는 DB에 영구 저장되며, 커서 기반 페이지네이션으로 조회합니다.
- WebSocket 연결·구독·전송 전 과정에 JWT 인증 & 세션 기반 사용자 식별이 적용됩니다.
DmKeyUtil
로 대화방 키(dmKey) 를 생성·정규화하여 식별 일관성을 보장합니다.
HttpHandshakeInterceptor
(JWT 검증) + WebSocketChannelInterceptor
(STOMP 프레임 보안)로 연결~메시지 전송 전체 경로를 보안 검증합니다.
2. API 목록
Method |
Endpoint |
설명 |
GET |
/api/direct-messages |
DM 목록 조회 |
3. 기능별 상세 설계
📌 WebSocket 인증/인가 & 메시지 전송
(1) CONNECT (Handshake)
- 엔드포인트:
/ws/dm
- 작업 요약
HttpHandshakeInterceptor
- 요청 헤더
Authorization
에서 JWT 추출·검증(유효성, 만료, 서명)
- 성공 시 세션 속성에
userId
저장
WebSocketChannelInterceptor.handleConnect()
- 세션의
userId
확인(없으면 UNAUTHORIZED
)
- 연결 허용
- 사용 클래스
HttpHandshakeInterceptor
, WebSocketChannelInterceptor
(2) SUBSCRIBE (구독)
- 엔드포인트:
/sub/direct-messages_{dmKey}
- 작업 요약
WebSocketChannelInterceptor.handleSubscribe()
- 세션
userId
확인(없으면 UNAUTHORIZED
)
- destination에서
dmKey
추출 → DmKeyUtil.parse(dmKey)
로 두 UUID 파싱
- 현재 사용자가 두 UUID 중 하나에 포함되는지 검사(미포함 시
ACCESS_DENIED
)
DmKeyUtil.generate(u1,u2)
로 정규화된 dmKey 생성 후 destination을 정규화 값으로 강제 변경