자바&스프링

[Spring] WebSocket & STOMP로 채팅 구현하기 (4)

온한온 2025. 4. 7. 21:51

프론트로 넘어가기 전 JWT 유효성 검사를 위해 configureClientInboundChannel를 사용했습니다.

다시 WebSocketConfig로 돌아가서...

 

WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final JwtUtil jwtUtil;

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) {
                    String token = accessor.getFirstNativeHeader("Authorization");
                    if (token != null && token.startsWith("Bearer ")) {
                        token = token.replace("Bearer ", "");
                        // 사원 번호 찾기
                        String empNo = jwtUtil.getUsername(token);
                        accessor.setUser(new Principal() {
                            @Override
                            public String getName() {
                                return empNo;
                            }
                        });
                    }
                }
                return message;
            }
        });
    }
    
    // ...registerStompEndpoints, configureMessageBroker
}

 

registerStompEndpoints와 configureMessageBroker에 관한 내용은 [Spring] WebSocket & STOMP로 채팅 구현하기 (2) 여기를 참고해주시길 바랍니다.

 

configureClientInboundChannel를 통해 메서드를 재정의했습니다.

ChannelInterceptor의 경우 따로 클래스를 정의 구현하는 방법도 있지만, 저는 한 번에 해도 상관이 없을 거 같아서 WebSocketConfig 안에서 다 정의했습니다.

 

WebSocket을 처음 연결할 때만 Security Filter를 통과하고, WebSocket 연결 이후에는 Security Filter가 적용되지 않습니다.

 

이후 연결된 토큰을 가지고 와서 토큰 분리를 해줬습니다.

String token = accessor.getFirstNativeHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
    token = token.replace("Bearer ", "");

이런 식으로 토큰을 분리해준 뒤

 

String empNo = jwtUtil.getUsername(token);
accessor.setUser(new Principal() {
    @Override
    public String getName() {
        return empNo;
    }
});

이렇게 로그인한 사원 번호를 찾았습니다.

 

 

 

아직 이 부분에 대한 내용은 공부가 더 필요한 상황인 거 같습니다..

WebSocket이 연결할 때 딱 한 번만 Security Filter를 타므로 적절한 Interceptor 설정이 필요하다는 것을 알았지만.....

Security도 함께 공부하면서 구체적으로 다시 확인해볼 필요가 있는 거 같습니다.