[스프링] 스프링 WebSocket의 보안

WebSocket은 양방향 통신을 지원하는 프로토콜로, 실시간으로 데이터를 주고받을 수 있습니다. 스프링 프레임워크에서는 스프링 WebSocket을 통해 WebSocket을 쉽게 구현하고 사용할 수 있습니다. 그러나 WebSocket을 사용할 때 보안에 대한 고려가 필요합니다.

WebSocket 보안 설정

스프링 시큐리티는 웹 소켓 보안을 구성할 수 있는 다양한 설정을 제공합니다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.simpDestMatchers("/secured/**").authenticated();
    }
}

위의 예시는 WebSocket을 사용하는 /secured/ 엔드포인트에 접근할 때 인증을 필요로 한다는 것을 보여줍니다.

웹 소켓과 CSRF(Cross-Site Request Forgery)

스프링 시큐리티에서는 기본적으로 CSRF 보호 기능을 제공합니다. 그러나 웹 소켓은 이 CSRF 보호 기능을 우회하여 공격자가 웹 소켓을 이용해 CSRF 공격을 수행할 수 있습니다. 이를 방지하기 위해선, 추가적인 설정이 필요합니다.

@Configuration
@EnableWebSocket
public class WebSocketConfig extends WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS().setInterceptors(csrfTokenHandshakeInterceptor());
    }
}

위 코드에서 csrfTokenHandshakeInterceptorCSRF 토큰을 생성하여 웹 소켓 연결 요청에 포함시키는 역할을 합니다.

결론

스프링 WebSocket을 사용할 때에는 보안에 대한 고려가 필요합니다. 스프링 시큐리티를 통해 쉽게 웹 소켓 보안을 설정할 수 있으며, CSRF 공격을 방지하기 위한 추가적인 설정도 필요합니다. 이러한 보안 설정을 통해 안전하고 신뢰할 수 있는 웹 소켓 통신을 구현할 수 있습니다.

참고 자료: