웹소켓

HEUKWU·2023년 5월 16일
0

웹소켓(WebSocket)은 실시간 양방향 통신을 위한 프로토콜이다. 웹소켓은 클라이언트와 서버 간에 지속적인 연결을 유지하고 양방향으로 데이터를 주고받을 수 있도록 한다.

웹소켓 이전에는 HTTP 프로토콜을 통해 클라이언트와 서버 간의 통신이 요청-응답 방식으로 이루어졌다. 이러한 특성으로 인해 실시간으로 데이터를 전송하거나 서버로부터 실시간 업데이트를 받는 것에 어려움이 있었다. 이에 대한 해결책으로 웹소켓이 탄생했다.

웹소켓을 알아보기 전에 HTTP를 사용한 실시간 통신을 구현하는 주요 기술을 몇가지 알아보자.

Long Polling

  • 클라이언트가 서버에 요청을 보내고, 서버는 새로운 데이터가 준비될 때까지 연결을 유지한다.

  • 클라이언트는 일정 시간 동안 응답을 기다리며, 서버에서 새로운 데이터가 준비되면 응답을 보내고 연결을 종료한다.

  • 클라이언트는 응답을 받은 후 즉시 새로운 요청을 보내어 지속적으로 데이터를 갱신한다.

  • 이 과정을 반복하여 실시간으로 데이터를 수신하는 것처럼 보이게 된다.

출처 - https://ably.com/blog/websockets-vs-long-polling

Streaming

  • 클라이언트가 서버에 요청을 보내고, 서버는 연결을 유지한 채로 데이터를 주기적으로 전송한다.

  • 서버는 데이터를 작은 청크(chunk)로 나누어 클라이언트에게 전송하며, 클라이언트는 청크를 수신할 때마다 데이터를 처리한다.

  • 연결은 유지되어 있으며, 서버는 계속해서 새로운 데이터를 전송할 수 있다.

  • 클라이언트에서는 수신한 데이터를 실시간으로 처리하거나 표시하는 등의 작업을 수행할 수 있다.

출처 - https://tech.makemytrip.com/polling-and-streaming-9eb8301d6c58

이렇게 Long Polling과 Streaming 방법을 사용하여 실시간 통신을 구현할 수 있지만, HTTP는 무상태 프로토콜로서 연결을 유지하는 데 불필요한 리소스와 대역폭을 필요로 하며, 확장성 문제와 지연 시간을 야기하는 등의 단점이 있다.

이러한 HTTP 기반의 실시간 통신의 한계를 극복하기 위해 웹소켓이 개발되었다. 웹소켓은 지속적인 양방향 연결, 낮은 오버헤드, 실시간 데이터 전달 등의 기능을 제공하여 HTTP보다 효율적이고 확장성이 높은 실시간 통신을 가능하게 한다.

  • 연결 유지
    HTTP는 클라이언트가 서버에 요청을 보내고 응답을 받은 후에 연결을 닫는 방식이다. 그러나 웹소켓은 클라이언트와 서버 간에 지속적인 양방향 연결을 유지한다. 이로 인해 매번 새로운 요청과 응답을 주고받는 HTTP와 달리, 웹소켓은 클라이언트와 서버 사이에서 실시간 데이터를 주고받을 수 있다.

  • 실시간 양방향 통신
    HTTP는 단방향 통신 프로토콜로서 클라이언트가 요청을 보내고 서버가 응답을 주는 방식이다. 반면, 웹소켓은 양방향 통신을 지원하여 클라이언트와 서버가 동시에 데이터를 주고받을 수 있다.

  • 작은 오버헤드
    HTTP는 요청과 응답을 위한 헤더를 포함한 많은 메타데이터를 전송해야 한다. 이로 인해 데이터 전송에 대한 오버헤드가 발생한다. 반면, 웹소켓은 효율적인 이진 프레임 형식을 사용하여 오버헤드를 최소화하고 더 작은 데이터 패킷을 전송할 수 있다.

  • 확장성
    HTTP는 클라이언트가 요청을 보내면 서버가 응답해야 하므로, 동시 연결이 많이 발생할 경우 서버의 부하가 증가할 수 있다. 하지만 웹소켓은 단일 연결을 통해 여러 개의 메시지를 주고받을 수 있으므로 서버의 확장성이 향상된다.

  • 서버 푸시
    HTTP는 클라이언트가 서버에 직접 요청을 해야 데이터를 받을 수 있다. 하지만 웹소켓은 서버가 언제든지 클라이언트로부터 독립적으로 데이터를 전송할 수 있으므로 서버 푸시 기능을 제공할 수 있다.

이렇게 웹소켓은 HTTP에 비해 지속적인 양방향 연결, 실시간 양방향 통신, 확장성 등의 장점을 가지고 있다. 이러한 특징으로 실시간 기능이 필요한 애플리케이션 개발을 더욱 효율적으로 할 수 있다.

이제 웹소켓의 통신 과정에 대해서 알아보자.

웹소켓 통신 과정

출처 - 위키백과(웹소켓)
  • 핸드셰이크(Handshake)
    웹소켓 통신은 HTTP를 기반으로 시작된다. 클라이언트는 서버에게 웹소켓 연결을 요청하기 위해 HTTP 요청을 보낸다. 이 요청에는 "Upgrade" 헤더와 "Connection" 헤더에 웹소켓을 지원한다는 정보가 포함된다.

  • 연결 설정
    서버는 클라이언트의 요청을 받으면 HTTP 응답을 보내고, 클라이언트와 웹소켓 연결을 설정한다. 이때 "Upgrade" 헤더와 "Connection" 헤더를 통해 웹소켓 연결임을 알리고, "Sec-WebSocket-Key" 헤더를 통해 클라이언트와 서버 간의 공유 키를 생성한다.

  • 데이터 교환
    웹소켓 연결이 설정되면, 클라이언트와 서버는 양방향으로 데이터를 주고받을 수 있다. 데이터는 이진 형식으로 교환되며, 프레임(Frame) 단위로 전송된다. 프레임에는 데이터 페이로드와 추가적인 제어 정보가 포함된다.

  • 연결 유지
    웹소켓은 TCP 기반으로 동작하며, 연결이 설정된 후에는 지속적인 양방향 통신을 제공한다. 클라이언트와 서버는 연결을 유지하며 데이터를 주고받을 수 있다. 이를 통해 실시간 데이터 전송이 가능하고, 양쪽 모두에서 이벤트를 즉시 수신하고 처리할 수 있다.

  • 연결 종료
    클라이언트 또는 서버가 웹소켓 연결을 종료하려면 명시적으로 연결을 닫는 클로즈(Close) 프레임을 전송한다. 이를 받은 상대방은 연결을 닫고 후속 동작을 수행한다.

이로써 웹소켓을 사용하여 실시간 채팅, 실시간 협업 도구와 같은 다양한 실시간 애플리케이션을 보다 효율적으로 개발할 수 있게 되었다.

0개의 댓글

관련 채용 정보