<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9B%B9%EC%86%8C%EC%BC%93</id>
	<title>웹소켓 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.gaonwiki.com/w/index.php?action=history&amp;feed=atom&amp;title=%EC%9B%B9%EC%86%8C%EC%BC%93"/>
	<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%9B%B9%EC%86%8C%EC%BC%93&amp;action=history"/>
	<updated>2026-07-06T04:02:09Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.gaonwiki.com/w/index.php?title=%EC%9B%B9%EC%86%8C%EC%BC%93&amp;diff=107939&amp;oldid=prev</id>
		<title>Gaon12: 시작</title>
		<link rel="alternate" type="text/html" href="https://www.gaonwiki.com/w/index.php?title=%EC%9B%B9%EC%86%8C%EC%BC%93&amp;diff=107939&amp;oldid=prev"/>
		<updated>2025-07-28T03:34:37Z</updated>

		<summary type="html">&lt;p&gt;시작&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;웹소켓&amp;#039;&amp;#039;&amp;#039;({{llang|en|WebSocket}})은 단일 [[TCP]] 연결로 동시양방향통신 채널을 제공하는 컴퓨터 통신 [[프로토콜]]이다. 웹소켓 프로토콜은 2011년 [[IETF]]에 의해 RFC 6455로 표준화되었으며 웹 IDL의 웹소켓 API는 [[W3C]]에 의해 표준화되고 있다.&lt;br /&gt;
&lt;br /&gt;
한마디로 말하면, &amp;#039;&amp;#039;&amp;#039;HTTP의 한계를 뛰어넘어 실시간 양방향 통신을 가능하게 하는 마법 같은 기술&amp;#039;&amp;#039;&amp;#039;이다. &amp;lt;s&amp;gt;더 이상 새로고침 버튼을 광클할 필요가 없다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
&lt;br /&gt;
웹소켓을 사용하면 서버와 브라우저 간 연결을 유지한 상태로 데이터를 교환할 수 있다. 이때 데이터는 &amp;#039;패킷(packet)&amp;#039; 형태로 전달되며, 전송은 커넥션 중단과 추가 HTTP 요청 없이 양방향으로 이뤄진다.&lt;br /&gt;
&lt;br /&gt;
=== 필요성 ===&lt;br /&gt;
&lt;br /&gt;
기존의 [[HTTP]] 통신은 &amp;#039;&amp;#039;&amp;#039;요청-응답&amp;#039;&amp;#039;&amp;#039; 방식의 단방향 통신이었다. 클라이언트가 요청을 보내야만 서버가 응답하는 구조로, 실시간 통신에는 매우 비효율적이었다. &amp;lt;s&amp;gt;마치 편지를 주고받는 것처럼 느렸다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어 채팅 애플리케이션을 만들려면:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;폴링(Polling)&amp;#039;&amp;#039;&amp;#039;: 주기적으로 서버에 &amp;quot;새 메시지 있어?&amp;quot; 하고 물어보기&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;롱 폴링(Long Polling)&amp;#039;&amp;#039;&amp;#039;: 새 메시지가 올 때까지 요청을 계속 유지하기&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Server-Sent Events&amp;#039;&amp;#039;&amp;#039;: 서버에서 클라이언트로만 데이터 전송&lt;br /&gt;
&lt;br /&gt;
하지만 이런 방법들은 모두 한계가 있었다. HTTP 프로토콜은 전통적인 웹사이트를 구현하는데 최적화된 통신 모델이다. 웹페이지를 제공할 때 서버에서는 클라이언트와 연결을 지속할 이유가 없다.&lt;br /&gt;
&lt;br /&gt;
웹소켓은 이러한 문제를 해결하기 위해 등장했다. 웹소켓 프로토콜은 클라이언트와 서버 간에 보다 효율적인 실시간 양방향 통신을 가능하게 하는 웹 표준 기술이다.&lt;br /&gt;
&lt;br /&gt;
== 동작 원리 ==&lt;br /&gt;
&lt;br /&gt;
=== 핸드셰이크 과정 ===&lt;br /&gt;
&lt;br /&gt;
웹소켓은 HTTP와 완전히 별개의 프로토콜이 아니다. 웹소켓은 HTTP와 완전 별개의 프로토콜로 보시기 보다는 HTTP 통신이 진화(upgrade)한 형태라고 보시는 것이 좋다.&lt;br /&gt;
&lt;br /&gt;
웹소켓 연결 과정은 다음과 같다:&lt;br /&gt;
&lt;br /&gt;
==== 클라이언트의 업그레이드 요청 ====&lt;br /&gt;
&lt;br /&gt;
클라이언트는 서버로 GET 방식으로 요청을 보내는데, 이때 Connection과 Upgrade와 같이 웹소켓에서만 쓰이는 조금 특별한 헤더를 함께 보낸다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /chat HTTP/1.1&lt;br /&gt;
Host: server.example.com&lt;br /&gt;
Upgrade: websocket&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==&lt;br /&gt;
Sec-WebSocket-Protocol: chat, superchat&lt;br /&gt;
Sec-WebSocket-Version: 13&lt;br /&gt;
Origin: http://example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
각 헤더의 의미:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Connection: Upgrade&amp;#039;&amp;#039;&amp;#039;: 클라이언트 측에서 프로토콜을 바꾸고 싶다는 신호를 보냈다는 것을 나타낸다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Upgrade: websocket&amp;#039;&amp;#039;&amp;#039;: 클라이언트측에서 요청한 프로토콜은 &amp;#039;websocket&amp;#039;이라는걸 의미한다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sec-WebSocket-Key&amp;#039;&amp;#039;&amp;#039;: 보안을 위해 브라우저에서 생성한 키로, 서버가 웹소켓 프로토콜을 지원하는지를 확인하는데 사용된다&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sec-WebSocket-Version&amp;#039;&amp;#039;&amp;#039;: 웹소켓 프로토콜 버전이 명시된다. 예시에서 버전은 13이다&lt;br /&gt;
&lt;br /&gt;
==== 서버의 응답 ====&lt;br /&gt;
&lt;br /&gt;
웹소켓 연결을 지원하는 서버라면 이 경우 101 Switching Protocols 상태 코드를 응답해준다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 101 Switching Protocols&lt;br /&gt;
Upgrade: websocket&lt;br /&gt;
Connection: Upgrade&lt;br /&gt;
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=&lt;br /&gt;
Sec-WebSocket-Protocol: chat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
여기서 Sec-WebSocket-Accept값은 특별한 알고리즘을 사용해 만든 Sec-WebSocket-Key 이다. 이 값을 보고 브라우저는 서버가 진짜 웹소켓 프로토콜을 지원하는지 확인한다.&lt;br /&gt;
&lt;br /&gt;
이렇게 본격적인 웹소켓 통신을 시작하기 전에 클라이언트와 서버가 간단히 HTTP로 메시지를 주고 받는 것을 보통 &amp;#039;&amp;#039;&amp;#039;핸드쉐이크(handshake)&amp;#039;&amp;#039;&amp;#039;라고도 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;마치 처음 만난 사람과 악수하는 것처럼 정중하다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 데이터 전송 ===&lt;br /&gt;
&lt;br /&gt;
핸드셰이크가 완료되면 이제 진짜 웹소켓 통신이 시작된다. 웹소켓 통신은 &amp;#039;프레임(frame)&amp;#039;이라 불리는 데이터 조각을 사용해 이뤄진다.&lt;br /&gt;
&lt;br /&gt;
프레임의 종류:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;텍스트 프레임(text frame)&amp;#039;&amp;#039;&amp;#039;: 텍스트 데이터가 담긴 프레임&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;이진 데이터 프레임(binary data frame)&amp;#039;&amp;#039;&amp;#039;: 이진 데이터가 담긴 프레임  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;핑·퐁 프레임(ping/pong frame)&amp;#039;&amp;#039;&amp;#039;: 커넥션이 유지되고 있는지 확인할 때 사용하는 프레임으로 서버나 브라우저에서 자동 생성해서 보내는 프레임&lt;br /&gt;
&lt;br /&gt;
== 장점과 특징 ==&lt;br /&gt;
&lt;br /&gt;
=== 주요 장점 ===&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;실시간 양방향 통신&amp;#039;&amp;#039;&amp;#039;: HTTP의 요청-응답 패턴에서 벗어나 실시간으로 데이터를 주고받을 수 있다.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;낮은 오버헤드&amp;#039;&amp;#039;&amp;#039;: 연결이 한 번 맺어지면 HTTP 헤더 없이 데이터만 주고받을 수 있어 효율적이다.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;HTTP 호환성&amp;#039;&amp;#039;&amp;#039;: 웹소켓은 HTTP 포트 80과 443 위에 동작하도록 설계되었으며 HTTP 프록시 및 중간 층을 지원하도록 설계되었으므로 HTTP 프로토콜과 호환이 된다&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;방화벽 친화적&amp;#039;&amp;#039;&amp;#039;: HTTP와 같은 포트를 사용하므로 대부분의 방화벽에서 차단되지 않는다.&lt;br /&gt;
&lt;br /&gt;
=== 활용 분야 ===&lt;br /&gt;
&lt;br /&gt;
이런 특징 때문에 웹소켓은 온라인 게임이나 주식 트레이딩 시스템같이 데이터 교환이 지속적으로 이뤄져야 하는 서비스에 아주 적합하다&lt;br /&gt;
&lt;br /&gt;
주요 활용 사례:&lt;br /&gt;
&lt;br /&gt;
==== 채팅 애플리케이션 ====&lt;br /&gt;
사용자가 실시간으로 메시지, 이모지, 이미지, 비디오 또는 오디오를 전송하고 수신할 수 있는 채팅 애플리케이션을 만드는 데 사용될 수 있다. 웹소켓은 또한 사용자가 동시에 여러 사람과 통신할 수 있는 단체 채팅, 비디오 채팅 또는 음성 채팅 애플리케이션 생성에도 사용될 수 있다.&lt;br /&gt;
&lt;br /&gt;
==== 실시간 알림 시스템 ====&lt;br /&gt;
새 메시지, 새 팔로워, 새 좋아요, 새 댓글 또는 새 주문과 같은 중요한 이벤트에 대해 사용자에게 경고하는 알림 시스템을 생성하는 데 사용될 수 있다.&lt;br /&gt;
&lt;br /&gt;
==== 금융 거래 시스템 ====&lt;br /&gt;
시세나 주문, 체결 등의 실시간 정보를 빠르고 편리하게 수신하고자 한다면 REST API보다는 WebSocket API의 사용을 권장한다&lt;br /&gt;
&lt;br /&gt;
==== 온라인 게임 ====&lt;br /&gt;
실시간 멀티플레이어 게임에서 플레이어들 간의 상호작용을 처리하는 데 필수적이다.&lt;br /&gt;
&lt;br /&gt;
== 프로토콜 스킴 ==&lt;br /&gt;
&lt;br /&gt;
웹소켓 URI에는 2가지의 종류가 있는데 ws://로 시작하는 경우와 wss://로 시작하는 경우다. ws은 WebSocket의 약자이고, wss는 WebSocket Secure의 약자이며 그냥 HTTP, HTTPS와 같은 개념인 것이다.&lt;br /&gt;
&lt;br /&gt;
=== ws:// ===&lt;br /&gt;
* 암호화되지 않은 웹소켓 연결&lt;br /&gt;
* HTTP와 유사하게 80번 포트 사용&lt;br /&gt;
* 개발 환경이나 내부 네트워크에서 주로 사용&lt;br /&gt;
&lt;br /&gt;
=== wss:// ===&lt;br /&gt;
* [[TLS]]/[[SSL]]로 암호화된 웹소켓 연결  &lt;br /&gt;
* HTTPS와 유사하게 443번 포트 사용&lt;br /&gt;
* 프로덕션 환경에서 권장&lt;br /&gt;
&lt;br /&gt;
wss://는 보안 이외에도 신뢰성(reliability) 측면에서 ws보다 좀 더 신뢰할만한 프로토콜이다. ws://를 사용해 데이터를 전송하면 데이터가 암호화되어있지 않은 채로 전송되기 때문에 데이터가 그대로 노출된다.&lt;br /&gt;
&lt;br /&gt;
보안을 신경쓰는 HTTPS를 사용하는 웹 사이트의 경우에는 ws대신 wss를 써야 한다. 웹소켓 클라이언트를 연결할 때 wss가 아니면 연결 시도조차 되지 않기 때문이다.&lt;br /&gt;
&lt;br /&gt;
== 브라우저 지원 현황 ==&lt;br /&gt;
&lt;br /&gt;
2025년 현재 웹소켓은 모든 주요 브라우저에서 지원된다:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[구글 크롬|Chrome]]&amp;#039;&amp;#039;&amp;#039;: 16+ (2012년 1월부터)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[파이어폭스|Firefox]]&amp;#039;&amp;#039;&amp;#039;: 11+ (2012년 3월부터)  &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[사파리 (웹 브라우저)|Safari]]&amp;#039;&amp;#039;&amp;#039;: 6+ (2012년 7월부터)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[마이크로소프트 엣지|Edge]]&amp;#039;&amp;#039;&amp;#039;: 모든 버전&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[인터넷 익스플로러]]&amp;#039;&amp;#039;&amp;#039;: 10+ &amp;lt;s&amp;gt;IE 9 이하는 포기하자. 아니 그만 IE를 놓아주자.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Firefox 버전 8이상도 이를 금지한다 - 혼합 콘텐츠(Mixed Content) 상황에서의 보안 정책을 의미한다.&lt;br /&gt;
&lt;br /&gt;
== 웹소켓 API 사용법 ==&lt;br /&gt;
&lt;br /&gt;
=== 기본 사용법 ===&lt;br /&gt;
&lt;br /&gt;
==== 연결 생성 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 기본 연결&lt;br /&gt;
const socket = new WebSocket(&amp;#039;ws://localhost:8080&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// 보안 연결 (권장)&lt;br /&gt;
const socket = new WebSocket(&amp;#039;wss://example.com/socket&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// 서브 프로토콜 지정&lt;br /&gt;
const socket = new WebSocket(&amp;#039;wss://example.com/socket&amp;#039;, [&amp;#039;protocol1&amp;#039;, &amp;#039;protocol2&amp;#039;]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 이벤트 처리 ====&lt;br /&gt;
&lt;br /&gt;
웹소켓에서는 네 가지 주요 이벤트를 처리할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 연결 성공 시&lt;br /&gt;
socket.onopen = function(event) {&lt;br /&gt;
    console.log(&amp;#039;웹소켓 연결 성공!&amp;#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// 메시지 수신 시  &lt;br /&gt;
socket.onmessage = function(event) {&lt;br /&gt;
    console.log(&amp;#039;받은 메시지:&amp;#039;, event.data);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// 에러 발생 시&lt;br /&gt;
socket.onerror = function(error) {&lt;br /&gt;
    console.error(&amp;#039;웹소켓 에러:&amp;#039;, error);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// 연결 종료 시&lt;br /&gt;
socket.onclose = function(event) {&lt;br /&gt;
    console.log(&amp;#039;웹소켓 연결 종료&amp;#039;);&lt;br /&gt;
    console.log(&amp;#039;코드:&amp;#039;, event.code, &amp;#039;이유:&amp;#039;, event.reason);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 데이터 전송 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 텍스트 전송&lt;br /&gt;
socket.send(&amp;#039;안녕하세요!&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// JSON 데이터 전송&lt;br /&gt;
socket.send(JSON.stringify({&lt;br /&gt;
    type: &amp;#039;message&amp;#039;,&lt;br /&gt;
    content: &amp;#039;실시간 메시지입니다!&amp;#039;&lt;br /&gt;
}));&lt;br /&gt;
&lt;br /&gt;
// 이진 데이터 전송&lt;br /&gt;
const buffer = new ArrayBuffer(32);&lt;br /&gt;
socket.send(buffer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 연결 종료 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 정상 종료&lt;br /&gt;
socket.close();&lt;br /&gt;
&lt;br /&gt;
// 종료 코드와 이유 지정&lt;br /&gt;
socket.close(1000, &amp;#039;정상 종료&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 연결 상태 확인 ===&lt;br /&gt;
&lt;br /&gt;
웹소켓의 연결 상태는 &amp;lt;code&amp;gt;readyState&amp;lt;/code&amp;gt; 속성으로 확인할 수 있다:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
switch(socket.readyState) {&lt;br /&gt;
    case WebSocket.CONNECTING:&lt;br /&gt;
        console.log(&amp;#039;연결 중...&amp;#039;);&lt;br /&gt;
        break;&lt;br /&gt;
    case WebSocket.OPEN:&lt;br /&gt;
        console.log(&amp;#039;연결됨&amp;#039;);&lt;br /&gt;
        break;&lt;br /&gt;
    case WebSocket.CLOSING:&lt;br /&gt;
        console.log(&amp;#039;종료 중...&amp;#039;);&lt;br /&gt;
        break;&lt;br /&gt;
    case WebSocket.CLOSED:&lt;br /&gt;
        console.log(&amp;#039;연결 종료됨&amp;#039;);&lt;br /&gt;
        break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 서버 측 구현 ==&lt;br /&gt;
&lt;br /&gt;
=== Node.js + ws 라이브러리 ===&lt;br /&gt;
&lt;br /&gt;
가장 기본적인 [[Node.js]] 웹소켓 서버 구현:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const WebSocket = require(&amp;#039;ws&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const wss = new WebSocket.Server({ port: 8080 });&lt;br /&gt;
&lt;br /&gt;
wss.on(&amp;#039;connection&amp;#039;, function connection(ws) {&lt;br /&gt;
    console.log(&amp;#039;새 클라이언트 접속&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    // 메시지 수신&lt;br /&gt;
    ws.on(&amp;#039;message&amp;#039;, function incoming(message) {&lt;br /&gt;
        console.log(&amp;#039;받은 메시지:&amp;#039;, message.toString());&lt;br /&gt;
        &lt;br /&gt;
        // 모든 클라이언트에게 브로드캐스트&lt;br /&gt;
        wss.clients.forEach(function each(client) {&lt;br /&gt;
            if (client !== ws &amp;amp;&amp;amp; client.readyState === WebSocket.OPEN) {&lt;br /&gt;
                client.send(message);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    // 연결 종료&lt;br /&gt;
    ws.on(&amp;#039;close&amp;#039;, function close() {&lt;br /&gt;
        console.log(&amp;#039;클라이언트 연결 종료&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Express와 함께 사용 ===&lt;br /&gt;
&lt;br /&gt;
[[Express.js]] 서버와 웹소켓을 함께 사용하는 예제:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
const WebSocket = require(&amp;#039;ws&amp;#039;);&lt;br /&gt;
const http = require(&amp;#039;http&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const app = express();&lt;br /&gt;
const server = http.createServer(app);&lt;br /&gt;
const wss = new WebSocket.Server({ server });&lt;br /&gt;
&lt;br /&gt;
// 웹소켓 로직&lt;br /&gt;
wss.on(&amp;#039;connection&amp;#039;, function connection(ws, req) {&lt;br /&gt;
    const ip = req.headers[&amp;#039;x-forwarded-for&amp;#039;] || req.connection.remoteAddress;&lt;br /&gt;
    console.log(&amp;#039;새로운 클라이언트 접속:&amp;#039;, ip);&lt;br /&gt;
    &lt;br /&gt;
    ws.on(&amp;#039;message&amp;#039;, function incoming(message) {&lt;br /&gt;
        console.log(&amp;#039;받은 메시지:&amp;#039;, message.toString());&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// HTTP 라우트&lt;br /&gt;
app.get(&amp;#039;/&amp;#039;, (req, res) =&amp;gt; {&lt;br /&gt;
    res.send(&amp;#039;웹소켓 서버가 실행 중입니다!&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
server.listen(3000, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;서버가 3000번 포트에서 실행 중입니다.&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 주요 라이브러리와 프레임워크 ==&lt;br /&gt;
&lt;br /&gt;
=== Socket.IO ===&lt;br /&gt;
&lt;br /&gt;
socket.io는 양방햔 통신을 하기위해 웹소켓 기술을 활용하는 라이브러리이다. 어찌보면 [[자바스크립트]]와 [[jQuery]]의 관계와 비슷하다고 할 수 있겠다.&lt;br /&gt;
&lt;br /&gt;
==== Socket.IO의 특징 ====&lt;br /&gt;
&lt;br /&gt;
[[Socket.IO]]는 웹소켓의 부가기능이 아니다. 웹소켓은 Socket.IO가 실시간, 양방향, 이벤트 기반 통신을 제공하는 방법 중 하나이다. 만약 당신의 브라우저나 기기가 웹소켓을 지원하지 않는다면 Socket.IO는 다른 방법을 사용해서 계속 동작할 것이다.&lt;br /&gt;
&lt;br /&gt;
주요 기능:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;자동 재연결&amp;#039;&amp;#039;&amp;#039;: 연결이 끊어져도 자동으로 재시도&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;폴백 지원&amp;#039;&amp;#039;&amp;#039;: 웹소켓이 지원되지 않을 때 HTTP Long Polling 사용&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;룸(Room) 기능&amp;#039;&amp;#039;&amp;#039;: 특정 사용자 그룹에게만 메시지 전송&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;이벤트 기반 통신&amp;#039;&amp;#039;&amp;#039;: 직관적인 이벤트 방식&lt;br /&gt;
&lt;br /&gt;
==== Socket.IO vs 순수 웹소켓 ====&lt;br /&gt;
&lt;br /&gt;
ws는 조금 불친절하지만 원하는대로 코드 작성하기가 쉬웠고, socket.io는 기능이 많고 쉽게 사용하기 쉬우며 직관적이다. 처음 배우기에 확실히 좋은건 socket.io, 원하는대로 커스텀하여 만들기 좋은 것은 ws라고 할 수 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Socket.IO 장점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 소켓 연결 실패 시 fallback을 통해 다른 방식으로 알아서 해당 클라이언트와 연결을 시도함&lt;br /&gt;
* 방 개념을 이용해 일부 클라이언트에게만 데이터를 전송하는 브로드캐스팅이 가능함&lt;br /&gt;
* 이벤트 기반의 직관적인 API&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;순수 웹소켓 장점:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 가벼움 (추가 라이브러리 불필요)&lt;br /&gt;
* 표준 기술&lt;br /&gt;
* 더 나은 성능&lt;br /&gt;
&lt;br /&gt;
==== Socket.IO 사용 예제 ====&lt;br /&gt;
&lt;br /&gt;
서버 측:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const io = require(&amp;#039;socket.io&amp;#039;)(3000);&lt;br /&gt;
&lt;br /&gt;
io.on(&amp;#039;connection&amp;#039;, (socket) =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;사용자 연결됨:&amp;#039;, socket.id);&lt;br /&gt;
    &lt;br /&gt;
    // 특정 룸에 입장&lt;br /&gt;
    socket.join(&amp;#039;room1&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
    // 메시지 처리&lt;br /&gt;
    socket.on(&amp;#039;message&amp;#039;, (data) =&amp;gt; {&lt;br /&gt;
        // 같은 룸의 다른 사용자들에게 전송&lt;br /&gt;
        socket.to(&amp;#039;room1&amp;#039;).emit(&amp;#039;message&amp;#039;, data);&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    // 연결 해제&lt;br /&gt;
    socket.on(&amp;#039;disconnect&amp;#039;, () =&amp;gt; {&lt;br /&gt;
        console.log(&amp;#039;사용자 연결 해제됨:&amp;#039;, socket.id);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
클라이언트 측:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const socket = io(&amp;#039;http://localhost:3000&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// 연결 성공&lt;br /&gt;
socket.on(&amp;#039;connect&amp;#039;, () =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;서버에 연결됨!&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// 메시지 전송&lt;br /&gt;
socket.emit(&amp;#039;message&amp;#039;, { text: &amp;#039;안녕하세요!&amp;#039; });&lt;br /&gt;
&lt;br /&gt;
// 메시지 수신&lt;br /&gt;
socket.on(&amp;#039;message&amp;#039;, (data) =&amp;gt; {&lt;br /&gt;
    console.log(&amp;#039;받은 메시지:&amp;#039;, data);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 기타 라이브러리들 ===&lt;br /&gt;
&lt;br /&gt;
==== ws (Node.js) ====&lt;br /&gt;
* 가장 인기 있는 Node.js 웹소켓 라이브러리&lt;br /&gt;
* 빠르고 가벼움&lt;br /&gt;
* 순수 웹소켓 표준 구현&lt;br /&gt;
&lt;br /&gt;
==== uWebSockets.js ====&lt;br /&gt;
* 고성능 웹소켓 라이브러리&lt;br /&gt;
* [[C++]]로 작성된 바인딩&lt;br /&gt;
* 대용량 트래픽 처리에 적합&lt;br /&gt;
&lt;br /&gt;
==== SockJS ====&lt;br /&gt;
* 웹소켓 호환성을 위한 라이브러리&lt;br /&gt;
* 다양한 폴백 옵션 제공&lt;br /&gt;
* 브라우저 호환성 중시&lt;br /&gt;
&lt;br /&gt;
== 보안 고려사항 ==&lt;br /&gt;
&lt;br /&gt;
=== Origin 검증 ===&lt;br /&gt;
&lt;br /&gt;
서버는 Origin 헤더를 보고 어떤 웹사이트와 소켓통신을 할지 결정하기 때문에 Origin 헤더는 웹소켓 통신에 중요한 역할을 한다.&lt;br /&gt;
&lt;br /&gt;
서버에서 Origin을 검증하는 예제:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const wss = new WebSocket.Server({&lt;br /&gt;
    port: 8080,&lt;br /&gt;
    verifyClient: (info) =&amp;gt; {&lt;br /&gt;
        const origin = info.origin;&lt;br /&gt;
        const allowedOrigins = [&amp;#039;https://example.com&amp;#039;, &amp;#039;https://app.example.com&amp;#039;];&lt;br /&gt;
        return allowedOrigins.includes(origin);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 인증과 인가 ===&lt;br /&gt;
&lt;br /&gt;
웹소켓 연결에서의 사용자 인증:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const wss = new WebSocket.Server({&lt;br /&gt;
    port: 8080,&lt;br /&gt;
    verifyClient: (info, callback) =&amp;gt; {&lt;br /&gt;
        // 토큰 검증&lt;br /&gt;
        const token = info.req.url.split(&amp;#039;token=&amp;#039;)[1];&lt;br /&gt;
        &lt;br /&gt;
        if (isValidToken(token)) {&lt;br /&gt;
            callback(true);&lt;br /&gt;
        } else {&lt;br /&gt;
            callback(false, 401, &amp;#039;Unauthorized&amp;#039;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rate Limiting ===&lt;br /&gt;
&lt;br /&gt;
[[DoS]] 공격 방지를 위한 연결 수 제한:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const connections = new Map();&lt;br /&gt;
&lt;br /&gt;
wss.on(&amp;#039;connection&amp;#039;, (ws, req) =&amp;gt; {&lt;br /&gt;
    const ip = req.connection.remoteAddress;&lt;br /&gt;
    const connectionCount = connections.get(ip) || 0;&lt;br /&gt;
    &lt;br /&gt;
    if (connectionCount &amp;gt;= 10) {&lt;br /&gt;
        ws.close(1008, &amp;#039;Too many connections&amp;#039;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    connections.set(ip, connectionCount + 1);&lt;br /&gt;
    &lt;br /&gt;
    ws.on(&amp;#039;close&amp;#039;, () =&amp;gt; {&lt;br /&gt;
        connections.set(ip, connections.get(ip) - 1);&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CSRF 방지 ===&lt;br /&gt;
&lt;br /&gt;
웹소켓은 [[SOP]](Same-Origin Policy)의 영향을 받지 않으므로 [[CSRF]] 공격에 취약할 수 있다. 적절한 토큰 검증이 필요하다.&lt;br /&gt;
&lt;br /&gt;
== 성능 최적화 ==&lt;br /&gt;
&lt;br /&gt;
=== 메시지 압축 ===&lt;br /&gt;
&lt;br /&gt;
Sec-WebSocket-Extensions: deflate-frame – 이 헤더는 브라우저에서 데이터 압축(deflate)을 지원한다는 것을 의미한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const wss = new WebSocket.Server({&lt;br /&gt;
    port: 8080,&lt;br /&gt;
    perMessageDeflate: {&lt;br /&gt;
        // 압축 설정&lt;br /&gt;
        threshold: 1024,&lt;br /&gt;
        concurrencyLimit: 10,&lt;br /&gt;
        memLevel: 7&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 연결 풀링 ===&lt;br /&gt;
&lt;br /&gt;
서버에서 연결을 효율적으로 관리:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
class WebSocketManager {&lt;br /&gt;
    constructor() {&lt;br /&gt;
        this.connections = new Set();&lt;br /&gt;
        this.rooms = new Map();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    addConnection(ws, userId) {&lt;br /&gt;
        this.connections.add(ws);&lt;br /&gt;
        ws.userId = userId;&lt;br /&gt;
        &lt;br /&gt;
        ws.on(&amp;#039;close&amp;#039;, () =&amp;gt; {&lt;br /&gt;
            this.connections.delete(ws);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    broadcast(message) {&lt;br /&gt;
        this.connections.forEach(ws =&amp;gt; {&lt;br /&gt;
            if (ws.readyState === WebSocket.OPEN) {&lt;br /&gt;
                ws.send(message);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Heartbeat 메커니즘 ===&lt;br /&gt;
&lt;br /&gt;
연결 상태를 확인하기 위한 ping/pong:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function heartbeat() {&lt;br /&gt;
    this.isAlive = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wss.on(&amp;#039;connection&amp;#039;, (ws) =&amp;gt; {&lt;br /&gt;
    ws.isAlive = true;&lt;br /&gt;
    ws.on(&amp;#039;pong&amp;#039;, heartbeat);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// 30초마다 ping 전송&lt;br /&gt;
const interval = setInterval(() =&amp;gt; {&lt;br /&gt;
    wss.clients.forEach((ws) =&amp;gt; {&lt;br /&gt;
        if (ws.isAlive === false) {&lt;br /&gt;
            return ws.terminate();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        ws.isAlive = false;&lt;br /&gt;
        ws.ping();&lt;br /&gt;
    });&lt;br /&gt;
}, 30000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 디버깅과 테스트 ==&lt;br /&gt;
&lt;br /&gt;
=== 브라우저 개발자 도구 ===&lt;br /&gt;
&lt;br /&gt;
[[구글 크롬|Chrome]] 개발자 도구에서 웹소켓 연결을 확인하는 방법:&lt;br /&gt;
# F12로 개발자 도구 열기&lt;br /&gt;
# Network 탭 선택&lt;br /&gt;
# WS (WebSocket) 필터 적용&lt;br /&gt;
# 연결된 웹소켓의 프레임 확인 가능&lt;br /&gt;
&lt;br /&gt;
=== 테스트 도구 ===&lt;br /&gt;
&lt;br /&gt;
==== wscat ====&lt;br /&gt;
명령줄에서 웹소켓을 테스트할 수 있는 도구:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 설치&lt;br /&gt;
npm install -g wscat&lt;br /&gt;
&lt;br /&gt;
# 연결 테스트&lt;br /&gt;
wscat -c ws://localhost:8080&lt;br /&gt;
&lt;br /&gt;
# 메시지 전송&lt;br /&gt;
&amp;gt; hello world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Postman ====&lt;br /&gt;
GUI 환경에서 웹소켓을 테스트할 수 있다. 최신 버전에서 웹소켓 지원을 추가했다.&lt;br /&gt;
&lt;br /&gt;
==== 온라인 테스트 도구 ====&lt;br /&gt;
* websocket.org/echo.html&lt;br /&gt;
* www.websocket.org/echo.html&lt;br /&gt;
&lt;br /&gt;
== 한계와 단점 ==&lt;br /&gt;
&lt;br /&gt;
=== 브라우저 제한사항 ===&lt;br /&gt;
&lt;br /&gt;
일부 웹 브라우저가 지원하지 않는다. &amp;lt;s&amp;gt;하지만 2025년에 IE를 쓰는 사람은 거의 없다&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 프록시와 방화벽 문제 ===&lt;br /&gt;
&lt;br /&gt;
아주 오래된 프락시 서버는 웹소켓이 무엇인지 몰라서 &amp;#039;이상한&amp;#039; 헤더가 붙은 요청이 들어왔다고 판단하고 연결을 끊어버린다.&lt;br /&gt;
&lt;br /&gt;
=== 상태 관리의 복잡성 ===&lt;br /&gt;
&lt;br /&gt;
HTTP와 달리 상태를 유지하므로:&lt;br /&gt;
* 서버 재시작 시 모든 연결 손실&lt;br /&gt;
* 로드 밸런싱이 복잡해짐&lt;br /&gt;
* 메모리 사용량 증가&lt;br /&gt;
&lt;br /&gt;
=== 스케일링 문제 ===&lt;br /&gt;
&lt;br /&gt;
대규모 서비스에서는:&lt;br /&gt;
* 연결 수 제한&lt;br /&gt;
* 서버 간 메시지 동기화 필요&lt;br /&gt;
* [[Redis]]나 [[RabbitMQ]] 같은 메시지 브로커 필요&lt;br /&gt;
&lt;br /&gt;
== 대안 기술들 ==&lt;br /&gt;
&lt;br /&gt;
=== Server-Sent Events (SSE) ===&lt;br /&gt;
&lt;br /&gt;
서버에서 클라이언트로만 데이터를 보내는 단방향 통신:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// 서버 측 (Express)&lt;br /&gt;
app.get(&amp;#039;/events&amp;#039;, (req, res) =&amp;gt; {&lt;br /&gt;
    res.writeHead(200, {&lt;br /&gt;
        &amp;#039;Content-Type&amp;#039;: &amp;#039;text/event-stream&amp;#039;,&lt;br /&gt;
        &amp;#039;Cache-Control&amp;#039;: &amp;#039;no-cache&amp;#039;,&lt;br /&gt;
        &amp;#039;Connection&amp;#039;: &amp;#039;keep-alive&amp;#039;&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    const data = `data: ${JSON.stringify({ message: &amp;#039;안녕하세요!&amp;#039; })}\n\n`;&lt;br /&gt;
    res.write(data);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// 클라이언트 측&lt;br /&gt;
const eventSource = new EventSource(&amp;#039;/events&amp;#039;);&lt;br /&gt;
eventSource.onmessage = function(event) {&lt;br /&gt;
    console.log(JSON.parse(event.data));&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;장점&amp;#039;&amp;#039;&amp;#039;: 구현이 간단, 자동 재연결&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;단점&amp;#039;&amp;#039;&amp;#039;: 단방향 통신만 가능&lt;br /&gt;
&lt;br /&gt;
=== HTTP/2 Server Push ===&lt;br /&gt;
&lt;br /&gt;
[[HTTP/2]]의 서버 푸시 기능을 활용한 실시간 데이터 전송:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// HTTP/2 서버 푸시 예제&lt;br /&gt;
const http2 = require(&amp;#039;http2&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
const server = http2.createSecureServer(options);&lt;br /&gt;
&lt;br /&gt;
server.on(&amp;#039;stream&amp;#039;, (stream, headers) =&amp;gt; {&lt;br /&gt;
    if (headers[&amp;#039;:path&amp;#039;] === &amp;#039;/&amp;#039;) {&lt;br /&gt;
        // 메인 페이지와 함께 필요한 리소스를 푸시&lt;br /&gt;
        stream.pushStream({ &amp;#039;:path&amp;#039;: &amp;#039;/style.css&amp;#039; }, (err, pushStream) =&amp;gt; {&lt;br /&gt;
            if (!err) {&lt;br /&gt;
                pushStream.respondWithFile(&amp;#039;/path/to/style.css&amp;#039;);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== gRPC Streaming ===&lt;br /&gt;
&lt;br /&gt;
고성능 [[RPC]] 프레임워크의 스트리밍 기능:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// gRPC 양방향 스트리밍&lt;br /&gt;
const grpc = require(&amp;#039;grpc&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
function chatStream(call) {&lt;br /&gt;
    call.on(&amp;#039;data&amp;#039;, (message) =&amp;gt; {&lt;br /&gt;
        console.log(&amp;#039;받은 메시지:&amp;#039;, message);&lt;br /&gt;
        call.write({ text: &amp;#039;응답 메시지&amp;#039; });&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    call.on(&amp;#039;end&amp;#039;, () =&amp;gt; {&lt;br /&gt;
        call.end();&lt;br /&gt;
    });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 미래 전망과 발전 방향 ==&lt;br /&gt;
&lt;br /&gt;
=== HTTP/3과 QUIC ===&lt;br /&gt;
&lt;br /&gt;
[[HTTP/3]]와 [[QUIC]] 프로토콜의 등장으로 웹소켓의 역할이 변화할 수 있다:&lt;br /&gt;
* 더 빠른 연결 설정&lt;br /&gt;
* 패킷 손실에 대한 더 나은 복구&lt;br /&gt;
* 다중 스트림 지원&lt;br /&gt;
&lt;br /&gt;
=== WebTransport ===&lt;br /&gt;
&lt;br /&gt;
차세대 웹 전송 API로, 웹소켓의 일부 한계를 해결:&lt;br /&gt;
* [[UDP]] 기반 전송 지원&lt;br /&gt;
* 더 낮은 지연 시간&lt;br /&gt;
* 더 유연한 전송 모드&lt;br /&gt;
&lt;br /&gt;
=== WebRTC Data Channel ===&lt;br /&gt;
&lt;br /&gt;
[[P2P]] 통신을 위한 대안:&lt;br /&gt;
* 서버를 거치지 않는 직접 통신&lt;br /&gt;
* 더 낮은 지연 시간&lt;br /&gt;
* 브라우저 간 직접 데이터 교환&lt;br /&gt;
&lt;br /&gt;
== 실제 사용 사례와 성공 사례 ==&lt;br /&gt;
&lt;br /&gt;
=== Discord ===&lt;br /&gt;
&lt;br /&gt;
대표적인 실시간 채팅 플랫폼으로, 웹소켓을 활용해:&lt;br /&gt;
* 실시간 메시지 전송&lt;br /&gt;
* 음성 채팅 상태 동기화&lt;br /&gt;
* 사용자 온라인 상태 관리&lt;br /&gt;
&lt;br /&gt;
=== Slack ===&lt;br /&gt;
&lt;br /&gt;
비즈니스 커뮤니케이션 도구로:&lt;br /&gt;
* 실시간 메시지 알림&lt;br /&gt;
* 파일 업로드 상태 표시&lt;br /&gt;
* 사용자 타이핑 상태 표시&lt;br /&gt;
&lt;br /&gt;
=== 온라인 게임 ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Agar.io&amp;#039;&amp;#039;&amp;#039;: 실시간 멀티플레이어 게임&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Slither.io&amp;#039;&amp;#039;&amp;#039;: 대규모 동시 접속자 처리&lt;br /&gt;
* 각종 브라우저 기반 [[MMORPG]]&lt;br /&gt;
&lt;br /&gt;
=== 금융 거래 플랫폼 ===&lt;br /&gt;
&lt;br /&gt;
코빗 가상자산 거래소의 실시간 정보를 가장 빠른 속도로 수신할 수 있다&lt;br /&gt;
&lt;br /&gt;
* 실시간 주가 정보&lt;br /&gt;
* 거래 체결 알림&lt;br /&gt;
* 포트폴리오 변동 사항&lt;br /&gt;
&lt;br /&gt;
== 같이 보기 ==&lt;br /&gt;
&lt;br /&gt;
* [[HTTP]]&lt;br /&gt;
* [[HTTPS]]&lt;br /&gt;
* [[TCP/IP]]&lt;br /&gt;
* [[Socket.IO]]&lt;br /&gt;
* [[Server-Sent Events]]&lt;br /&gt;
* [[WebRTC]]&lt;br /&gt;
* [[Ajax]]&lt;br /&gt;
* [[JSON]]&lt;br /&gt;
&lt;br /&gt;
== 각주 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 외부 링크 ==&lt;br /&gt;
&lt;br /&gt;
* [https://tools.ietf.org/html/rfc6455 RFC 6455 - The WebSocket Protocol]&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API MDN Web Docs - WebSocket API]&lt;br /&gt;
* [https://socket.io/docs/ Socket.IO 공식 문서]&lt;br /&gt;
* [https://github.com/websockets/ws ws 라이브러리 GitHub]&lt;br /&gt;
* [https://www.websocket.org/ WebSocket.org]&lt;br /&gt;
* [https://caniuse.com/websockets Can I Use WebSockets]&lt;br /&gt;
&lt;br /&gt;
[[분류:웹 기술]]&lt;br /&gt;
[[분류:네트워크 프로토콜]]&lt;br /&gt;
[[분류:실시간 통신]]&lt;br /&gt;
[[분류:자바스크립트 API]]&lt;br /&gt;
[[분류:HTML5]]&lt;/div&gt;</summary>
		<author><name>Gaon12</name></author>
	</entry>
</feed>