문서의 각 단락이 어느 리비전에서 마지막으로 수정되었는지 확인할 수 있습니다. 왼쪽의 정보 칩을 통해 작성자와 수정 시점을 파악하세요.

웹소켓 API | |
정의 | 웹소켓 API는 웹 브라우저와 서버 간에 지속적인 양방향 통신 채널을 설정하기 위한 인터페이스입니다. |
주요 용도 | 실시간 웹 애플리케이션 온라인 게임 채팅 애플리케이션 실시간 데이터 스트리밍 |
최초 등장 | 2011년 |
관련 분야 | 웹 기술 네트워크 프로토콜 실시간 통신 |
개발자/표준화 기관 | IETF W3C |
상세 정보 | |
기술 사양 | 프로토콜: 웹소켓 프로토콜 (RFC 6455) 핸드셰이크: HTTP 업그레이드 메커니즘 사용 데이터 프레임: 바이너리 또는 텍스트 |
장점 | HTTP 폴링에 비해 오버헤드 감소 실시간 양방향 통신 가능 단일 TCP 연결 유지 |
관련 기술 | HTTP Server-Sent Events (SSE) WebRTC |

웹소켓 API는 웹 브라우저와 서버 사이에 양방향 통신 채널을 열어주는 자바스크립트 인터페이스이다. 이 기술은 기존의 HTTP 요청-응답 모델을 넘어서, 한 번 연결을 수립한 후 지속적으로 데이터를 주고받을 수 있는 풀 듀플렉스 통신을 가능하게 한다. 이로 인해 실시간 웹 애플리케이션을 구축하는 핵심 기술로 자리 잡았다.
이 API의 주요 용도는 실시간 상호작용이 필요한 서비스들이다. 대표적으로 채팅 애플리케이션, 온라인 게임, 주식 시세나 스포츠 중계와 같은 실시간 데이터 스트리밍, 그리고 협업 도구 등에 널리 활용된다. 서버가 클라이언트의 요청을 기다리지 않고도 데이터를 능동적으로 푸시할 수 있어, 사용자 경험을 크게 향상시킨다.
웹소켓 API는 IETF에 의해 웹소켓 프로토콜이 표준화되고, W3C에 의해 자바스크립트 API 표준이 정의되는 방식으로 발전해왔다. 2011년을 기점으로 주요 브라우저들에 구현되기 시작했으며, 현재는 HTML5와 함께 현대 웹 기술의 필수 구성 요소로 인정받고 있다. 이 기술은 네트워크 프로토콜과 웹 개발 분야에 지속적인 영향을 미치고 있다.

웹소켓 API의 역사는 웹에서 실시간 통신의 필요성이 대두되면서 시작된다. 초기 웹에서는 HTTP 프로토콜의 요청-응답 모델이 지배적이었는데, 이는 서버로부터 새로운 데이터를 얻기 위해 클라이언트가 지속적으로 폴링하거나, 서버가 클라이언트에 데이터를 푸시하기 위해 긴 연결을 유지하는 Comet과 같은 해킹 기법을 필요로 했다. 이러한 방법들은 효율성과 확장성 측면에서 한계가 명확했다.
보다 표준화되고 효율적인 양방향 통신 방안에 대한 요구는 IETF와 W3C의 공동 작업으로 이어졌다. IETF는 웹소켓 프로토콜을 표준화하는 작업을 담당했고, W3C는 웹 브라우저에서 이 프로토콜을 사용할 수 있는 자바스크립트 인터페이스인 웹소켓 API를 정의했다. 웹소켓 프로토콜의 초안은 2010년에 제안되었으며, 이후 2011년에 RFC 6455로 공식 표준이 발표되었다.
이 표준화와 함께 주요 웹 브라우저들은 빠르게 웹소켓 API를 구현하기 시작했다. 2011년을 전후로 구글 크롬, 모질라 파이어폭스, 오페라 등의 브라우저에 웹소켓 지원이 추가되면서 본격적인 도입이 이루어졌다. 이를 통해 개발자들은 채팅 애플리케이션, 온라인 게임, 주식 시세 표시와 같은 실시간 기능을 훨씬 간편하고 강력하게 구축할 수 있게 되었다.
웹소켓 API의 등장은 웹을 단순한 문서 전달 매체에서 풍부한 양방향 애플리케이션의 플랫폼으로 진화시키는 데 중요한 기여를 했다. 이후 서버 센트 이벤트나 WebRTC 같은 다른 실시간 기술들도 발전했지만, 웹소켓은 지속적이고 낮은 지연 시간의 양방향 연결이 필요한 경우 여전히 핵심 기술로 자리 잡고 있다.

웹소켓 연결을 수립하는 과정은 프로토콜 핸드셰이크로 시작한다. 이 핸드셰이크는 기존의 HTTP 연결을 웹소켓 프로토콜로 업그레이드하는 형태를 취한다. 클라이언트는 일반적인 HTTP 요청을 보내지만, 이 요청에는 연결을 웹소켓으로 전환하겠다는 특별한 헤더가 포함된다.
핸드셰이크 요청에는 Upgrade: websocket과 Connection: Upgrade 헤더가 필수적으로 포함된다. 또한, 보안을 위해 클라이언트가 생성한 무작위 키를 담은 Sec-WebSocket-Key 헤더를 서버로 보낸다. 서버는 이 키를 받아 표준화된 알고리즘으로 변환한 후, Sec-WebSocket-Accept 헤더에 담아 응답으로 돌려보낸다. 이 과정을 통해 클라이언트는 응답한 상대가 유효한 웹소켓 서버인지 확인할 수 있다.
핸드셰이크가 성공하면, 서버는 101 Switching Protocols라는 HTTP 상태 코드로 응답한다. 이는 프로토콜 전환이 완료되었음을 의미하며, 이후부터는 TCP 연결 위에서 순수한 웹소켓 데이터 프레임이 오가게 된다. 이 초기 핸드셰이크 덕분에 웹소켓은 기존 HTTP 인프라(예: 포트 80 또는 443, 프록시 서버)와 호환성을 유지하면서도 훨씬 효율적인 통신 채널을 열 수 있다.
웹소켓 프로토콜에서 실제 데이터를 주고받는 단위를 데이터 프레임이라고 한다. 웹소켓 API를 통해 애플리케이션에서 전송하는 메시지는 이 데이터 프레임 형식으로 인코딩되어 TCP 연결을 통해 전송된다. 데이터 프레임은 작은 헤더와 페이로드로 구성되어 오버헤드가 매우 적으며, 이는 HTTP의 반복적인 헤더 오버헤드 문제를 해결하는 웹소켓의 핵심 장점 중 하나이다.
데이터 프레임의 구조는 IETF의 RFC 6455 표준에 정의되어 있다. 프레임은 최종 비트(Fin), 예약 비트, 오피코드(Opcode), 마스킹 여부, 페이로드 길이, 마스킹 키(필요 시), 그리고 실제 데이터 페이로드로 이루어진다. 오피코드는 이 프레임이 텍스트나 바이너리 데이터를 담은 데이터 프레임인지, 아니면 연결 종료나 핑/퐁 같은 제어 프레임인지를 구분한다. 특히 텍스트 데이터는 UTF-8로 인코딩되어 전송되어야 한다.
하나의 논리적 메시지는 여러 개의 데이터 프레임으로 분할되어 전송될 수 있다. 이는 대용량 메시지를 효율적으로 전송하거나 전송 중에 메시지를 스트리밍할 때 유용하다. 애플리케이션 레벨의 웹소켓 API는 일반적으로 이러한 프레임의 조립과 분할을 자동으로 처리하여, 개발자가 프레임 단위가 아닌 완전한 메시지 단위로 송수신에 집중할 수 있게 한다.
웹소켓 연결은 TCP 연결 위에서 동작하며, 연결 수명 동안 특정 상태를 거친다. 웹소켓 API를 사용하는 클라이언트 애플리케이션은 WebSocket 객체의 readyState 속성을 통해 현재 연결 상태를 확인할 수 있다. 이 속성은 CONNECTING, OPEN, CLOSING, CLOSED 네 가지 상수 값을 가지며, 각각 연결의 특정 단계를 나타낸다.
CONNECTING 값은 핸드셰이크가 진행 중인 초기 상태를 의미한다. 서버와의 TCP 연결은 수립되었지만, 웹소켓 프로토콜 업그레이드 요청에 대한 응답이 아직 완료되지 않은 상태이다. 핸드셰이크가 성공적으로 완료되면 상태는 OPEN으로 변경된다. OPEN 상태에서는 양방향 통신 채널이 정상적으로 구축되어 애플리케이션이 send() 메서드를 통해 데이터를 전송하고 onmessage 이벤트를 통해 데이터를 수신할 수 있다.
연결 종료 절차가 시작되면 상태는 CLOSING으로 바뀐다. 이는 한쪽 끝점에서 닫기 프레임을 전송했거나 close() 메서드가 호출되었음을 나타낸다. 이 상태에서는 더 이상 새로운 데이터를 전송할 수 없다. 최종적으로 TCP 연결이 완전히 종료되면 상태는 CLOSED가 되며, 이때 WebSocket 객체는 더 이상 사용할 수 없다. 이러한 상태 변화는 onopen, onclose와 같은 이벤트 핸들러를 통해 애플리케이션에서 모니터링하고 대응할 수 있다.

WebSocket 객체는 웹소켓 API의 핵심 구성 요소로, 자바스크립트를 사용하여 웹 브라우저에서 웹소켓 연결을 생성하고 관리하는 데 사용된다. 이 객체는 생성자를 호출하여 인스턴스화되며, 서버의 URL을 지정하여 연결을 초기화한다. 생성된 객체는 연결의 수명 주기 동안 서버와의 통신 채널을 대표하며, 메시지를 주고받고 연결 상태를 모니터링하는 모든 작업의 진입점이 된다.
WebSocket 객체는 주요 이벤트 핸들러와 메서드를 제공한다. 주요 이벤트로는 연결이 성립되었을 때 발생하는 onopen, 서버로부터 메시지를 수신했을 때 발생하는 onmessage, 연결이 종료되었을 때 발생하는 onclose, 그리고 오류가 발생했을 때 트리거되는 onerror가 있다. 개발자는 이러한 이벤트에 콜백 함수를 할당하여 애플리케이션의 로직을 구현한다.
객체가 제공하는 주요 메서드에는 서버로 데이터를 전송하는 send() 메서드와 연결을 의도적으로 종료하는 close() 메서드가 포함된다. send() 메서드는 문자열, ArrayBuffer, Blob 객체 등 다양한 형식의 데이터를 인자로 받을 수 있다. WebSocket 객체의 readyState 속성을 확인하면 연결의 현재 상태, 즉 연결 중, 열림, 닫힘 등의 정보를 실시간으로 얻을 수 있다.
이 객체는 W3C에 의해 표준화된 웹 API의 일부이며, 현대적인 웹 브라우저와 Node.js와 같은 서버 측 환경에서 광범위하게 지원된다. 이를 통해 개발자는 HTTP의 요청-응답 모델의 제약 없이 효율적인 실시간 통신 기능을 웹 애플리케이션에 쉽게 통합할 수 있다.
웹소켓 API에서 이벤트 핸들러는 WebSocket 객체의 생명주기와 데이터 수신을 비동기적으로 처리하는 핵심 메커니즘이다. 웹소켓 연결의 상태 변화나 메시지 도착과 같은 사건은 이벤트로 발생하며, 개발자는 이러한 이벤트에 반응하는 함수인 이벤트 핸들러를 등록하여 애플리케이션 로직을 구현한다. 주요 이벤트로는 연결이 성공적으로 열렸을 때 발생하는 open, 서버로부터 데이터를 받았을 때 발생하는 message, 연결이 닫혔을 때 발생하는 close, 그리고 통신 중 오류가 발생했을 때 트리거되는 error가 있다.
이벤트 핸들러는 주로 onopen, onmessage, onclose, onerror와 같은 콜백 속성에 함수를 할당하는 방식으로 등록한다. 예를 들어, onmessage 핸들러는 서버로부터 텍스트 또는 바이너리 데이터가 도착할 때마다 호출되며, 이벤트 객체의 data 속성을 통해 실제 메시지 내용에 접근할 수 있다. 이러한 방식은 폴링이나 롱 폴링과 같은 기존 기술에 비해 서버 푸시를 효율적으로 구현할 수 있게 한다.
또한, addEventListener 메서드를 사용하여 동일한 이벤트 유형에 여러 개의 리스너를 등록하는 것도 가능하다. 이벤트 핸들러 내에서는 연결 상태를 확인하거나 수신된 데이터를 파싱하여 DOM을 업데이트하거나 애플리케이션 상태를 변경하는 작업을 수행한다. close 이벤트 핸들러에서는 연결 종료 코드와 사유를 확인하여 정상 종료인지 예외 상황인지를 판단할 수 있다.
이러한 이벤트 기반 아키텍처는 자바스크립트의 단일 스레드 모델에서도 실시간 통신을 원활하게 처리할 수 있도록 하며, 비동기 프로그래밍의 전형적인 예시이다. 이를 통해 개발자는 네트워크 통신의 복잡성을 직접 관리하지 않고도, 고수준의 이벤트에 반응하는 코드에 집중하여 실시간 웹 애플리케이션을 구축할 수 있다.
웹소켓 API의 주요 메서드는 WebSocket 객체를 통해 제공된다. 이 객체는 웹 브라우저의 자바스크립트 환경에서 생성되며, 서버와의 연결을 열고, 데이터를 주고받고, 연결을 종료하는 기능을 수행한다. 가장 핵심적인 메서드는 WebSocket() 생성자로, 이를 호출하면 지정된 URL의 서버와 연결을 시도한다. 연결이 성공적으로 수립되면 readyState 속성이 열린 상태로 변경되고, 이후 데이터 전송이 가능해진다.
데이터를 보내기 위해서는 send() 메서드를 사용한다. 이 메서드는 문자열, ArrayBuffer, Blob 객체 등 다양한 형식의 데이터를 인자로 받아 서버로 전송할 수 있다. 전송은 비동기적으로 이루어지며, 네트워크 버퍼가 준비되면 즉시 큐에 들어간다. send() 메서드를 호출한다고 해서 반드시 데이터가 즉시 네트워크를 통해 전송된다는 보장은 없으며, 이는 내부 송신 버퍼의 상태에 따라 결정된다.
연결을 종료할 때는 close() 메서드를 호출한다. 이 메서드는 선택적으로 닫기 코드와 이유를 설명하는 문자열을 인자로 받을 수 있으며, 웹소켓 프로토콜에 정의된 방법으로 정상적인 연결 종료 절차를 시작한다. 한번 닫힌 연결은 재사용할 수 없으며, 새로운 통신을 위해서는 새로운 WebSocket 객체를 생성해야 한다. 이러한 메서드들은 이벤트 핸들러와 함께 사용되어 실시간 통신 로직을 구성하는 기본 골격을 이룬다.

웹소켓 API는 실시간 상호작용이 필요한 다양한 웹 애플리케이션에서 핵심 역할을 한다. 가장 대표적인 사용 예시는 채팅 애플리케이션이다. 사용자가 메시지를 보내면 WebSocket 객체의 send() 메서드를 통해 서버로 즉시 전송되며, 서버는 연결된 다른 클라이언트들에게 해당 메시지를 실시간으로 전달한다. 이 과정에서 HTTP의 반복적인 폴링(Polling)이 필요 없어 지연 시간이 거의 없고 서버 부하도 줄어든다.
온라인 게임 또한 웹소켓 API의 주요 적용 분야다. 다수의 플레이어가 동시에 참여하는 게임에서는 플레이어의 위치, 행동, 게임 상태 변화 등의 데이터가 끊임없이 교환되어야 한다. 웹소켓을 사용하면 이러한 데이터를 실시간 통신으로 저지연 처리할 수 있어, 반응성이 중요한 게임 플레이 환경을 구축하는 데 필수적이다.
또한 주식 시장이나 스포츠 중계와 같은 실시간 데이터 스트리밍 서비스에서도 널리 활용된다. 서버에서 계속해서 갱신되는 데이터를 웹소켓 연결을 통해 클라이언트에 지속적으로 푸시(Push)할 수 있어, 사용자는 페이지를 새로 고치지 않고도 최신 정보를 확인할 수 있다. 이는 대시보드나 모니터링 시스템을 구현할 때도 유용하게 적용된다.

웹소켓 API를 사용할 때는 몇 가지 보안 고려사항을 주의해야 한다. 가장 중요한 점은 웹소켓 연결이 일반 HTTP 요청과 달리 교차 출처 리소스 공유 정책의 적용을 받지 않는다는 것이다. 이는 악의적인 웹사이트가 사용자의 브라우저를 통해 다른 도메인의 웹소켓 서버에 임의로 연결을 시도할 수 있음을 의미한다. 따라서 서버 측에서는 반드시 오리진 헤더를 검증하여 허용된 출처에서만 연결을 수락하도록 구현해야 한다.
데이터 무결성과 기밀성을 보장하기 위해서는 웹소켓 연결 시 wss://(WebSocket Secure) 프로토콜을 사용하는 것이 필수적이다. 이는 TLS 암호화를 통해 통신 채널을 보호하며, 중간자 공격으로부터 데이터를 안전하게 지킨다. 특히 인증 토큰이나 개인정보 같은 민감한 데이터를 주고받는 실시간 애플리케이션에서는 암호화되지 않은 ws:// 프로토콜의 사용을 피해야 한다.
또한, 클라이언트로부터 수신하는 모든 데이터는 신뢰할 수 없는 입력으로 간주하고 철저히 검증해야 한다. 웹소켓을 통한 데이터 교환은 JSON과 같은 구조화된 형식을 주로 사용하지만, 서버는 데이터의 형식, 크기, 내용을 검사하지 않으면 버퍼 오버플로우나 인젝션 공격에 취약해질 수 있다. 특히 채팅 애플리케이션에서는 수신 메시지에 대한 크로스사이트 스크립팅 필터링이 반드시 수반되어야 한다.

웹소켓 API는 실시간 양방향 통신을 위한 강력한 도구이지만, 특정 요구사항이나 제약 조건에 따라 다른 기술이 대안으로 고려될 수 있다. 가장 대표적인 대안은 폴링과 롱 폴링이다. 폴링은 클라이언트가 주기적으로 서버에 요청을 보내 새 데이터를 확인하는 방식으로, 구현이 간단하지만 불필요한 요청과 지연이 발생한다. 롱 폴링은 서버가 응답을 지연시켜 새 데이터가 있을 때까지 연결을 유지하는 방식으로, 폴링보다 실시간성은 높지만 여전히 연결 설정 오버헤드가 존재한다.
보다 발전된 대안으로는 서버 센트 이벤트가 있다. 이 기술은 서버에서 클라이언트로 단방향 데이터 스트리밍을 가능하게 하며, HTTP 연결 하나를 통해 지속적으로 이벤트를 전송한다. 주식 시세나 뉴스 피드처럼 서버에서 클라이언트로의 단방향 업데이트가 주를 이루는 애플리케이션에 적합하다. 웹소켓이 양방향 통신을 위해 설계된 반면, 서버 센트 이벤트는 단방향 데이터 흐름에 특화되어 있다.
또 다른 접근 방식은 WebRTC이다. 이는 브라우저 간에 플러그인 없이 미디어와 데이터를 직접 교환할 수 있게 하는 표준이다. P2P 통신에 최적화되어 있어, 웹소켓이 클라이언트-서버 모델에 기반하는 것과 차이가 있다. 따라서 화상 회의나 파일 공유와 같은 피어 간 실시간 애플리케이션에서 웹소켓 대신 또는 웹소켓과 함께 사용된다. 웹소켓은 시그널링 채널로, WebRTC는 실제 미디어 데이터 전송을 담당하는 하이브리드 구조도 흔히 사용된다.
기술 | 통신 방식 | 주요 특징 | 적합한 사용 사례 |
|---|---|---|---|
웹소켓 | 양방향 | 지속적 연결, 낮은 지연 | 실시간 채팅, 온라인 게임 |
서버 센트 이벤트 | 단방향(서버→클라이언트) | HTTP 기반 스트리밍 | 실시간 알림, 주식 시세 |
WebRTC | 양방향(P2P 또는 클라이언트-서버) | 미디어 스트리밍 최적화 | 화상 통화, P2P 파일 전송 |
폴링 / 롱 폴링 | 양방향(요청-응답) | 구현 간단, 오버헤드 존재 | 간단한 업데이트, 레거시 시스템 |
이 외에도 MQTT나 AMQP와 같은 경량 메시징 프로토콜도 특정 환경, 특히 사물인터넷 장치나 대역폭이 제한된 상황에서 웹소켓의 대안이 될 수 있다. 최종 기술 선택은 애플리케이션의 실시간성 요구사항, 데이터 흐름의 방향, 확장성, 그리고 기존 인프라와의 호환성을 종합적으로 고려하여 이루어진다.
