본문 바로가기

개발일지/TIL

[230808] Polling, SSE, WebSocket ?

알림 기능 구현

알림 기능을 구현을 하기로 했다. 알림은 이벤트가 벌어질 때마다 실시간으로 유저들에게 보내져야 했다. 실시간 통신이 필요했기에 찾아보고 적용해 보기로 했다. 대표적으로 Polling, WebSocket, SSE 3가지가 있었다. 각자 어떤 특징이 있고 프로젝트에 적합한 방식은 무엇인지 고민하고 결정하기로 했다. 

Polling ?

💬 실시간 통신을 처리하기 위해 사용되는 방식입니다. HTTP 프로토콜을 사용하여 통신을 하며, Polling과 Long Polling 방식이 있습니다.  

 

✔ Polling 

💬 Polling은 일정한 간격으로 클라이언트에서 서버로 요청을 보냅니다. 서버는 요청한 데이터를 응답으로 내려준다. 데이터가 없다면 빈 응답을 내려줍니다. 

💢 Polling의 경우 짧은 간격으로 요청을 보낸다면 응답을 내려줘야 하는 서버 입장에서 부담이 됩니다. 긴 간격으로 보낸다면 실시간 통신이 아니게 됩니다. 또한 서버로 보낸 요청에 대한 응답이 빈 응답이 많이 올 경우 HTTP 오버 헤드가 발생할 수 있습니다.

 

✔ Long Polling

💬 Long Polliing은 Polling의 HTTP 오버 헤드를 해결하기 위해 나온 방식이라고 생각합니다. Polling과 동일하게 반복적으로 서버로 요청을 보냅니다. 서버는 요청한 데이터가 있을 때까지 대기(Hanging GET)를 합니다. 데이터가 생기면 응답을 내려줍니다. Polling과 달리 서버에서 대기를 하기 때문에 제한 시간이 있습니다.

✅ Polling처럼 빈 데이터를 응답을 내려주는 것이 사라져 HTTP 오버 헤드를 많은 부분 해결해 주었습니다.

💢 Long Polling도 요청과 응답이 받는 주기가 짧아진다면 Polling과 차이가 없습니다.

WebSocket ?

💬 WebScoket은 서버와 클라이언트가 하나의 TCP를 사용해 실시간으로 양방향 통신을 할 수 있게 해 줍니다. 연결은 HTTP를 통해서 되며 이후 WS 프로토콜로 변경이 됩니다.  

✅ 장점
    ➡ 실시간 양방향 통신을 제공합니다.
    ➡ UTF-8 뿐만 아니라 이진 데이터(이미지, 비디오) 등도 주고받을 수 있습니다.
    ➡ 브라우저 연결에 제한이 없습니다.

💢 단점
    ➡ HTTP 기능을 사용할 수 없습니다. ( 압축 지원, Proxy, XSS 취약 )
    ➡ 자동 재접속 기능을 제공해주지 않습니다.
    ➡ 패킷 모니터링 기능이 있는 방화벽에서 문제가 될 수 있습니다.
    ➡ 설정하는 데에 시간이 많이 소요됩니다.

SSE ?

💬 SSE(Server-Sent Evnets)는 브라우저가 HTTP 연결을 통해 서버에서 이벤트 데이터를 수신할 수 있도록 하는 기술입니다. 하나의 HTTP 연결만 사용을 하며, 서버에서 클라이언트 방향으로만 통신이 가능합니다.

✅ 장점
    ➡ 재연결 기능을 제공합니다.
    ➡ WebSocket에 비해 설정하는 데에 시간이 적게 소요됩니다.
    ➡ HTTP 프로토콜을 사용하기 때문에 HTTP에 제공하는 기능들을 사용할 수 있습니다.
    ➡ 패킷 모니터링 기능이 있는 방화벽도 문제없이 사용할 수 있습니다.

💢 단점
    ➡ 브라우저에 연결할 수 있는 SSE 개수의 제한이 있습니다. (HTTP/1.1의 경우 6개, HTTP/2의 경우 100개까지 가능)
    ➡ UTF-8 문자 데이터 제공을 합니다.
    ➡ 단방향 데이터 전송만 제공합니다.