프로젝트를 진행하며, Oauth + STOMP으로 사용하며 보완했던 경험을 같이 공유하고자 간단하게 포스팅을 작성해보려 합니다.
- HTTP 프로토콜을 사용해 접근
- Websocket으로 Upgrade를 진행하며 연결 시도
- 연결 유무 응답을 return
use Spring Security
HandshakeInterceptor에서 1차적으로 인증 정보를 저장하고, 이후 메시지 처리 과정에서는 ChannelInterceptor를 통해 권한 검사를 수행하는 방식으로 구현해야 합니다.
use HandshakeInterceptor
이에, 저는 Spring Security만 사용하던 코드를
1. 웹소켓 요청 시, web.ignoring()을 통해 Security의 확인 과정 생략
2. STOMP에 HandshakeHandler을 설정하여 websocket 연결 전 확인
3. ChannelInterceptor를 통한 메세지 핸들링
를 적용하며 보완했습니다.
구체적으로는 아래와 같이 사용했습니다.
preSend를 통해 command 파악
1. CONNECT 일 때
-> 비정상적인 세션 및 데이터 관리를 위한 Redis에 저장 로직
2. SEND일 때
-> 각 JSON의 type의 값을 조건으로 알맞는 DTO로 변경 후 데이터 처리
3. DISCONNECT일 때
-> Redis에 저장된 값 제거
💡 Tip.
ChannelInterceptor에서 accessor의 command를 사용해서 CONNECT일 때, 권한 및 인증을 확인할 수 있습니다.다만, 그 과정을 위해 무조건 Websocket이 연결이 되야만 하기 때문에 handshaking를 사용한 연결 전 처리보다는 상대적으로 비효율적 인 구조가 됩니다.