Web Socket
웹 기술에서 실시간 양방향 통신을 가능케 하는 프로토콜 중 하나입니다. 초기에 웹에서 주로 폴링이나 롱 폴링 같은 방식을 통해 실시간 통신을 시도했으나 이러한 방식들은 효율성이나 성능 면에서 한계가 있습니다. 웹 소켓은 이러한 한계를 극복하기 위해 설계되었습니다. 기존의 HTTP 프로토콜은 클라이언트가 서버에게 요청을 보내고, 서버가 응답을 보내는 단방향 통신이었습니다. 반면에 웹 소켓은 클라이언트와 서버 간에 양방향 통신이 가능하도록 하면, 이를 위해 TCP 접속을 유지하게 됩니다. 또한 웹소켓은 실시간 채팅 어플리케이션, 소셜 네트워크 서비스, 협업 도구, 멀티플레이 게임, 화상 회의 등 다양한 분야에서 사용되고 있습니다.
웹 소켓 동작 방식
1. 포트 및 프로토콜 선택
웹 소켓은 주로 HTTP 포트 80 또는 HTTPS 포트 443위에서 동작합니다. 일반적으로는 웹 애플리케이션의 보안을 강화하기 위해 HTTPS위에 사용합니다.
2. 핸드셰이크
클라이언트가 서버에 처음 접속할때, HTTP 프로토콜을 사용하여 핸드셰이크를 수행하고 클라이언트가 웹 소켓을 연결을 요청하면, 서버는 HTTP 업그레이드 헤더를 사용하여 연결을 업그레이드 하여 웹 소켓 프로토콜을 변경하게 됩니다. 이러한 핸드셰이크는 최초 접속시에만 발생하게 되며, 이후에는 계속 유지하게 됩니다.
3. 영구적인 연결
핸드셰이크가 성공하면 양방향 통신을 위한 영구적인 연결이 맺어집니다.
4. 프로토콜 변경
핸드셰이크 이후에는 HTTP 프로토콜에서 웹 소켓 프로토콜로 변경되며 이제 양쪽이 데이터를 주고받을 때 HTTP의 요청-응답 방식이 아니라,양방향 통신이 가능한 웹 소켓 프로토콜을 사용합니다.
5. 보안 강화를 위한 암호화
연결이 암호화 되지 않은 경우, 데이터가 노출될 수 있습니다. 이를 방지하기 위해 데이터를 암호화하기 위해 (WSS)프로토콜을 사용할 수 있습니다.
Web소켓 사용이유
실시간 양방향 통신
서버와 클라이언트 간의 실시간 양방향 통신을 제공하기 때문에 서버 클라이언트로 클라이언트에서 서버로 데이터를 효과적으로 전송하고 수신할 수 있게 합니다. 이런 특성으로 실시간 업데이트나 이벤트 처리에 유용해집니다.
쉬운 확장성
단일 서버는 여러 Web Socket 연결을 동시에 열 수 있습니다. 또한 동일한 클라이언트에 대한 여러 연결을 열어 확장성을 쉽게 확보할 수 있습니다.
사용한 WebSocketConfig
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 웹소켓이 handshake를 하기 위해 연결하는 endpoint
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 서버 -> 클라이언트로 발행하는 메세지에 대한 endpoint 설정 : 구독
registry.enableSimpleBroker("/room");
// 클라이언트 -> 서버로 발행하는 메세지에 대한 endpoint 설정 : 구독에 대한 메세지
registry.setApplicationDestinationPrefixes("/send");
}
}
'Spring(Boot & FrameWork)' 카테고리의 다른 글
STOMP (0) | 2024.01.23 |
---|---|
지연로딩, 즉시로딩 (0) | 2023.12.26 |
Proxy (0) | 2023.12.22 |