-
웹 소켓(WebSocket)이란 무엇인가요?개발 공부/Network 2021. 7. 20. 09:27
이 게시물은 우아한 테크코스 10분 테코톡 "코일의 WebSocket"을 보고 정리한 내용입니다.
저작권 관련해서 문제가 되면 댓글로 남겨주세요. 바로 삭제하겠습니다.
영상 링크 : https://www.youtube.com/watch?v=MPQHvwPxDUw1) 웹 소켓이란?
- 두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중 하나이다.
- W3C와 IETF에 의해 자리잡은 표준 프로토콜 중 하나이다.
- 현재 HTML5 환경에서 많이 사용된다.
2) 웹 소켓의 특징
양방향 통신(Full-Duplex)
- 데이터 송수신을 동시에 처리할 수 있는 통신 방법
- 클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받는다.
- 통상적인 HTTP 통신은 클라이언트가 요청을 보내는 경우에만 서버가 응답하는 단방향 통신
실시간 네트워킹(Real Time-Networking)
- 웹 환경에서 연속된 데이터를 빠르게 노출한다.
- 여러 단말기에 데이터를 빠르게 교환한다.
- ex) 채팅, 주식, 비디오 데이터
웹 소켓 이전의 비슷한 기술
- Polling : 일정 주기로 요청을 송신하는 것.
- 실시간 네트워킹에서는 언제 통신이 발생할지 예측이 불가능하므로 불필요한 요청과 연결을 생성한다.
- 즉 바뀐게 없는데도 요청을 계속하고 응답도 계속 한다.
- Long Polling
- Polling의 단점을 해소하기 위해서 서버에서 조금 더 대기를 하면서, 이벤트가 발생할 때 응답을 하는 방식
- 응답을 받으면 끊고 다시 재요청한다.
- 결국 많은 양의 메시지가 쏟아지면 Polling과 동일해진다.
- Streaming
- 서버에 요청 보내고 끊기지 않은 연결상태에서 끊임없이 데이터를 수신한다.
- 클라이언트에서 서버로의 데이터 송신이 어렵다.
- 세 개의 방식 모두 HTTP를 통해 통신하기 때문에 요청/응답 모두 헤더가 불필요하게 크다는 단점이 있다.💥
- Polling : 일정 주기로 요청을 송신하는 것.
3) 웹 소켓의 동작 방법 1 - Hand Shaking
요청(Request) - http(80) or https(443)
// 웹 소켓 요청 HTTP 헤더의 예시 (클라이언트 -> 서버) GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
GET /chat HTTP/1.1
: 반드시 GET 방식으로만 요청해야한다. HTTP는 1.1 이상이어야한다.Host: example.com:8000
: 웹 소켓 서버의 주소Upgrade: websocket
: 현재 클라이언트, 서버, 전송 프로토콜 연결에서 다른 프로토콜로 업그레이드 또는 변경하기 위한 규칙Connection: Upgrade
: 송신자는 반드시 Upgrade 옵션을 지정한 Connection 헤더 필드가 필요하다.Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
: 클라이언트와 서버 간 서로의 신원을 인증한다.Origin: http://example.com
: 클라이언트의 주소Sec-WebSocket-Protocol: chat, superchat
: 여러 서브 프로토콜을 의미한다. 이 중에서 서버가 지원하는 프로토콜을 다시 반환한다.
응답(Response) - http(80) or https(443)
// 웹 소켓 응답 HTTP 헤더의 예시 (서버 -> 클라이언트) HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
101 Switching Protocols
: 101 Switching Protocols가 응답으로 오면 웹 소켓이 연결되었다는 의미이다.Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- 클라이언트로 부터 받은 Sec-WebSocket-Key를 사용하여 계산된 값으로 서로의 신원을 인증하는 과정에 필요한 헤더
- 클라이언트에서 계산한 값과 일치하지 않으면 연결하지 않는다.
4) 웹 소켓의 동작 방법 2 - 데이터 전송
HTTP를 이용해 Hand Shaking이 완료되었으므로, 이제 프로토콜이 WS로 변경된다.
지금부터는 HTTP 라고 하지 않는다. 그리고 이 순간부터 양방향 통신이 가능해진다.ws(80) or wss(443)
으로 통신한다.wss
란 https 처럼 ws 프로토콜에 데이터 보안을 위해 SSL을 적용한 프로토콜이다.Message
: 여러 Frame이모여서 구성하는 하나의 논리적 메시지 단위. ws 프로토콜을 통해 주고 받는 단위라고 보면된다.Frame
: Communication에서 가장 작은 단위의 데이터 (작은 헤더 + Payload
로 구성) -> 기존 무거운 헤더의 단점을 보완- 웹 소켓 통신에 사용되는 데이터는 UTF-8 인코딩을 통해서만 지원된다.
0x00{보내고 싶은 데이터}0xff
와 같은 형태로 데이터를 주고 받는다.
5) 웹 소켓의 동작 방법 3 - 프레임
프레임의 헤더구조
FIN (END)
: 이 프레임이 전체 메시지의 끝인지 나타내는 플래그OPCODE
- Continue (0x0) : 전체 메시지의 일부임을 의미
- Text (0x1) : 포함된 데이터가 UTF-8 텍스트라는 의미
- Binary (0x2) : 포함된 데이터가 이진 데이터라는 의미
- close (0x8) : Close 핸드쉐이크를 시작한다는 의미
Length
: 이 프레임에 포함된 데이터의 총 길이를 나타내는 단위RSV 1~3
: 프로토콜 별로 사용할 수도 있고 사용할 수도 있지 않은 것들이다.
핸드 쉐이크도 완료되었고, 이로인한 데이터 양방향 전송도 모두 완료 되었다면 이제는 연결 종료해야 한다.
연결 종료 할 때는 Close Frame을 주고 받으며 종료한다.
6) 웹 소켓의 동작 과정 정리
- HTTP를 이용해 클라이언트와 서버가 핸드 쉐이킹을 한다. (WebSocket 사용 가능 해? -> 응. 사용 가능해~)
- UTF8로 인코딩된 페이로드를 0x00과 0xff 사이에 넣고 데이터를 주고 받는다. (WS 프로토콜로 양방향 데이터 전송)
- Close Frame을 이용해 연결을 종료한다.
7) 웹 소켓 프로토콜의 특징
- 최초 접속에서만 HTTP 위에서 Hand Shaking을 하기 때문에 HTTP 헤더를 사용한다.
- 웹 소켓을 위한 별도의 포트는 없으며, 기존 포트 (http-80, https-443)을 사용한다.
- 프레임으로 구성된 메시지라는 논리적 단위로 송수신한다.
- 메시지에 포함될 수 있는 교환 가능한 메시지는
텍스트와 바이너리
이다.
8) 웹 소켓의 한계 1 - Socket.io, SockJS
웹 소켓은 HTML5 이후에 나왔기 때문에, HTML5 이전의 기술에는 적용이 어렵다.
- 이때는
Socket.io와 SockJS
라는 것을 이용해서 HTML5 이전 기술로 구현된 서비스에서도 웹 소켓처럼 사용할 수 있다. - Javascript를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현한다.
- 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용하는 방식이다.
9) 웹 소켓의 한계 2 - STOMP
웹 소켓은 문자열들을 주고 받을 수 있게 해줄 뿐 그 이상의 일은 하지 않는다.
- 즉 주고 받은 문자열의 해독은 온전히 애플리케이션에만 맡긴다.
- HTTP는 형식이 있으므로 애플리케이션에서 해석이 쉽지만, WS는 형식이 정해져 있지 않아서 해석하기 어렵다.
- 따라서 WS 방식은 Sub Protocol을 사용해서 주고 받는 메시지의 형태를 약속하는 경우가 많다.
- 이러한 Sub Protocol 중 하나가
STOMP(Simple Text Oriented Message Protocol)
이다.
STOMP(Simple Text Oriented Message Protocol)
- 채팅 통신을 하기 위한 형식을 정의한다.
- HTTP와 유사하게 간단히 정의되어 해석하기 편한 프로토콜이다.
- 일반적으로 웹 소켓 위에서 사용된다.
- 프레임 구조
-
COMMAND header1:value1 header2:value2 BodyBodyBodyBody^@
- 프레임 기반의 프로토콜이다. 프레임은
명령, 헤더, 바디
로 구성된다. - 자주 사용되는 명령은
CONNECT, SEND,SUBSCRIBE, DISCONNECT 등
이 있다. - 헤더와 바디는 빈 라인으로 구분하며, 바디의 끝은 NULL 문자로 설정한다.
-
// 실제 STOMP 구조 예시 >>> CONNECT notice:1 accept-version:1.2 heart-beat:10000.10000 >>> SUBSCRIBE id:sub-1600335610276_227 destination:/channel/1 <<< MESSAGE destination:/channel/1 content-type:application/json subscription:sub_1600335610276-227 message-id:zowit0sl-2 content-length:103
-
'개발 공부 > Network' 카테고리의 다른 글
7. HTTP 헤더 2 - 캐시와 조건부 요청 (0) 2021.06.11 6. HTTP 헤더 1 - 일반헤더 (0) 2021.06.01 5. HTTP 상태코드(2xx, 3xx, 4xx, 5xx) (0) 2021.05.17 4. HTTP 메서드의 활용, HTTP API 설계 예시 (0) 2021.05.09 3. HTTP 메서드(GET, POST, PUT, PATCH, DELETE) (0) 2021.05.02