SSAFY) Websocket에서의 Spring Security + Interceptor

GoRuth·2025년 5월 3일

프로젝트를 진행하며, Oauth + STOMP으로 사용하며 보완했던 경험을 같이 공유하고자 간단하게 포스팅을 작성해보려 합니다.

Websocket + Spring Security

  • WebSocket 연결은 아래와 같은 과정으로 진행이 됩니다.
    1. HTTP 프로토콜을 사용해 접근
    2. Websocket으로 Upgrade를 진행하며 연결 시도
    3. 연결 유무 응답을 return
  • 해당 과정에서 Spring Security는 HTTP 요청까지만 인증 및 권한 파악을 진행하며, WebSocket 메시지 이후의 통신에는 적용되지 않습니다.
MySQL 접속 use Spring Security
  • 따라서 WebSocket 인증은 HandshakeInterceptor에서 1차적으로 인증 정보를 저장하고, 이후 메시지 처리 과정에서는 ChannelInterceptor를 통해 권한 검사를 수행하는 방식으로 구현해야 합니다.
MySQL 접속 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를 사용한 연결 전 처리보다는 상대적으로 비효율적 인 구조가 됩니다.

profile
Backend Developer

0개의 댓글