Self-Study/기타

[Network] SSE

Raadian 2022. 7. 5. 08:17

Reference

https://hamait.tistory.com/792

https://surviveasdev.tistory.com/entry/웹소켓-과-SSEServer-Sent-Event-차이점-알아보고-사용해보기

https://boxfoxs.tistory.com/403

 

SSE의 정의

SSE(Server-Sent Events)실시간으로 서버를 구독(Subscribe) 하는 개념으로 서버-클라이언트 간 지속적으로 통신을 유지하면서 화면을 새로고침 하지 않고도 유저 측에서 새로운 정보를 접할 수 있게끔 하는 구조이다.

이는 WebSocket과 유사하나 SSE의 경우 단방향 통신을 하는 데에 차이가 있다.

 

SSE의 구조

HTTP의 특성 상 TCP 기반으로 서버-클라이언트 간 일회성으로 데이터를 주고받은 뒤 연결을 해제한다.

그러나, SSE는 파일 전송과 같이 첫 연결 때 데이터를 상호 간 주고 받은 후 연결 상태를 유지하면서 서버가 일방적으로 데이터를 전송하는 형태를 가지고 있다.

 

SSE의 구현

Node.js

headers를 다음과 같이 설정한다.

const headers = {
		// 이벤트 스트림 설정
    'Content-Type': 'text/event-stream',
		// 커넥션을 닫는게 아닌 계속 오픈(keep-alive)
    'Connection': 'keep-alive',
		// 새로운 데이터가 오므로 캐시 설정 off
    'Cache-Control': 'no-cache',
}

응답연결해제를 설정한다.

res.writeHead(200, headers)

const clientId = request.query.clientId

clients[clientId] =  {
  response,
}

request.on('close', () => {
  delete clients[clientId]
})

설정한 코드대로 SSE 관련 통신 기능을 구현한다.

const notifyUser = (req, res) => {
  const payload = {...}

  clients.forEach(client =>
		// 맨 끝에 '\\n\\n'를 달아 이벤트 스트림의 끝을 표현한다
  	client.response.write(`data: ${JSON.stringify(payload)}\\n\\n` )
}

Vue.js

EventSource를 통해 SSE 연결 설정을 한다.

// SSE 선언 및 EventSource 할당
const sseEvents = new EventSource('SSE 설정 URL')

// 연결이 됐을 때
sseEvents.onopen = function() {
  ...
}

// 에러가 났을 때
sseEvents.onerror = function (error) {
  ...
}

// 메세지를 받았을 때
sseEvents.onmessage = function (stream) {
  const parsedData = JSON.parse(stream.data)
}

 

WebSocket Vs. SSE

  WebSocket  SSE
IE 지원 여부 IE 10부터 지원 미지원
통신 방향 양방향 단방향(서버 to 클라이언트)
리얼타임 YES YES
데이터 형태 Binary, UTF-8 UTF-8
자동 재접속 No YES(3초 마다)
최대 동시 접속 수 서버 셋업에 따라 다름 HTTP는 6개 / HTTPS는 100개
프로토콜 websocket HTTP
전력 소모량 작음
방화벽 친화적 No YES