Web Socket 이란
웹 소켓(Web Socket)은 서버와 클라이언트 간의 실시간 전이중 통신(full-duplex communication)을 가능하게 하는 프로토콜이다. 웹 소켓은 2011년 HTML5 표준의 일부로 포함되며 본격적으로 사용되기 시작했다.
이러한 웹 소켓은 웹 소켓을 지원하는 브라우저에서 사용 가능하다. 하지만 이를 지원하지 않는 구형 브라우저에서는 사용할 수 없다. (ex. Internet Explorer 9이하)
Web Socket의 특징
1. 양방향 통신 (Full-Duplex)
- 데이터 송수신을 동시에 처리할 수 있는 통신 방법
- 클라이언트와 서버가 서로에게 원할 때 데이터를 주고받을 수 있다.
(통상적인 Http 통신은 Client가 요청을 보내는 경우에만 Server가 응답을 하는 단방향 통신)
2. 실시간 네트워킹 (Real Time-Networking)
- 웹 환경에서 연속된 데이터를 빠르게 노출하는 것이 가능
3. 상태 유지 (Stateful)
- 웹 소켓은 HTTP와 달리 연결을 계속 유지한다. 이로써 데이터를 전송하거나 수신하기 위해 매번 새로운 연결을 설정할 필요가 없다.
4. 효율성
- 웹 소켓은 초기 연결 후, 지속적인 연결을 유지하면서 추가적인 헤더 정보 없이 데이터를 전송할 수 있다.
Web Socket 이전에 쓰이던 기술
1. Polling
- 클라이언트가 일정한 시간 간격으로 서버에 HTTP 요청을 보내서 데이터를 요청하는 방법
- 단순한 구현이 가능하지만 많은 트래픽을 유발할 수 있다.
- 실시간성이 낮다(데이터 갱신 간격에 따라 실시간성이 떨어질 수 있음)
2. Long Polling
- 클라이언트가 서버에 HTTP 요청을 보내고, 서버가 새로운 데이터가 있을 때까지 응답을 지연시키는 방법
- 작동 과정은 다음과 같음
1) 클라이언트에서 요청을 보냄
2) 서버는 새로운 데이터가 있을 때까지 응답을 지연
3) 새로운 데이터가 발생하면 클라이언트로 응답 전송
4) 클라이언트는 응답을 받은 후 기존 연결을 끊음
5) 클라이언트는 즉시 새로운 요청을 보냄
6) 반복 - 결국 이러한 방식은 많은 양의 메시지가 쏟아질 경우 polling과 같아진다는 단점이 있다.
3. HTTP Streaming
- 클라이언트가 서버에 HTTP 요청을 보내고, 연결이 끊기지 않은 상태에서 서버로부터 데이터를 끊임없이 수신 받는 방법
- stateless인 HTTP 프로토콜을 사용하지만 연결을 유지함으로써 실시간 데이터 송신을 구현함
- 하지만 클라이언트 측에서 서버로 데이터 전송이 어려움
- 대부분의 경우 서버 -> 클라이언트 방향의 단방향 통신이 이루어짐
결과적으로 이 모든 방법이 HTTP 프로토콜을 사용하기 때문에 Request와 Response 모두 Header가 불필요하게 큼
Web Socket 동작 방법
1. HTTP 핸드셰이크
- 연결을 수립할 때만 HTTP 프로토콜 사용
- 반드시 GET 메소드 사용
2. 서버 응답
- 서버는 클라이언트의 요청을 받아들여 웹 소켓 프로토콜로 전환을 승인
3. 프로토콜 전환
- HTTP 핸드셰이크가 완료되면 클라이언트와 서버 간의 연결은 http에서 ws 프로토콜로 전환
- 이때부터 클라이언트와 서버는 HTTP 헤더 없이 WebSocket 프레임을 통해 데이터를 주고받음
- SSL 인증서가 적용되었다면 https 처럼 wss 프로토콜로 전환됨
- 참고로 ws을 위한 별도의 port 번호는 없음(기존의 http-80 / https-443 을 사용)
4. 데이터 프레임 전송
- 웹 소켓 연결이 설정되면 클라이언트와 서버는 데이터를 프레임 단위로 주고받음
- 교환할 수 있는 데이터는 오직 text와 binary만 가능함
5. 연결 종료
- 클라이언트나 서버 중 어느 한쪽이 연결을 종료할 수 있다.
- 연결을 종료하기 위해 종료 프레임(close frame)을 전송
- 종료 프레임을 수신한 쪽은 응답으로 종료 프레임을 보내고 연결이 종료됨
Web Socket의 한계
1. Web Socket은 HTML5 이후에 등장한 기술이다.
- 웹 소켓은 HTML5 이후에 나온 기술로, HTML5 이전의 기술로 구현된 서비스에서는 웹 소켓을 사용할 수 없다.
- 따라서 HTML5 이전의 기술로 구현된 서비스에서 웹 소켓처럼 실시간 통신을 구현하기 위해 Socket.io와 SockJS 같은 라이브러리를 사용해야 한다.
- 이런 라이브러리를 사용하면 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 해당 기술로 추상화 한다. (ex. 웹 소켓을 Long Polling으로 변경)
2. 웹 소켓의 데이터 처리 한계
- 웹 소켓은 문자열과 이진 데이터를 주고받을 수 있게 해줄 뿐 그 이상의 일을 하지 않는다.
- 주고받은 문자열의 해독은 온전히 어플리케이션에 맡김
- HTTP는 형식을 정해두어 모두가 약속을 따르기만 하면 해석할 수 있지만, 웹 소켓은 형식이 정해져 있지 않아 애플리케이션에서 쉽게 해석하기 어렵다.
- 따라서 STOMP (Simple Text Oriented Messaging Protocol) 와 같은 서브 프로토콜을 사용하여 주고받는 메시지의 형태를 약속해야 하는 경우가 많다.
'Programming' 카테고리의 다른 글
메시지 지향 미들웨어, 메시지 브로커, 메시지 큐 (0) | 2024.08.26 |
---|---|
WS(Web Server)와 WAS(Web Application Server) (0) | 2024.07.13 |
Forward Proxy, Reverse Proxy (0) | 2024.07.12 |
CSRF(Cross-Site Request Forgery) (0) | 2024.07.11 |
XSS(Cross-Site Scripting) (0) | 2024.07.11 |