[개념정리] 웹소켓이란?

2024. 9. 27. 20:52[Node.js_6기 본캠프 TIL]

웹소켓(WebSocket) 프로토콜이란?

웹소켓(WebSocket)은 클라이언트(브라우저)와 서버를 연결하고 실시간으로 통신이 가능하도록 하는 첨단 통신 프로토콜이다. 웹소켓은 하나의 TCP 접속에 전이중(duplex) 통신 채널을 제공한다.

 

쉽게 말해, 웹소켓은 Socket Connection을 유지한 채로 실시간으로 양방향 통신 혹은 데이터 전송이 가능한 프로토콜이다. 채팅 어플리케이션과 같이 실시간 통신이 필요한 경우 주로 사용된다.

 

▶ 웹소켓의 주요 특징

  1. 실시간 통신
    • 웹소켓은 연결이 활성화된 상태에서 빠르고 지속적인 메시지 교환을 허용한다. 이로 인해 애플리케이션은 사용자에게 지연 없는 인터랙션을 제공할 수 있다.
  2. 양방향 통신 (Full-Duplex)
    • 클라이언트와 서버가 동시에 서로에게 메시지를 보낼 수 있다. 이는 한 쪽이 다른 쪽의 메시지를 기다리지 않고도 독립적으로 메시지를 송수신할 수 있음을 의미한다.
  3. 지속적 연결
    • 일단 웹소켓 연결이 수립되면, 그 연결은 클라이언트나 서버가 명시적으로 종료할 때까지 유지된다. 이는 오버헤드를 줄이고 빠른 데이터 전송을 가능하게 한다.
  4. 낮은 오버헤드
    • 웹소켓은 데이터 패킷의 헤더가 매우 작기 때문에 오버헤드가 낮다. 이는 효율적인 네트워크 자원 사용을 가능하게 한다.
  5. HTTP와의 호환성
    • 웹소켓은 HTTP 포트(80과 443)를 통해 작동하기 때문에 기존 웹 인프라와 잘 통합된다. 웹소켓 연결은 HTTP 연결을 통해 초기화되며, 이후 전이중 통신 채널로 전환된다.

 

▶ HTTP와 어떻게 다른가?

기존의 HTTP는 단방향 통신이었다. 클라이언트가 request를 보내야 서버에서 response를 보내주는 방식으로 동작했다. 버전이 업그레이드 됨에 따라 그 특징이 달라지고 있지만, 기본적으로 무상태(Stateless)이므로 상태를 저장하지 않는다는 특징이 있다. 한번 통신을 주고 받으면 끝인 것이다. (물론 세션이나 쿠키 등으로 정보를 임의로 저장하여 처리하기도 한다.) 연결을 유지 하지 않기 때문에 리소스를 줄여 많은 트래픽을 빠르게 처리할 수 있다.

 

이에 반해 웹소켓은 양방향 통신이다. 클라이언트가 request를 보내지 않아도, 데이터를 수신할 수 있다. 예를 들어 구글 Docs로 팀원들과 PPT를 같이 만들다보면, 새로고침을 하지 않아도 서로 편집한 내용이 실시간으로 보인다. 웹소켓 기술이 적용되어 있기 때문이다. 

 

웹소켓은 상태(Stateful) 프로토콜로, 클라이언트와 서버가 한번 연결되면 같은 연결을 이용하여 통신하는 과정에 TCP 커넥션 비용을 아낄 수 있다.

 

완전히 별개의 개념처럼 보이지만, 웹소켓을 다룸에 있어 HTTP를 빼놓을 수는 없다. 웹소켓 프로토콜을 사용하기 위해서는 HTTP 프로토콜이 선행되어야 하기 때문이다.

 

이미지 출처: https://code-lab1.tistory.com/300

 

웹소켓은 HTTP 포트 80, HTTPS 포트 443 위에서 동작한다. 

 

웹소켓은 TCP연결 처럼 핸드셰이크를 이용해 연결을 맺는다. 이때 HTTP 업그레이드 헤더를 사용하여 HTTP 프로토콜에서 웹소켓 프로토콜로 변경한다. 즉, 최초 접속시에는 HTTP 프로토콜을 이용해 핸드셰이킹을 한다. 

 

이후 연결이 맺어지면 어느 한쪽이 연결을 끊지 않는 이상 영구적인(persistent) 동일한 채널이 맺어지고, HTTP 프로토콜이 웹소켓 프로토콜로 변경된다. 이때 데이터를 암호화하기 위해 WSS 프로토콜 등을 이용할 수도 있다. 

 

 

 

 

참고자료:

https://code-lab1.tistory.com/300 [코드 연구소:티스토리]