[스프링] 스프링 WebSocket과 웹 소켓 보안 이슈

웹 소켓(WebSocket)은 양방향 통신을 지원하는 기술로, HTML5의 일부로 포함되어 있습니다. 스프링 프레임워크는 이러한 웹 소켓을 스프링 WebSocket 모듈을 통해 지원하며, 이를 통해 클라이언트와 서버 간의 실시간 통신을 구현할 수 있습니다.

스프링 WebSocket

스프링 WebSocket은 STOMP (Simple Text Oriented Messaging Protocol)를 사용하여 웹 소켓을 지원합니다. STOMP는 메시지 기반 통신을 위한 간단한 프로토콜로, 스프링 내에서 메시징 기능을 제공하는데 사용됩니다. STOMP를 사용하면 메시지 브로커를 중개로 사용하여 양방향 통신을 할 수 있습니다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

위의 예제에서는 WebSocketConfig 클래스를 통해 /chat 엔드포인트를 등록하고, 메시지 브로커를 설정하여 /topic을 구독하는 클라이언트에게 메시지를 전달할 수 있도록 합니다.

웹 소켓 보안 이슈

스프링 WebSocket은 보안을 위해 다양한 방법을 제공합니다. 일반적으로 웹 애플리케이션의 인증 및 권한 부여 메커니즘을 WebSocket 연결에 적용할 수 있습니다.

또한, 웹 소켓을 통해 악의적인 사용자로부터 보호하기 위해 사용자 인증, 권한 검사 및 메시지 무결성 확인을 수행할 수 있습니다.

@Configuration
@EnableWebSocketSecurity
public class WebSocketSecurityConfig
        extends AbstractSecurityWebSocketMessageBrokerConfigurer {
 
    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages
            .simpDestMatchers("/app/**").authenticated()
            .anyMessage().authenticated();
    }
 
    @Override
    protected boolean sameOriginDisabled() {
        return true;
    }
}

위의 예제에서는 WebSocketSecurityConfig 클래스를 통해 /app/** 패턴의 메시지는 인증을 요구하도록 설정하고, 동일 출처 정책을 비활성화하는 방법을 보여줍니다.

이와 같이 스프링 WebSocket을 보다 안전하게 사용하기 위해 다양한 설정이 제공되고 있으며, 이를 통해 웹 소켓을 효과적으로 활용할 수 있습니다.

참고 자료: