
웹 개발을 하다 보면 '실시간 통신'이라는 주제를 많이 접하게 된다. 예를 들어, 주식 프로그램을 사용할 때 새로고침을 하지 않아도 실시간으로 주가가 변동하는 경우처럼 말이다. 이때 많이 등장하는 키워드 중 하나가 바로 웹소켓(WebSocket)이다.
웹소켓은 실시간 통신을 가능하게 해준다고 하는데, 웹소켓이 무엇이고 정확히 어떤 방식으로 동작하며 왜 사용해야 할까?
![]() | ![]() |
|---|
전기,전자 제품의 연결 단자를 소켓이라 한다.
웹소켓이란 웹에서 실시간으로 두 프로그램 간의 메시지 교환을 위한 통신 방법 중 하나이다.
일반적으로 브라우저는 HTTP 프로토콜을 통해 서버와 통신하는데, 이는 요청과 응답이 일회성으로 끝나는 구조이다. 하지만 채팅, 게임, 주식 시세 등 서버와 클라이언트가 계속 상호작용해야 하는 경우가 늘어나면서, 계속 연결을 유지하며 데이터를 주고받을 수 있는 프로토콜의 필요성이 증가하였다.
이런 이유로 웹소켓이 등장하였다. 간단히 말해, 브라우저와 서버가 연결된 파이프를 하나 열어두고(소켓 연결), 그 길을 통해 언제든지 자유롭게 데이터가 주고받는 방식이다.

웹소켓은 클라이언트와 서버 어느 쪽에서든 메시지를 보낼 수 있다. HTTP처럼 '요청▶응답' 단방향이 아니라 서버에서 먼저 클라이언트로 전송하는 것도 가능
HTTP에서 서버는 전여친과 같다. 답장은 해주지만 절대 선톡은 하지 않는다.
연결이 된 상태에서 끊기지 않고 유지된다. 필요할 때마다 데이터를 전송할 수 있고, 각 메시지마다 별도의 재연결이 필요하지 않다
HTTP 요청을 반복할 때마다 불필요한 헤더가 오가곤 하는데, 웹소켓은 한 번 연결을 맺으면 재연결 없이 계속 통신하므로 오버헤드가 훨씬 적다
🔔 오버헤드: 특정 기능을 수행하는데 드는 간접적인 시간 or 메모리
웹소켓은 HTML5에 포함된 기술이고 크롬,파이어폭스,사파리,엣지 등 대부분의 현대 브라우저에서 지원 가능
웹소켓 이전에도 실시간으로 보이게 만들기 위해 몇 가지 방식이 시도되었다. 하지만 모두 어느 정도 한계가 있었고, 그 부족함을 메워주는 것이 웹소켓이다. 아래는 이전의 통신 방법이다.


위와 같이 폴링,롱 폴링,SSE는 각각의 장점이 있지만, 완전한 양방향 실시간 통신을 구현하기엔 아쉬움이 있다.
웹소켓은 서버와 클라이언트 간 연결을 항상 유지하고 서로 마음대로 데이터를 주고받을 수 있어 훨씬 유연하다.
HTML5 이전의 기술로 구현된 서비스에서는 Socket.io, SockJS와 같은 라이브러리를 쓰면 된다.

1. 클라이언트(브라우저)가 HTTP 프로토콜을 이용해 Upgrade: websocket 헤더로 업그레이드 요청을 한다.
2. 서버가 이를 받아들일 수 있다면, 101 Switching Protocol이라는 상태 코드로 응답하며 프로토콜을 웹소켓으로 바꾼다.
이 과정을 핸드쉐이크라고 부르며, 일단 성공하면 이후에는 웹소켓 프로토콜이 적용되어 양방향 프로토콜을 웹소켓으로 바꾼다.
🔔 반드시 GET메서드를 사용해야 한다. 또한, Upgrade 정보는 서버,전송, 프로토콜 연결에서 다른 프로토콜로 업그레이드 or 변경하기 위한 규칙이다.
연결이 맺히면 클라이언트와 서버는 언제든지 서로 메시지를 주고받을 수 있다.
아래는 Java(Spring Boot)예시이다. 먼저 WebSocketConfig를 통해 핸들러를 등록할 수 있다.
// WebSocketConfig.java
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/ws") // 웹소켓 Endpoint: /ws
.setAllowedOrigins("*"); // CORS 허용
}
}
이렇게 설정 후, 실제 통신을 처리할 WebSocketHandler를 만든다.
// MyWebSocketHandler.java
public class MyWebSocketHandler extends TextWebSocketHandler {
// 클라이언트가 웹소켓 연결을 맺었을 때
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("새로운 웹소켓 세션 연결: " + session.getId());
// 필요하다면 세션 목록에 저장하거나, 사용자 정보를 확인하는 로직 등을 추가
}
// 클라이언트에서 텍스트 메시지를 보냈을 때
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("받은 메시지: " + message.getPayload());
// 수신 메시지를 가공하거나, 다른 사용자에게 전달하는 로직 등을 넣을 수 있음
// Echo 예시: 같은 메시지를 다시 클라이언트에게 보내기
session.sendMessage(new TextMessage("Echo: " + message.getPayload()));
}
// 웹소켓이 종료되었을 때
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("웹소켓 세션 종료: " + session.getId());
}
}
위 코드처럼 핸드쉐이크가 성공하면 afterConnectionEstablished가 호ㅓ출되어 연결을 맺은 뒤, 클라이언트가 웹소켓으로 보내온 메시지를 handleTextMessage에서 처리한다. 필요하면 다른 세션에게 메시지를 전달해 채팅 등을 구현할 수 있다.
2025년 현재, 웹소켓은 사실상 실시간 통신이 필요한 곳이라면 어디든 쓰이고 있다. 실시간 채팅/메신저, 실시간 협업 도구, 온라인 게임, IoT, 스트리밍 서비스 등 다양한 곳에 쓰인다.
다만 통신 환경이나 사용 사례에 따라 직접 대체하는 기술이 꾸준히 발전하고 있다.
🔔 UDP(User Datagram Protocol): 인터넷에서 컴퓨터 간에 데이터를 주고받을 때 사용되는 프로토콜. 보안과 신뢰성보다는 전송 속도와 효율성을 중시하는 경우에 사용
실시간이라는 키워드가 떠오른다면,
양방향 통신이 필요하다면,
WebSocket을 쓰자!