{{위키데이터 속성 추적}}
{{Infobox protocol
| name        = 웹소켓
| image       = Websocket connection.png
| caption     = 웹소켓을 사용한 연결을 나타낸 그림
| standard    = {{IETF RFC|6455}}
| developer   = [[IETF]]
| introdate   = 
| industry    = [[컴퓨터 과학]]
| connector   = [[전송 제어 프로토콜|TCP]]
| hardware    = 
| range       = 
| newer       = 
| website     = {{공식 웹사이트}}
}}
'''웹소켓'''(WebSocket)은 하나의 [[전송 제어 프로토콜|TCP]] 접속에 [[이중통신|전이중 통신]] 채널을 제공하는 컴퓨터 [[통신 프로토콜]]이다. 웹소켓 프로토콜은 2011년 [[국제 인터넷 표준화 기구|IETF]]에 의해 [[RFC]] 6455로 표준화되었으며 [[웹 IDL]]의 웹소켓 [[API]]는 [[W3C]]에 의해 표준화되고 있다.

웹소켓은 HTTP와 구별된다. 두 프로토콜 모두 [[OSI 모델]]의 제7계층에 위치해 있으며 제4계층의 TCP에 의존한다. 이들에 차이가 있으나 "RFC 6455"에 따르면 웹소켓은 HTTP 포트 80과 443 위에 동작하도록 설계되었으며 HTTP 프록시 및 중간 층을 지원하도록 설계되었으므로 HTTP 프로토콜과 호환이 된다. 호환을 달성하기 위해 웹소켓 [[핸드셰이크]]는 [[HTTP/1.1 업그레이드 헤더|HTTP 업그레이드 헤더]]를 사용하여<ref>{{Cite IETF |title=RFC 6455 The WebSocket Protocol |publisher = [[국제 인터넷 표준화 기구|IETF]] |section=1.7 |sectionname=Relationship to TCP and HTTP |rfc=6455 |date=December 2011|author1=Ian Fette |author2=Alexey Melnikov}}</ref> HTTP 프로토콜에서 웹소켓 프로토콜로 변경한다.

웹소켓 프로토콜은 HTTP 폴링과 같은 반이중방식에 비해 더 낮은 부하를 사용하여 [[웹 브라우저]](또는 다른 클라이언트 애플리케이션)과 [[웹 서버]] 간의 통신을 가능케 하며, 서버와의 실시간 데이터 전송을 용이케 한다. 이는 먼저 클라이언트에 의해 요청을 받는 방식이 아닌, 서버가 내용을 클라이언트에 보내는 표준화된 방식을 제공함으로써, 또 연결이 유지된 상태에서 메시지들을 오갈 수 있게 허용함으로써 가능하게 되었다. 이러한 방식으로 양방향 대화 방식은 클라이언트와 서버 간에 발생할 수 있다. 통신은 TCP 포트 80(TLS 암호화 연결의 경우 443)를 통해 수행되며 [[방화벽]]을 통해 웹이 아닌 인터넷 연결을 차단하는 일부 환경에 도움이 된다. 단순 양방향 브라우저-서버 통신은 [[코멧 (프로그래밍)|코멧]] 등의 스톱갭(stopgap) 기술을 사용하는 비표준 방식으로 수행된다.

[[구글 크롬]], [[마이크로소프트 에지]], [[인터넷 익스플로러]], [[파이어폭스]], [[사파리]], [[오페라]] 등 대부분의 브라우저가 이 프로토콜을 지원한다.

== 개요 ==
HTTP와 달리 웹소켓은 전이중 통신을 사용한다.<ref>{{웹 인용|url=https://developer.mozilla.org/en-US/docs/Glossary/WebSockets|publisher= Mozilla Developer Network|date=2015|title=Glossary:WebSockets}}</ref><ref name=quantum>{{웹 인용 |url=http://www.websocket.org/quantum.html |제목=HTML5 WebSocket: A Quantum Leap in Scalability for the Web |확인날짜=2019-11-21 |archive-date=2021-04-01 |archive-url=https://web.archive.org/web/20210401044556/http://www.websocket.org/quantum.html |url-status=dead }}</ref>
또, 웹소켓은 TCP 위에서 메시지 스트리밍을 가능케 한다. TCP 단독으로는 메시지의 상속 개념 없이 바이트 스트림을 다룬다. 웹소켓 이전에는 포트 80 전이중 통신은 [[코멧 (프로그래밍)|코멧]] 채널을 사용하여 수행이 가능했다. 그러나 코멧 구현체는 사소한 것이 아니었으며 TCP 핸드셰이크와 HTTP 헤더 부하로 인해 작은 메시지에는 비효율적이다. 웹소켓 프로토콜은 웹의 보안 문제를 타협하지 않고 이 문제를 해결하는 것을 목적으로 한다.

웹소켓 프로토콜 사양은 2개의 새로운 [[통합 자원 식별자]](URI) 스킴으로 <code>ws</code>(WebSocket), <code>wss</code>(WebSocket Secure)를 정의하며<ref>{{웹 인용|url=https://www.iana.org/assignments/uri-schemes.html |title=IANA Uniform Resource Identifer (URI) Schemes |publisher=[[Internet Assigned Numbers Authority]] |date=2011-11-14 |accessdate=2011-12-10|editor=Graham Klyne}}</ref> 이들은 암호화되지 않은 연결과 암호화된 연결에 각각 사용된다.

== 역사 ==
웹소켓은 TCP 기반 소켓 API를 대체할 목적으로 [[HTML5]] 사양에서 TCPConnection으로 처음 참조되었다.<ref>{{웹 인용|url=https://www.w3.org/TR/2008/WD-html5-20080610/comms.html#tcp-connections|title=HTML 5|website=www.w3.org|access-date=2016-04-17}}</ref> 2008년 6월, 일련의 토론이 마이클 카터(Michael Carter)에 의해 주도되었으며, 웹소켓으로 알려진 최초 버전의 프로토콜이 탄생되었다.<ref>{{웹 인용|url=https://lists.w3.org/Archives/Public/public-whatwg-archive/2008Jun/0165.html|title=[whatwg] TCPConnection feedback from Michael Carter on 2008-06-18 (whatwg.org from June 2008)|website=lists.w3.org|access-date=2016-04-17}}</ref>

== 브라우저 구현체 ==
{| class="wikitable"
|+ 구현체 상태
! 프로토콜
! 초안일
! 인터넷 익스플로러
! 파이어폭스<ref>{{웹 인용 |url=https://developer.mozilla.org/en/WebSockets |title=WebSockets (support in Firefox) |publisher=Mozilla Foundation |website=developer.mozilla.org |date=2011-09-30 |accessdate=2011-12-10 |archive-date=2012-05-26 |archive-url=https://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets }}</ref> (PC)
! 파이어폭스 (안드로이드)
! 크롬 (PC, 모바일)
! 사파리 (맥, iOS)
! 오페라 (PC, 모바일)
! 안드로이드 브라우저
|-
! [https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75 hixie-75]
| 2010년 2월 4일
|
|
|
| 4
| 5.0.0
|
|
|-
! [https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76 hixie-76]<br />[https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00 hybi-00]
| 2010년 5월 6일<br />2010년 5월 23일
|
| 4.0 (비활성화)
|
| 6
| 5.0.1
| 11.00 (비활성화)
|
|-
! 7 [https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-07 hybi-07]
| 2011년 4월 22일
|
| 6<ref>{{웹 인용|url=https://bugzilla.mozilla.org/show_bug.cgi?id=640003 |title=Bug 640003 - WebSockets - upgrade to ietf-06 |publisher=Mozilla Foundation |date=2011-03-08 |accessdate=2011-12-10}}</ref>{{Efn|name="mozwebsocket"|Gecko-based browsers versions 6–10 implement the WebSocket object as "MozWebSocket",<ref>{{웹 인용 |url=https://developer.mozilla.org/en/WebSockets |title=WebSockets - MDN |website=developer.mozilla.org |publisher=Mozilla Foundation |date=2011-09-30 |accessdate=2011-12-10 |archive-date=2012-05-26 |archive-url=https://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets }}</ref> requiring extra code to integrate with existing WebSocket-enabled code.}}
|
|
|
|
|
|-
! 8 [https://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10 hybi-10]
| 2011년 7월 11일
|
| 7<ref>{{웹 인용|url=https://bugzilla.mozilla.org/show_bug.cgi?id=640003#c91 |title=Bug 640003 - WebSockets - upgrade to ietf-07(comment 91)|publisher=Mozilla Foundation|date=2011-07-22}}</ref>{{Efn|name="mozwebsocket"}}
| 7
| 14<ref>{{웹 인용|url=https://code.google.com/p/chromium/issues/detail?id=64470 |title=Chromium bug 64470 |website=code.google.com |publisher=Google|date=2010-11-25 |accessdate=2011-12-10}}</ref>
|
|
|
|-
! 13 RFC 6455
| 2011년 12월
| 10<ref>{{웹 인용|url=https://blogs.msdn.com/b/ie/archive/2012/03/19/websockets-in-windows-consumer-preview.aspx |title=WebSockets in Windows Consumer Preview |publisher=Microsoft|work=IE Engineering Team |date=2012-03-19 |accessdate=2012-07-23}}</ref>
| 11
| 11
| 16<ref>{{웹 인용|url=https://trac.webkit.org/changeset/97249 |title=WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17 |website=trac.webkit.org |date= |accessdate=2011-12-10}}</ref>
| 6
| 12.10<ref>{{웹 인용|url=http://my.opera.com/ODIN/blog/2012/08/03/a-hot-opera-12-50-summer-time-snapshot |title=A hot Opera 12.50 summer-time snapshot |publisher=Opera Developer News |date=2012-08-03 |accessdate=2012-08-03|archiveurl=https://web.archive.org/web/20120805234006/http://my.opera.com/ODIN/blog/2012/08/03/a-hot-opera-12-50-summer-time-snapshot|archivedate=2012-08-05}}</ref>
| 4.4
|}

== 프로토콜 핸드셰이크 ==
웹소켓을 연결하기 위해 클라이언트는 웹소켓 핸드셰이크 요청을 보내며, 이렇게 하면 서버는 웹소켓 핸드셰이크 응답을 아래의 예에서 보는 바와 같이 반환한다.<ref>{{Cite IETF |title=RFC 6455 The WebSocket Protocol|publisher = [[국제 인터넷 표준화 기구|IETF]] |section=1.2|sectionname=Protocol Overview|rfc=6455|date=December 2011|author1=Ian Fette|author2=Alexey Melnikov}}</ref>

클라이언트 요청:

<syntaxhighlight lang="http">
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
</syntaxhighlight>

서버 응답:

<syntaxhighlight lang="http">
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
</syntaxhighlight>

== 프록시 경유 ==
웹소켓 프로토콜 클라이언트 구현체는 목적지 호스트와 포트에 연결할 때 [[사용자 에이전트]]가 프록시를 사용하도록 구성되어 있는지 확인을 시도하며 만일 그러한 경우 [[HTTP 터널|HTTP CONNECT]] 메소드를 사용하여 영구적인 터널을 구성한다.

웹소켓 프로토콜 그 자체는 프록시 서버와 방화벽을 인지하지 못하지만 HTTP 호환 핸드셰이크의 기능을 제공하므로 HTTP 서버들이 기본 HTTP와 HTTPS 포트(80과 443)를 웹소켓 게이트웨이나 서버와 공유할 수 있게 한다. 웹소켓 프로토콜은 웹소켓과 웹소켓 안전 연결을 나타내기 위해 각각 ws://과 wss:// 두문자를 정의한다. 이 두 스킴은 [[HTTP/1.1 업그레이드 헤더|HTTP 업그레이드 매커니즘]]을 사용하여 웹소켓 프로토콜로 업그레이드한다. 일부 프록시 서버는 투명(transparent)하며 웹소켓과 잘 동작한다. 다른 것들은 웹소켓이 정상 동작하지 못해 연결을 실패한다. 일부의 경우 추가 프록시 구성이 필요할 수 있으며 웹소켓 지원을 위해 특정 프록시 서버의 업그레이드가 필요할 수 있다.

암호화되지 않은 웹소켓 트래픽이 웹소켓을 지원하지 않는 명시적이거나 투명한 프록시 서버를 통해 경유하는 경우 연결이 실패할 가능성이 높다.<ref>{{웹 인용|url=http://www.infoq.com/articles/Web-Sockets-Proxy-Servers |title=How Web Sockets Interact With Proxy Servers |website=Infoq.com |date= March 16, 2010 |publisher=C4Media Inc. |author=Peter Lubbers |accessdate=2011-12-10}}</ref>

암호화된 웹소켓 연결을 사용하는 경우 웹소켓 보안 연결에 [[전송 계층 보안]](TLS)을 사용함으로써 브라우저가 명시적인 프록시 서버를 사용하도록 구성될 때 HTTP CONNECT 명령이 발행됨을 보증한다.

== 같이 보기 ==
* [[네트워크 소켓]]

== 각주 ==
; 내용주
<references group="lower-alpha" />
; 참조주
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [https://datatracker.ietf.org/wg/hybi/charter/ IETF Hypertext-Bidirectional (HyBi) working group]

{{웹 인터페이스}}
{{웹 브라우저}}

[[분류:응용 계층 프로토콜]]
[[분류:인터넷 용어]]
[[분류:웹 개발]]
[[분류:HTML5]]
[[분류:2011년 컴퓨팅]]