맨위로가기

웹소켓

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

웹소켓은 HTML5 사양에서 TCP 기반 소켓 API를 대체하기 위해 개발된 프로토콜이다. 2008년 마이클 카터가 주도한 토론을 통해 최초 버전이 탄생했으며, 이안 힉슨에 의해 HTML5 명세에 포함되었다. 웹소켓은 코멧 채널의 복잡성과 비효율성을 해결하며 웹 보안을 유지하는 것을 목표로 한다. 2011년 RFC 6455로 표준화되었으며, JavaScript API를 제공한다. 웹소켓은 개시 핸드셰이크, 데이터 메시지 전송, 종료 핸드셰이크를 통해 연결을 설정하며, 프레임 기반 메시지를 사용해 텍스트 또는 바이너리 데이터를 전송한다. 웹 브라우저의 웹 API를 통해 웹소켓 서버에 연결할 수 있으며, 다양한 프로그래밍 언어와 서버 환경에서 구현된다. 보안을 위해 동일 출처 정책의 제한을 받지 않으므로 Origin 헤더 검증 및 인증 메커니즘을 통해 크로스 사이트 웹소켓 하이재킹 공격을 방지해야 한다.

더 읽어볼만한 페이지

  • 2011년 컴퓨팅 - 3·3 DDoS 공격
    3·3 DDoS 공격은 2011년 3월 4일에 시작되어 3월 7일로 공격 시점을 앞당겨 실행된 분산 서비스 거부 공격으로, 악성 코드는 P2P 파일 공유 사이트를 통해 유포되었으며 공격 명령에는 보호나라 사이트 접속 차단 명령이 추가되었다.
  • HTML5 - 구글 스위피
    구글 스위피는 구글에서 개발한 웹 서비스로, SWF 파일을 JSON으로 직렬화한 후 자바스크립트를 통해 SVG로 변환하여 애니메이션을 구현하는 기술이었으나 2016년 7월 1일 서비스가 종료되었다.
  • HTML5 - 웹 스토리지
    웹 스토리지는 웹 브라우저에서 클라이언트 측에 데이터를 저장하는 API로, 쿠키와 유사하지만 더 큰 저장 용량을 제공하며 로컬 스토리지와 세션 스토리지로 구분된다.
  • 웹 개발 - Ajax
    Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다.
  • 웹 개발 - WebXR
    WebXR은 웹 브라우저에서 가상 현실 및 증강 현실 콘텐츠를 구현하기 위한 API로, 다양한 장치 및 플랫폼에서 몰입형 웹 경험을 제공하며, 구글, 메타, 모질라 등 여러 기업과 단체가 개발에 참여하여 지속적인 업데이트를 통해 기능 향상을 목표로 한다.
웹소켓
일반 정보
이름웹소켓
종류컴퓨터 네트워크 프로토콜
개발IETF
연결TCP
웹소켓 연결 다이어그램
웹소켓을 사용한 연결을 나타낸 그림
상세 정보
관련 문서
RFC 6455

2. 역사

웹소켓은 HTML5의 일부로 제안되었으며, XMLHttpRequest의 단점을 해결하고 기존의 코멧 등을 대체하기 위해 개발되었다.

Ajax 애플리케이션에서는 서버와 클라이언트 간 데이터 교환이 빈번하지만, XMLHttpRequest는 브라우저에서 서버로 요청을 보내는 데 그쳐 서버에서 클라이언트로 데이터를 푸시하는 것이 어려웠다. 코멧은 서버 푸시가 가능했지만, 통신 시마다 TCP 핸드셰이크를 다시 수행하고 HTTP 커넥션을 장시간 점유하는 문제가 있었다.

웹소켓은 서버와 클라이언트가 한 번 연결되면, 그 연결 위에서 전용 프로토콜을 사용하여 통신한다. 새로운 연결을 맺을 필요가 없고, 경량 프로토콜을 사용하므로 통신 손실이 줄어들며, 하나의 연결로 모든 데이터 송수신이 가능하여 다른 애플리케이션에 대한 영향이 적다는 장점이 있다.

2. 1. 주요 연표

웹소켓은 HTML5 사양에서 TCPConnection으로 처음 참조되었다.[96] 2008년 6월, 마이클 카터가 주도한 일련의 논의를 통해 최초 버전의 웹소켓 프로토콜이 탄생했다.[9] "웹소켓"이라는 이름은 이안 힉슨과 마이클 카터가 #whatwg IRC 채팅방에서 협력하여 만들어졌다.[10]

웹소켓 이전에는 코멧 채널을 사용하여 80번 포트의 전이중 통신이 가능했지만, 구현이 복잡하고 비효율적이었다. 웹소켓 프로토콜은 이러한 문제를 해결하고 웹의 보안을 유지하는 것을 목표로 한다.

2009년 12월, 구글 크롬 4가 웹소켓을 기본적으로 활성화하여 이 표준을 완전히 지원하는 최초의 브라우저가 되었다.[11] 웹소켓 프로토콜 개발은 2010년 2월 IETF로 이전되었으며, 이안 힉슨이 두 차례 개정했다.[12] 2011년 12월, 가 이안 페트의 지휘 하에 최종 확정되었다.

2010년 11월, 보안 취약점이 발견되어[88] 2010년 12월에 파이어폭스 4와 Opera 11에서 웹소켓이 일시적으로 비활성화되었다. 이후 2011년 1월, 통신 내용을 XOR로 마스킹하는 방법이 도입된 새 버전이 발표되었다. 2011년 8월, 파이어폭스 6가 웹소켓을 다시 지원했지만, Firefox 10까지는 MozWebSocket이라는 이름으로 사용되었다.[89]

W3C에서 시작된 JavaScript용 API 제정은 HTML5와 함께 WHATWG로 이관되었다. 2021년에는 WebSockets Standard가 별도로 분리되었다.[91]

는 메시지별로 DEFLATE 알고리즘을 사용하여 웹소켓에 압축 확장을 도입했다.

3. 프로토콜

웹소켓 프로토콜은 HTTP와 달리 전이중 통신을 사용하며,[93][94] TCP 위에서 메시지 스트리밍을 가능하게 한다.[94] TCP는 바이트 스트림을 다루지만, 웹소켓은 메시지 개념을 도입하여 더 효율적인 통신을 지원한다. 웹소켓 이전에는 코멧 채널을 사용하여 포트 80에서 전이중 통신을 구현했지만, 코멧은 구현이 복잡하고 작은 메시지에 비효율적이었다. 웹소켓 프로토콜은 웹 보안을 유지하면서 이러한 문제를 해결한다.

웹소켓 프로토콜은 암호화되지 않은 연결을 위한 `ws`와 암호화된 연결을 위한 `wss`라는 두 가지 새로운 통합 자원 식별자(URI) 스킴을 정의한다.[95]

웹소켓은 XMLHttpRequest의 단점을 보완하고 Comet을 대체하기 위해 개발되었다. Ajax 애플리케이션에서 서버와 클라이언트 간 데이터 교환이 빈번하지만, XMLHttpRequest는 브라우저에서 서버로 요청을 보내는 역할만 수행하고 서버에서 클라이언트로 데이터를 푸시하는 것은 어려웠다. Comet은 서버 푸시가 가능하지만, TCP 핸드셰이크를 반복하고 HTTP 연결을 오래 점유하여 다른 애플리케이션에 영향을 줄 수 있었다.

반면 웹소켓은 서버와 클라이언트가 한 번 연결을 맺은 후, 전용 프로토콜을 사용하여 통신한다. 이로 인해 새로운 연결을 맺을 필요가 없고, 경량 프로토콜을 사용하므로 통신 손실이 줄어들며, 하나의 연결로 모든 데이터 송수신이 가능하여 다른 애플리케이션에 대한 영향이 적다.

웹소켓 연결 과정은 다음과 같다.

# '''개시 핸드셰이크''' (HTTP 요청 + HTTP 응답)를 통해 연결을 설정한다.

# '''데이터 메시지'''를 통해 애플리케이션 데이터를 전송한다.

# '''종료 핸드셰이크''' (두 개의 닫기 프레임)를 통해 연결을 종료한다.

WebSocket 프로토콜 사양은 '''ws:''' 와 '''wss:'''라는 두 개의 새로운 URI 스키마를 정의하고 있다.[83]

프로토콜은 2011년 5월 완성을 목표로 진행되었지만, 기한을 넘어서도 사양 개정이 계속되어 2011년 7월 11일에 최종 초안 draft-ietf-hybi-thewebsocketprotocol-10이 권고되었지만, 그 후에도 개정이 계속되어 2011년 9월 30일에 draft-ietf-hybi-thewebsocketprotocol-17이 릴리스되었고, 2011년 12월 11일에 proposed standard(표준화 제창)이 되었다.

2010년 11월 26일, draft-ietf-hybi-thewebsocketprotocol-03이나 그 이전의 WebSocket 프로토콜에 보안 허점이 발견되어[88] 2010년 12월에 일시적으로 Firefox 4와 Opera 11의 WebSocket이 비활성화되었고, Chrome은 프로토콜 개정보다 먼저 공격 코드가 나온 경우에는 비활성화한다고 했다. Opera 11은 설정을 활성화하면 사용할 수 있었다. 2011년 1월 11일에 draft-ietf-hybi-thewebsocketprotocol-04가 발표되었고, 서버에 업로드 통신할 때 프록시를 혼란시키지 않기 위해 통신 내용을 XOR로 마스킹하는 방법이 되었다. 2011년 8월 16일에 다시 WebSocket을 지원하는 Firefox 6가 릴리스되었지만, 사양 개정이 계속된다는 이유로 Firefox 10까지 MozWebSocket으로 머리에 Moz가 붙는 형태가 되었다[89] . Firefox for Mobile은 7부터 지원[90] .

웹 브라우저에서 동작하는 JavaScript용 API 제정은, 당초 W3C에서 행해지고 있었다. 그 후, HTML5와 함께 WHATWG로 옮겨가게 되었다.

WHATWG에서는, 당초 주로 HTML Standard 내에서 WebSocket의 API가 규정하고 있었다. 그 후, 2021년에 별개의 사양으로 분리하는 것이 제기되어[91], WebSockets Standard가 창설되게 되었다.

3. 1. 핸드셰이크

웹소켓 연결을 확립하기 위해 클라이언트는 웹소켓 핸드셰이크 요청을 보내고, 서버는 이에 대한 웹소켓 핸드셰이크 응답을 반환한다.[106]

클라이언트 요청 예시:[38]

```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

```

서버 응답 예시:

```http

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

Sec-WebSocket-Protocol: chat

```

클라이언트는 '''HTTP 요청'''('''메서드''' '''GET''', '''버전 ≥ 1.1''')을 보내고, 서버는 성공적으로 '''상태 코드 101''' (''프로토콜 전환'')을 포함하는 '''HTTP 응답'''을 반환한다. 이는 웹소켓 서버가 HTTP (80) 및 HTTPS (443)와 동일한 포트를 사용할 수 있음을 의미하며, 핸드셰이크가 HTTP와 호환되기 때문이다.[28]

HTTP에서 각 줄은 `\r\n`으로 끝나고 마지막 줄은 비어 있다.

HTTP 헤더
측면헤더필수 여부
Origin[29]
Host
Sec-WebSocket-Version13[30]
Sec-WebSocket-Keybase64-인코딩된 16바이트 임의의 논스[31]
Sec-WebSocket-Acceptbase64-인코딩된 (sha1(Sec-WebSocket-Key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))[32]
ConnectionUpgrade[33][34]
Upgradewebsocket[35][36]
Sec-WebSocket-Protocol요청에는 클라이언트가 사용하려는 쉼표로 구분된 목록 문자열(선호도 순)이 포함될 수 있으며, 이는 응용 계층 프로토콜(웹소켓 데이터 메시지 상위에 구축됨)을 나타낸다.[37] 클라이언트가 이 헤더를 보내면 서버 응답은 목록의 값 중 하나여야 한다.선택 사항
Sec-WebSocket-Extensions
기타 헤더



`Sec-WebSocket-Key` 및 `Sec-WebSocket-Accept`는 캐싱 프록시가 이전 웹소켓 대화를 다시 전송하는 것을 방지하기 위한 것이며, 인증, 개인 정보 보호 또는 무결성을 제공하지 않는다.

```python3

# Sec-WebSocket-Key를 사용하여 Sec-WebSocket-Accept 계산

from base64 import b64encode

from hashlib import sha1

from os import urandom

# key = b64encode(urandom(16)) # 클라이언트가 이 작업을 수행해야 함

key = b"x3JJHMbDL1EzLkh9GBhXDw==" # 위의 예시 요청의 값

magic = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" # 프로토콜 상수

print(b64encode(sha1(key + magic).digest()))

# 출력: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

```

연결이 설정되면 통신은 HTTP 프로토콜을 따르지 않는 이진 프레임 기반 프로토콜로 전환된다.

핸드셰이크는 하이퍼텍스트 전송 프로토콜과 유사하지만, 엄밀히 말하면 다르다. 서버는 처음 HTTP 요청으로 해석한 후, 웹소켓으로 전환한다.

3. 2. 프레임 기반 메시지

웹소켓에서 데이터 전송은 '''데이터 메시지'''와 '''제어 메시지'''를 통해 이루어지며, 이 메시지들은 하나 이상의 프레임으로 구성된다. 효율적인 데이터 전송 및 처리를 위해 '''단편화'''(Fragmentation) 기능이 제공된다.

  • 비단편화 메시지: `FIN = 1` 및 `opcode ≠ 0`인 단일 프레임으로 구성된다.
  • 단편화 메시지: `FIN = 0` 및 `opcode ≠ 0`인 첫 번째 프레임, `FIN = 0` 및 `opcode = 0`인 0개 이상의 중간 프레임, `FIN = 1` 및 `opcode = 0`인 마지막 프레임으로 구성된다.


단편화를 통해 전체 길이를 미리 알 수 없는 메시지를 여러 프레임으로 나누어 전송할 수 있다. 이는 첫 번째 바이트를 전송하기 전에 전체 길이를 알아야 하는 비단편화 메시지와 달리 버퍼링 없이 데이터를 전송할 수 있게 해준다.[40] 또한, 단편화는 여러 스트림을 동시에 멀티플렉싱하여 단일 페이로드가 소켓을 독점하는 것을 방지한다.[41]

프레임 유형Opcode관련 웹 API설명목적분할 가능 여부최대 페이로드 길이
지속0분할된 메시지의 중간 프레임을 식별바이트
데이터 프레임텍스트1send(), onmessageUTF-8로 인코딩된 애플리케이션 텍스트애플리케이션 데이터
바이너리2애플리케이션 바이너리 데이터
colspan="2" |3–7예약됨
제어 프레임닫기8close(), oncloseTCP 닫기 핸드셰이크를 보완하여 데이터 손실을 방지하기 위해 닫기 핸드셰이크시작하기 위해 전송[48]프로토콜 상태아니요125 바이트
9지연 시간 측정, keepalive, 하트비트에 사용
10
colspan="2" |11–15예약됨



제어 프레임 중 닫기(Close) 프레임은 종료 핸드셰이크를 시작하며, 선택적으로 2바이트 사유 코드와 123바이트를 넘지 않는 UTF-8 인코딩 사유 메시지를 포함할 수 있다.[49] 핑(Ping)과 퐁(Pong) 프레임은 지연 시간 측정, keepalive, 하트비트 등에 사용된다.[50][51]

3. 2. 1. 프레임 구조

(비트)필드크기
(비트)설명0FIN[42]11RSV11확장 기능에 의해 정의되지 않는 한 반드시 0.[43]2RSV213RSV314Opcode4아래 opcode 참조.8Masked[44]19Payload length[45]7, 7+16 또는 7+64페이로드(확장 데이터 + 애플리케이션 데이터)의 길이(바이트).가변적Masking key0 또는 32클라이언트는 서버로 전송되는 모든 프레임을 마스킹해야 함. 서버는 클라이언트로 전송되는 프레임을 마스킹하면 안 됨.[46]PayloadExtension data페이로드 길이(바이트)확장 기능에 의해 정의되지 않는 한 비어 있어야 함.Application dataOpcode에 따라 다름


3. 2. 2. 상태 코드

범위[52]종료 프레임에서 허용됨코드[53]설명
0–999아니요 사용되지 않음
1000–2999 (프로토콜)1000정상 종료.
1001종료 중 (예: 브라우저 탭 닫힘).
1002프로토콜 오류.
1003지원되지 않는 데이터 (예: 엔드포인트는 텍스트만 이해하지만 바이너리를 수신함).
아니요1004향후 사용을 위해 예약됨
1005코드를 수신하지 못함.
1006비정상적으로 연결 종료 (종료 핸드셰이크가 발생하지 않음).
1007잘못된 페이로드 데이터 (예: 텍스트 메시지에 UTF-8이 아닌 데이터).
1008정책 위반.
1009메시지가 너무 큼.
1010지원되지 않는 확장. 클라이언트는 서버가 지원할 것으로 예상하는 확장을 페이로드에 작성해야 함.
1011내부 서버 오류.
아니요1015TLS 핸드셰이크 실패.
3000–3999 라이브러리, 프레임워크 및 애플리케이션에서 사용.
4000–4999 개인적인 용도.


4. Web API

웹 API는 웹 애플리케이션(예: 웹 브라우저)이 WebSocket 서버와 상호작용할 수 있도록 하는 인터페이스를 제공한다. 다음은 간단한 사용 예시이다.

```html


4. 1. WebSocket 인터페이스

웹 애플리케이션(예: 웹 브라우저)은 `WebSocket` 인터페이스를 사용하여 WebSocket 서버에 연결할 수 있다.

WebSocket 웹 API 명세
유형이름[13]설명
생성자`ws = new WebSocket(url [, protocols ])`WebSocket 서버와 열기 핸드셰이크시작한다.[14]
메서드`ws.send(data)`데이터 전송. `data`는 `string`, `Blob`, `ArrayBuffer` 또는 `ArrayBufferView`여야 한다. `ws.readyState`가 `WebSocket.CONNECTING`인 경우 `InvalidStateError`를 발생시킨다.
`ws.close([ code ] [, reason ])`종료 핸드셰이크시작한다.[15]
이벤트`ws.onopen = (event) => {}`열기 핸드셰이크 성공. `event` 유형은 `Event`이다.
`ws.onmessage = (event) => {}`데이터 수신. `event` 유형은 `MessageEvent`이다. `event.data`에는 다음과 같은 유형의 수신된 데이터가 포함된다.[16]
`ws.onclose = (event) => {}`기본 TCP 연결 종료. `event` 유형은 다음을 포함하는 `CloseEvent`이다.[17][18][19][20]
`ws.onerror = (event) => {}`오류로 인해 연결이 닫힘. `event` 유형은 `Event`이다.
속성`ws.binaryType`이진 데이터를 수신할 때 `ws.onmessage`에서 `event.data`의 유형을 나타내는 문자열이다. 처음에는 `blob`( `Blob` 객체)으로 설정된다. `"arraybuffer"`( `ArrayBuffer` 객체)로 변경할 수 있다.
읽기 전용 속성`ws.url`WebSocket 생성자에 제공된 URL.
`ws.bufferedAmount`전송을 기다리는 바이트 수.
`ws.protocol`서버에서 허용한 프로토콜 또는 클라이언트가 `WebSocket` 생성자에서 `protocols`를 지정하지 않은 경우 빈 문자열.
`ws.extensions`서버에서 허용한 확장.
`ws.readyState`연결 상태. 아래 상수 중 하나이다.
상수`WebSocket.CONNECTING = 0`열기 핸드셰이크 대기.[21][22]
`WebSocket.OPEN = 1`열기 핸드셰이크 성공. 클라이언트와 서버는 서로 메시지를 보낼 수 있다.[23][24]
`WebSocket.CLOSING = 2`종료 핸드셰이크대기 중이다. `ws.close()`가 호출되었거나 서버에서 종료 프레임을 보냈다.[25][26]
`WebSocket.CLOSED = 3`기본 TCP 연결이 닫혔다.[27][17][18]


5. 브라우저 지원

웹소켓 프로토콜의 보안 버전은 파이어폭스 6,[54] 사파리 6, 구글 크롬 14,[55] 오페라 12.10 및 Internet Explorer 10에서 구현되었다.[56] 해당 브라우저의 특정 프로토콜 측면에 대한 준수 사항은 상세한 프로토콜 테스트 제품군 보고서[57]에 나열되어 있다.

보안이 덜 강화된 이전 버전의 프로토콜은 오페라 11, 사파리 5, 그리고 iOS 4.2의 사파리 모바일 버전에서 구현되었다.[58] OS7의 블랙베리 브라우저는 웹소켓을 구현한다.[59] 파이어폭스 4와 5,[60] 그리고 오페라 11에서는 취약점 때문에 비활성화되었다.[61]

브라우저 개발자 도구를 사용하면 개발자가 웹소켓 핸드셰이크와 웹소켓 프레임을 검사할 수 있다.[62]

구현 상황
프로토콜Internet ExplorerMozilla FirefoxGoogle ChromeSafariOperaAndroid
draft-hixie-thewebsocketprotocol-7545.0.0
draft-hixie-thewebsocketprotocol-76
draft-ietf-hybi-thewebsocketprotocol-00
4 (비활성화)65.0.111.00 (설정 필요)
Opera Mobile도 설정 필요
draft-ietf-hybi-thewebsocketprotocol-076
draft-ietf-hybi-thewebsocketprotocol-10714
RFC 6455101116612.104.4



클라이언트 측에서는 Internet Explorer 10(모바일 포함), Mozilla Firefox 6 (Firefox for Mobile 7), Google Chrome 4 (모바일 포함), Safari 5 (iOS 4.2 이후 포함), Opera 12.10 (모바일 포함), Android 4.4, BlackBerry 7 (설정 필요)에서 구현되어 있다.

6. 서버 구현

웹소켓 서버 구현과 관련된 내용은 다음과 같다.



다양한 프로그래밍 언어 및 프레임워크에서도 웹소켓 서버 구현을 지원한다.

7. 프록시 경유

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

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

암호화되지 않은 웹소켓 트래픽이 웹소켓을 지원하지 않는 명시적이거나 투명한 프록시 서버를 통해 경유하는 경우 연결이 실패할 가능성이 높다.[107]

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

WebSocket 프로토콜 클라이언트 구현은 대상 호스트 및 포트에 연결할 때 사용자 에이전트가 프록시를 사용하도록 구성되었는지 감지하려고 시도하고, 구성된 경우 HTTP CONNECT 방식을 사용하여 영구 터널을 설정한다.

암호화되지 않은 WebSocket 트래픽이 WebSocket을 지원하지 않는 명시적 또는 투명 프록시 서버를 통과하는 경우 연결이 실패할 가능성이 높다.[79]

암호화된 WebSocket 연결이 사용되는 경우, 전송 계층 보안(TLS)을 WebSocket Secure 연결에 사용하면 브라우저가 명시적 프록시 서버를 사용하도록 구성되었을 때 `HTTP CONNECT` 명령이 실행된다. 이렇게 하면 HTTP 프록시를 통해 WebSocket Secure 클라이언트와 WebSocket 서버 간에 저수준 엔드 투 엔드 TCP 통신을 제공하는 터널이 설정된다. 투명 프록시 서버의 경우 브라우저는 프록시 서버를 인식하지 못하므로 `HTTP CONNECT`가 전송되지 않는다. 그러나 와이어 트래픽이 암호화되므로 중간 투명 프록시 서버가 암호화된 트래픽을 단순히 통과시킬 수 있으므로, WebSocket Secure를 사용하는 경우 WebSocket 연결이 성공할 가능성이 훨씬 더 높다. 암호화를 사용하면 리소스 비용이 발생하지만 안전한 터널을 통과하므로 종종 가장 높은 성공률을 제공한다.

8. 보안 고려 사항

웹소켓 요청은 동일 출처 정책의 제한을 받지 않는다. 따라서 웹소켓 서버는 연결 설정 시 예상되는 출처에 대해 "Origin" 헤더를 검증해야 한다. 이를 통해 HTTP 쿠키 또는 HTTP 인증을 통해 연결이 인증될 때 발생할 수 있는 크로스 사이트 웹소켓 하이재킹 공격(크로스 사이트 요청 위조와 유사)을 방지해야 한다. 웹소켓을 통해 민감한(개인적인) 데이터를 전송하는 경우에는 토큰 또는 이와 유사한 보호 메커니즘을 사용하여 웹소켓 연결을 인증하는 것이 좋다.[78] 2020년에 Cable Haunt 형태로 취약성의 실제 사례가 발견되었다.

참조

[1] 웹사이트 WebSockets Standard https://websockets.s[...] 2022-05-16
[2] 웹사이트 The WebSocket API https://www.w3.org/T[...] 2022-05-16
[3] 간행물 RFC 6455 The WebSocket Protocol Internet Engineering Task Force 2011-12
[4] 웹사이트 Adobe Flash Platform – Sockets https://help.adobe.c[...] 2021-07-28
[5] 웹사이트 The WebSocket API (WebSockets) https://developer.mo[...] Mozilla Developer Network 2021-07-26
[6] 웹사이트 IANA Uniform Resource Identifier (URI) Schemes https://www.iana.org[...] Internet Assigned Numbers Authority 2011-11-14
[7] 간행물 RFC 6455 The WebSocket Protocol Internet Engineering Task Force 2011-12
[8] 웹사이트 HTML 5 https://www.w3.org/T[...] 2016-04-17
[9] 웹사이트 '[whatwg] TCPConnection feedback from Michael Carter on 2008-06-18 (whatwg.org from June 2008)' https://lists.w3.org[...] 2016-04-17
[10] 웹사이트 IRC logs: freenode / #whatwg / 20080618 http://krijnhoetmer.[...] 2016-04-18
[11] 웹사이트 Web Sockets Now Available In Google Chrome https://blog.chromiu[...] 2016-04-17
[12] 학술지 The WebSocket protocol https://tools.ietf.o[...] 2010-05-06
[13] 웹사이트 Interface definition https://websockets.s[...] 2024-04-10
[14] 웹사이트 new WebSocket(url, protocols) https://websockets.s[...] 2024-04-30
[15] 웹사이트 close(code, reason) https://websockets.s[...] 2024-04-10
[16] 웹사이트 When a WebSocket message has been received https://websockets.s[...] 2024-04-13
[17] 웹사이트 When the WebSocket connection is closed; substep 3. https://websockets.s[...] 2024-04-13
[18] 간행물 The WebSocket Connection is Closed
[19] 간행물 The WebSocket Connection Close Code
[20] 간행물 The WebSocket Connection Close Reason
[21] 웹사이트 CONNECTING https://websockets.s[...] 2024-04-13
[22] 간행물 Client Requirements
[23] 웹사이트 OPEN https://websockets.s[...] 2024-04-10
[24] 간행물 _The WebSocket Connection is Established_
[25] 웹사이트 CLOSING https://websockets.s[...] 2024-04-10
[26] 간행물 The WebSocket Closing Handshake is Started
[27] 웹사이트 CLOSED https://websockets.s[...] 2024-04-10
[28] 간행물 Opening Handshake
[29] 간행물 Client requirement 8..
[30] 간행물 Client requirement 9..
[31] 간행물 Client requirement 7..
[32] 간행물 Server step 5.4..
[33] 간행물 Client requirement 6..
[34] 간행물 Server step 5.3.
[35] 간행물 Client requirement 5..
[36] 간행물 Server step 5.2.
[37] 간행물 Client requirement 10.
[38] 간행물 Protocol Overview
[39] 웹사이트 Main Goal of WebSocket protocol https://trac.tools.i[...] IETF 2015-07-25
[40] 간행물 Fragmentation
[41] 간행물 A Multiplexing Extension for WebSockets IETF
[42] 간행물 FIN
[43] 간행물 RSV1, RSV2, RSV3
[44] 간행물 Mask
[45] 간행물 Payload length
[46] 간행물 Overview
[47] 간행물 Client-to-Server Masking
[48] 간행물 Closing Handshake
[49] 간행물 Close
[50] 간행물 Ping
[51] 간행물 Pong
[52] 간행물 Reserved Status Code Ranges
[53] 간행물 Defined Status Codes
[54] 웹사이트 WebSocket enabled in Firefox 6 https://developer.mo[...] 2011-05-27
[55] 웹사이트 Chromium Web Platform Status https://www.chromium[...] 2011-08-03
[56] 웹사이트 WebSockets (Windows) https://msdn.microso[...] Microsoft 2012-09-28
[57] 웹사이트 WebSockets Protocol Test Report http://autobahn.ws/t[...] Tavendo.de 2011-10-27
[58] 웹사이트 Apple adds accelerometer, WebSockets support to Safari in iOS 4.2 https://www.appleins[...] 2010-11-23
[59] 웹사이트 Web Sockets API http://docs.blackber[...] BlackBerry Limited 2011-07-08
[60] 웹사이트 WebSocket disabled in Firefox 4 https://hacks.mozill[...] 2010-12-08
[61] 웹사이트 Regarding WebSocket http://my.opera.com/[...] 2010-12-10
[62] 서적 The Definitive Guide to HTML5 WebSocket Apress 2013-04-07
[63] 웹사이트 WebSockets (support in Firefox) https://developer.mo[...] Mozilla Foundation 2011-09-30
[64] 웹사이트 Bug 640003 - WebSockets - upgrade to ietf-06 https://bugzilla.moz[...] Mozilla Foundation 2011-03-08
[65] 웹사이트 WebSockets - MDN https://developer.mo[...] Mozilla Foundation 2011-09-30
[66] 웹사이트 Bug 640003 - WebSockets - upgrade to ietf-07(comment 91) https://bugzilla.moz[...] Mozilla Foundation 2011-07-28
[67] 웹사이트 Chromium bug 64470 https://code.google.[...] 2010-11-25
[68] 웹사이트 WebSockets in Windows Consumer Preview https://blogs.msdn.c[...] Microsoft 2012-07-23
[69] 웹사이트 WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17 https://trac.webkit.[...] 2011-12-10
[70] 웹사이트 A hot Opera 12.50 summer-time snapshot http://my.opera.com/[...] Opera Developer News 2012-08-03
[71] 웹사이트 Welcome to nginx! https://archive.toda[...] 2022-02-03
[72] 웹사이트 Using NGINX as a WebSocket Proxy https://www.nginx.co[...] 2014-05-17
[73] 웹사이트 Overview of new features in Apache HTTP Server 2.4 http://httpd.apache.[...] 2021-01-26
[74] 웹사이트 Changelog Apache 2.4 https://www.apachelo[...] 2021-01-26
[75] 웹사이트 IIS 8.0 WebSocket Protocol Support https://docs.microso[...] 2012-11-28
[76] 웹사이트 Release-1 4 46 - Lighttpd - lighty labs https://redmine.ligh[...] 2020-12-29
[77] 웹사이트 Release-1 4 65 - Lighttpd - lighty labs https://redmine.ligh[...] 2024-05-03
[78] 웹사이트 Cross-Site WebSocket Hijacking (CSWSH) https://www.christia[...] 2013-08-31
[79] 웹사이트 How HTML5 Web Sockets Interact With Proxy Servers http://www.infoq.com[...] C4Media Inc. 2010-03-16
[80] email WebSocket -76 is incompatible with HTTP reverse proxies https://www.ietf.org[...] Internet Engineering Task Force 2010-07-06
[81] IETF The WebSocket protocol, draft hybi-09 https://tools.ietf.o[...] 2011-06-13
[82] 문서 Jettyで始めるWebSocket超入門 第1回 WebSocket登場までの歴史 https://gihyo.jp/dev[...] gihyo.jp 2010-07-16
[83] 문서 IANA Uniform Resource Identifer (URI) Schemes https://www.iana.org[...]
[84] 문서 WebSockets, WCF, and Silverlight 5 - CodeProject https://www.codeproj[...]
[85] 문서 ASP.NET Core での Websocket のサポート | Microsoft Learn https://learn.micros[...]
[86] 문서 BiDirectional or Server-Initiated HTTP (hybi) - Charter https://datatracker.[...]
[87] 문서 hybi Last Call: (The WebSocket protocol) to Proposed Standard https://www.ietf.org[...]
[88] 문서 hybi Experiment comparing Upgrade and CONNECT handshakes https://www.ietf.org[...]
[89] 문서 Bug 659324 – prefix the JS API for WebSockets https://bugzilla.moz[...]
[90] 문서 Firefox 7 の主な新機能を紹介します « Mozilla Developer Street (modest) https://dev.mozilla.[...]
[91] 웹사이트 WebSocket standard creation proposal · Issue #202 · whatwg/meta https://github.com/w[...] 2021-02-04
[92] IETF RFC 6455 The WebSocket Protocol 국제 인터넷 표준화 기구 2011-12
[93] 웹인용 Glossary:WebSockets https://developer.mo[...] Mozilla Developer Network 2015
[94] 웹인용 HTML5 WebSocket: A Quantum Leap in Scalability for the Web https://web.archive.[...] 2019-11-21
[95] 웹인용 IANA Uniform Resource Identifer (URI) Schemes https://www.iana.org[...] Internet Assigned Numbers Authority 2011-11-14
[96] 웹인용 HTML 5 https://www.w3.org/T[...] 2016-04-17
[97] 웹인용 '[whatwg] TCPConnection feedback from Michael Carter on 2008-06-18 (whatwg.org from June 2008)' https://lists.w3.org[...] 2016-04-17
[98] 웹인용 WebSockets (support in Firefox) https://developer.mo[...] Mozilla Foundation 2011-09-30
[99] 웹인용 Bug 640003 - WebSockets - upgrade to ietf-06 https://bugzilla.moz[...] Mozilla Foundation 2011-03-08
[100] 웹인용 WebSockets - MDN https://developer.mo[...] Mozilla Foundation 2011-09-30
[101] 웹인용 Bug 640003 - WebSockets - upgrade to ietf-07(comment 91) https://bugzilla.moz[...] Mozilla Foundation 2011-07-22
[102] 웹인용 Chromium bug 64470 https://code.google.[...] Google 2010-11-25
[103] 웹인용 WebSockets in Windows Consumer Preview https://blogs.msdn.c[...] Microsoft 2012-03-19
[104] 웹인용 WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17 https://trac.webkit.[...] null
[105] 웹인용 A hot Opera 12.50 summer-time snapshot http://my.opera.com/[...] Opera Developer News 2012-08-03
[106] 간행물 RFC 6455 The WebSocket Protocol IETF 2011-12-01
[107] 웹인용 How Web Sockets Interact With Proxy Servers http://www.infoq.com[...] C4Media Inc. 2010-03-16



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com