고코딩

실시간 웹 통신 방식 정리 본문

Spring 공부

실시간 웹 통신 방식 정리

고코딩 2021. 5. 24. 13:31

실시간 웹 통신 방식에 대한 정리

웹 클라이언트에서 정보를 주고받는 방식은 여러가지가 있지만, 그중에서도 실시간 웹 통신은 매우 까다롭게 구성되어 있다. 단순히 서버에 request만 계속 보내게 된다면 서버에 쓸데 없는 부하도 많이 생길 것이고 만약에 매번의 request마다 페이지를 새로 로드해야 한다면 서버에서는 페이지 정보를 매번 클라이언트로 보내야하는 불상사가 발생할 수 있다.

웹은 태생 자체부터 실시간을 위해 필수적인 지속되는 연결(persistence connection)을 가질 수 없다. 클라리언트에서 서버에 접속하면 응답하고 연결이 끊어진다.(HTTP의 특징) 때문에 안타깝게도 현재 웹에서 운용되는 실시간 서비스들은 대부분 실시간이 아니다. (10초 단위 30초 단위 라고 말할 수는 있을지는 몰라도 실시간은 아니다.)

실시간은 아니더라고 그렇게 보이는 리얼타임 웹 모델에 대해 알아보자.

Real-Time 웹 앱을 위한 수단 3가지

폴링 Polling / Long Polling [Client Pull]

폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다.

즉 현존 하는 대부분의 실시간 처럼 보이는 웹사이트 들은 클라이언트가 서버에게 일정한 주기를 가지고 응답을 주고받는 폴링 방식을 사용한다.

이는 AJAX polling 이라고도 불리는데 주로 AJAX호출을 사용하기 때문이다.

polling

일반적인 소켓들은 그 연결이 close를 호출되기 전까지 유지되지만 웹 상의 HTTP에서는 연결이 유지되지 않는다. 이로 인해 서버에서 클라이언트로 데이터를 보내고 싶을 경우 클라이언트의 요청을 기다려야 하는 문제가 생긴다. 즉, 서버가 임의로 데이터를 클라이언트에 보낼 수 없는 것이다.

이를 해결하기 위해 Server Push의 효과를 낼 수 있는 방식이 Polling이다.

Polling은 클라이언트 입장에서 서버에 주기적으로 Request를 보내는 것이다. 예를 들어, 클라이언트는 주기적으로 서버에 요청을 보낸다. 그리고 서버에 특정 event가 발생하지 않은 경우에는 빈 응답을 하고 특정 Event가 발생했다면 그 직후에 들어오는 요청에 데이터를 담아보내는 것이다.

클라리언트가 자꾸 서버를 찔러보는 것이다. -> 트래픽이 많이 발생할 것

Long Polling은 클라이언트가 요청을 보냈을 때 그 요청에 대한 연결을 서버가 Event 발생할 때까지 가지고 있는 것이다. 즉 응답을 지연시키는 것.(혹은 timeout되면 응답을 보내고 연결을 종료한다.) Long Polling은 서버입장에서 클라이언트의 요청을 가지고 있다가 특정 Event가 발생하면 그제서야 응답을 보내는 것으로 이해할 수 있다.

WebSocket

websocket

웹 소켓은 클라이언트와 서버 간에 연결을 지속시키는 것이다. 웹 소켓은 하나의 TCP connection위에서 전이중 통신 채널을 제공한다.

웹소켓(WebSocket)은 사용자의 웹 브라우저에서 서버로 영구 양방향, 전이중 TCP 연결을 위한 통신 프로토콜이다. 웹 소켓 연결은 웹 소켓 핸드셰이크 요청을 브라우저의 HTTP 연결에서 서버로 전송하여 연결을 업그레이드함으로써 시작됩니다. 업그레이드 요청 헤더와 함께 핸드셰이크 요청에는 64비트 Sec-WebSocket-Key 헤더가 포함됩니다. 서버는 Sec-Websocket-Auth 헤더에서 키의 해시로 응답합니다. 이 헤더 교환은 캐싱 프록시가 이전 WebSocket 교환을 다시 보내지 못하도록 합니다.

이 시점부터 연결은 이진이며 HTTP 프로토콜을 준수하지 않습니다. 서버 응용 프로그램은 모든 웹 소켓 연결을 인식하고 각 연결과 개별적으로 통신할 수 있습니다. 웹 소켓이 열린 상태로 유지되므로 서버 또는 사용자는 서버 중 하나가 세션을 닫을 때까지 언제든지 메시지를 보낼 수 있습니다. 통신은 어느 한쪽 끝에서 시작될 수 있으며, 이것은 이벤트 중심의 웹 프로그래밍을 가능하게 한다. 반면 표준 HTTP는 사용자만 새 데이터를 요청할 수 있도록 허용합니다.

정리 웹 소켓은 클라이언트-서버 간 커넥션을 유지하기 때문에 이벤트를 주고받을 때 실시간성을 보장할 수 있습니다. 하지만 대용량 트래픽에서는 서버가 클라이언트 수만큼의 연결을 유지해야 한다는 부담이 있습니다.

SSE (Server Send Event)

sse

SSE는 서버가 클라이언트로 비동기적인 데이터 전송을 할 수 있게 한다. 서버는 새로운 데이터가 업데이트될 때마다 그것을 클라이언트로 보낼지 결정할 수 있다. 서버에서 클라이언트로는 보낼 수 있지만, 클라이언트에서 서버로는 보내지 못 한다.

  • HTTP를 통해 통신하므로 다른 프로토콜이 필요없다
  • 표준기술이기에 대부분의 브라우저에서 지원된다.
  • 단방향이기에 편하다.