웹소켓과 SSE
웹소켓과 SSE
사이드 프로젝트를 진행하던 중 실시간으로 알림을 전송해주거나 가격변동을 표시해주느 서비스를 구현하기로 했다.
실시간으로 데이터를 전송하려면 클라이언트가 일정한 주기로 서버에 HTTP 업데이트 요청을 보내야하는데
(Polling, Long Polling 방식)
이런 방식은 리소스낭비가 심하다.
클라이언트가 매번 요청을 하지 않아도 계속 서버와 데이터를 주고받는 방법에는 웹소켓방식과 SSE 방식이 있었다.
무엇을 사용하는게 좋을 지 찾아보게되었다.
웹소켓 (WebSocket)
웹소켓이란 통신 프로토콜 중 하나로 실시간으로 양방향 통신을 지원한다.
매번 HTTP요청을 보내는 것이 아니라 처음에 연결을 위한 하나의 HTTP요청만 존재하며
한 번 연결을 시켜두면 지속적으로 클라이언트와 서버가
프로토콜을 통해 데이터를 주고받는다.
장점
1. 실시간으로 데이터를 전송할 수 있다.
2. 양방향으로 데이터를 전송할 수 있다.
단점
1. 구현이 복잡하다. (연결이 끊겼을 때 대응이 어렵다.)
2. 웹소켓을 계속 열어놔야 통신이 가능하기 때문에 자원이 많이 든다. (CPU, 서버 부하)
3. 구버전 브라우저
예시
게임, 실시간 채팅 서비스, 구글Docs 등 실시간 양방향 데이터 전송이 필요한 서비스
SSE (Server-Sent Events)
SSE는 Server-Sent Events의 줄임말로 웹소켓과 달리 단방향 실시간 통신을 가능하게 해주는 기술이다.
서버만 데이터를 전송할 수 있고 클라이언트는 데이터를 전송 받기만 가능하다.
별도의 프로토콜이 필요없이 HTTP 만으로 사용이 가능하다.
웹 표준으로 Internet Explorer를 제외한 모든 브라우저에 지원된다.
장점
1. 자원소모량이 웹소켓보다 적다.
2. 구현이 상대적으로 쉽다. (HTTP통신을 사용하기 때문에 별도의 프로토콜이 필요없다.)
3. 대부분의 브라우저를 지원한다. (JavaScript를 통해 크로스 브라우징 가능)
4. 연결이 끊기면 자동으로 재접속을 시도한다.
단점
1. 양방향 통신이 불가능하다.
2. 동시 접속수의 제한이 있다.
HTTP/1 의 경우 -> 6개
HTTP/2 의 경우 -> 100개
3. 클라이언트가 접속을 끊어도 서버에서 접속이 끊겼는지 파악하기 어렵다.
예시
푸시알림 , 뉴스피드, 주식차트 등 실시간 단방향 데이터 전송이 필요한 서비스