📡 Server-Sent Events (SSE)란?
- 서버에서 클라이언트로 단방향으로 실시간 이벤트를 전송하는 웹 기술로, 서버에서 발생하는 업데이트나 알림 등을 실시간으로 클라이언트에 전달할 수 있다.
- 단방향 통신이기 때문에 서버에서 클라이언트로만 데이터를 전송할 수 있다.
- 클라이언트는 HTTP 프로토콜을 통해 SSE 연결을 설정하고, 서버는 HTTP 응답을 유지한 상태에서 데이터를 전송한다.
- 재연결 기능을 제공하기 때문에 연결이 끊어졌을 때 자동으로 다시 연결한다.
- 클라이언트와 서버 간에 지속적인 연결을 유지하고, 서버가 필요한 시점에만 데이터를 전송하는 방식이다.
SSE vs. WebSocket
WebSocket과의 차이점
-
데이터 흐름
- SSE와 WebSocket의 가장 큰 차이점은 데이터의 흐름이다.
- SSE는 서버에서 클라이언트로 데이터를 전송하는 단방향 통신 방식이다.
- WebSocket은 양방향 통신을 지원하여 서버와 클라이언트가 데이터를 서로 주고받을 수 있다.
- 따라서, SSE는 주로 서버에서 클라이언트로 일방적인 데이터 전송이 필요한 주가 업데이트나 실시간 알림 메시지에 적합하고, WebSocket은 양방향 통신이 필요한 실시간 채팅 등에 사용된다.
-
프로토콜
- SSE는 웹 기술이기 때문에 HTTP 프로토콜 위에서 동작한다.
- 또한, HTTP 연결을 유지한 상태에서 재연결이나 추가 설정 없이 서버로부터 지속적인 데이터 스트림을 받을 수 있다.
- 반면, WebSocket은 독립적인 프로토콜(
ws://,wss://) 을 사용하고, HTTP와는 별도의 연결을 만들어 데이터를 주고받는다.
-
기타
- SSE는 CORS(Cross-Origin Resource Sharing) 를 통해 다른 도메인에서도 데이터를 수신할 수 있다.
- WebSocket도 동일한 도메인 간 통신을 제공하지만, 보안상의 이유로 추가 구성이 필요할 수 있다.
| 구분 | Server-Sent Events (SSE) | WebSocket |
|---|---|---|
| 통신 방향 | 단방향 (서버 → 클라이언트) | 양방향 (서버 ↔ 클라이언트) |
| 프로토콜 | HTTP/HTTPS | WS/WSS (독립 프로토콜) |
| 자동 재연결 | 내장 기능으로 지원 | 직접 구현 필요 |
| 주요 사용 사례 | 실시간 알림, 주가/날씨 업데이트 | 실시간 채팅, 온라인 게임 |
🔁 통신 프로세스 설명
- 클라이언트 초기화: 클라이언트가
EventSource객체를 생성하여 서버의 SSE 엔드포인트(/api/events)에 연결을 시도합니다. - 서버 설정: 서버는
Content-Type을text/event-stream으로 설정하고, 연결을 유지하기 위해Cache-Control과Connection헤더를 설정합니다. - 데이터 전송: 서버는 일정 시간 간격으로 클라이언트에게 이벤트 데이터를 전송합니다. 이 예제에서는 1초마다 현재 시간을 JSON 형식으로 전송합니다.
- 이벤트 수신: 클라이언트는 서버로부터 이벤트를 수신하고,
onmessage이벤트 핸들러를 통해 수신된 데이터를 처리합니다. - 연결 종료: 클라이언트가 페이지를 떠나거나 연결이 종료되면
EventSource객체는close메소드를 호출하여 연결을 종료합니다.