웹 소켓(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을 보다 안전하게 사용하기 위해 다양한 설정이 제공되고 있으며, 이를 통해 웹 소켓을 효과적으로 활용할 수 있습니다.
참고 자료: