728x90
1. Server-Sent Events (SSE)
- 정의
SSE는 서버에서 클라이언트로 일방적으로 데이터를 전송하는 방식이다.
클라이언트는 서버에 연결을 요청하고,
서버는 연결이 열려 있는 동안 이벤트를 지속적으로 클라이언트에게 보낼 수 있다.
- 특징
- 작동 방식: 클라이언트는 EventSource 객체를 통해 서버에 연결하고, 서버는 특정 이벤트가 발생할 때마다 데이터를 클라이언트로 전송함
- 통신 방향: 단방향 (서버 -> 클라이언트)
- 프로토콜: 일반 HTTP 프로토콜을 사용하여 방화벽, 프록시 서버를 통과하기 쉬움. 추가적인 보안 설정 없이도 사용 가능
- 연결 유지 및 재연결: 클라이언트 측에서 자동으로 재연결을 시도하는 기능 내장
👉 연결이 끊어지면 자동 복구 시도 - 전송 포맷: 서버는 일반적으로 텍스트 데이터를 전송함
- 장점
- 간편한 설정: 클라이언트가 서버에 지속적으로 연결되어 있는 상태에서 서버가 데이터를 전송하면 됨
- 자동 재연결: SSE는 연결이 끊어지더라도 자동으로 재연결을 시도함
- HTTP 프로토콜 사용: HTTP 기반이므로 방화벽을 쉽게 통과할 수 있고, 구현이 간단함
- 단점
- 단방향 전송: 서버에서 클라이언트로만 전송할 수 있음. 클라이언트가 서버로 메시지를 보내야 할 경우, 별도의 HTTP 요청을 사용해야 함
- 전송 데이터 양 제한: SSE는 HTTP 기반이므로 대규모 데이터를 빈번하게 전송하는 데는 적합하지 않음
2. WebSocket 웹소켓
- 정의
WebSocket은 서버와 클라이언트 간 양방향 통신을 지원하는 프로토콜이다.
WebSocket 연결이 열리면 서버와 클라이언트가 상호 데이터 전송을 자유롭게 주고 받을 수 있는 상태가 된다.
- 특징
- 작동 방식: WebSocket은 ws:// 또는 wss:// 프로토콜로 연결을 설정함. 일반적인 HTTP 요청으로 연결을 시작한 후 핸드셰이크 과정을 통해 WebSocket 연결을 확립함
- 통신 방향: 양방향 (서버 <-> 클라이언트)
- 프로토콜: WebSocket 프로토콜은 HTTP와 다르며, 연결이 설정되면 지속적인 데이터 스트림이 열리므로 추가 요청이 필요하지 않음
- 연결 유지 및 재연결: WebSocket은 자체적으로 연결 복구를 지원하지 않기 때문에, 연결이 끊기면 클라이언트가 수동으로 재연결을 시도해야 함
- 전송 포맷: 텍스트와 바이너리 데이터를 전송
👉 다양한 데이터 형식을 실시간으로 주고받기에 적합함
- 장점
- 양방향 통신: 서버와 클라이언트 간에 상호 통신이 가능함 👉 실시간 채팅과 같은 상호작용이 많은 애플리케이션에 적합함
- 다양한 전송 데이터 형식 지원: 텍스트 외에 바이너리 데이터 전송도 지원함
- 연결 효율성: 하나의 연결이 열리면 추가적인 요청 없이 데이터를 주고 받을 수 있어 네트워크 비용이 절감됨
- 단점
- 구현의 복잡성: SSE에 비해 초기 설정이 복잡할 수 있으며, 방화벽이나 프록시에서 차단될 가능성이 있음
- 자동 재연결 없음: 연결이 끊어질 경우 클라이언트가 직접 재연결을 구현해야 함
SSE와 WebSocket 비교
구분 | Sever-Sent Events (SSE) | WebSocket |
통신 방향 | 단방향 (서버 -> 클라이언트) | 양방향 (서버 <-> 클라이언트) |
프로토콜 | HTTP | WebSocket 프로토콜(ws:// 또는 wss://) |
연결 유지 | 자동 재연결 지원 | 자동 재연결 없음, 직접 구현 필요 |
데이터 전송 방식 | 텍스트 형식 | 텍스트, 바이너리 데이터 지원 |
사용 목적 | 실시간 업데이트 (뉴스, 주식 등 단방향 알림) | 실시간 양방향 통신 (채팅, 게임, 실시간 협업) |
방화벽/프록시 | HTTP를 사용해 방화벽 및 프록시를 쉽게 통과 가능 | 일부 환경에서 방화벽 및 프록시 설정 필요 |
복잡성 | 간단한 설정 | 핸드셰이크 및 관리가 다소 복잡 |
정리
- SSE는 단방향으로 서버가 클라이언트에게 실시간 알림을 보낼 때 유리함. 설정이 간단하고 자동 재연결을 지원함
- WebSocket은 양방향 통신이 필요한 실시간 애플리케이션에 적합함. 텍스트와 바이너리 데이터를 모두 지원하지만 재연결 로직을 직접 구현해야 하는 등 다소 복잡할 설정이 필요함