본문 바로가기

네트워크

SSE(Server Sent Event) 개념 정리

 

들어가면서..

이번 글에서는 SSE(Server Sent Event) 개념을 정리한다.

 

SSE(Server Sent Event)

SSE는 서버에서 클라이언트에게 실시간으로 데이터를 전송하는 기술이다.

기본 컨셉은 HTTP connection을 길게 유지하면서, 서버에서 클라이언트에게 데이터를 전송한다. 아래 그림을 보면 이해하기 쉽다.

 

long-lived HTTP

 

SSE가 나오게된 배경

SSE는 서버에서 데이터 변경이 있을때 클라이언트에게 실시간으로 알려주기 위해 주로 사용된다. SSE 기술이 등장하기 전에는 Client에서 서버의 데이터 변경을 확인하기 위해 주로 polling 방식을 사용했다.

 

Short Polling

클라이언트에서 주기적으로 API를 호출해 서버의 데이터 변경사항을 확인하는 기법이다. 플로우는 아래 그림과 같다.

Short Polling

Short Polling을 이용해 서버 호출주기를 짧게 가져간다면, 준 실시간으로 서버의 데이터 변경을 알 수 있다. 하지만 가장 큰 단점이 있다. 서버 요청수가 필요이상으로 많아진다. 즉, HTTP overhead가 증가한다. 이를 개선한 방법으로 Long Polling 개념이 나왔다.

 

Long Polling (Hanging GET)

클라이언트가 요청을 했을때 서버에서 바로 응답하는게 아니라 데이터 변경이 있을때까지 기다렸다가 응답하는 기법이다. Short Polling에 비해 HTTP overhead가 감소한다. 자세한 플로우는 아래 그림을 참고하기 바란다.

Long Polling

Short Polling과 비교하면 클라이언트의 요청수가 감소하기 때문에 HTTP overhead는 개선되었다. 하지만 더 좋은 방법이 있다. 바로 SSE이다.

 

SSE(Server Sent Event)

클라이언트가 서버와 HTTP connection을 맺어두면, 서버에서 데이터의 변화가 있을때마다 응답을 보낸다. (그림은 위에 있으니 생략하겠다.)

 

SSE를 이용하면 HTTP connection을 한번만 맺기 때문에 HTTP overhead가 Polling 방식(Short Polling, Long Polling)에 비해 월등히 개선된다.

이는 사용자 입장에서 잦은 HTTP 요청을 하지 않아도 되기 때문에 응답시간이 더 빨라지고, 디바이스의 배터리 사용률도 줄어들 수 있다.

 

(가끔 SSE와 WebSocket을 헷갈리는 분이 있는데 둘은 다른 기술이다. 간략하게 말하면 애초에 사용하는 프로토콜도 다르다. 또한 SSE는 서버에서 클라이언트로 단방향이지만, WebSocket은 클라이언트와 서버 양방향 통신이 가능하다.)

 

SSE 원리

SSE가 동작하려면 2가지 작업을 해야한다.

 

HTTP 관련 설정

HTTP Connection 유지

HTTP 버전 1은 HTTP 연결을 하나의 트랜젝션이 끝나고 유지할지 말지 Connection 헤더 값을 이용해 설정할 수 있다. HTTP/1.0의 경우 기본 설정이 트랜젝션이 끝난 후 연결을 끊기 때문에 Connection 헤더 값을 keep-alive로 주면된다. HTTP/1.1은 기본 설정이 트랜젝션이 끝나더라도 연결을 유지하기 때문에 따로 설정할 필요 없다.

 

HTTP 버전 2부터는 하나의 HTTP Connection에서 여러 HTTP 요청이 동시에 이뤄질 수 있기 때문에 HTTP Connection 관련 설정을 따로 해줄 필요가 없다. (https://http.dev/keep-alive)

 

그 외 설정

HTTP Request

Accept Header 값을 text/event-stream 설정

 

HTTP Response

Content-Type Header 값을 text/event-stream

Cache-Control Header 값을 no-store

 

SSH Event 포맷

  • field와value로 이루어진다.(field 종류: event, data, id, retry)
  •  event는 \n\n으로 구분한다.
  • UTF-8로 인코딩되어 있다.

좀 더 자세한 내용은 문서를 참고하기 바란다.

 

마무리

이번글을 통해 SSE에 대한 개념과 SSE를 사용하기 위해 알아야되는 개념을 정리했다.

실제로 Spring과 Java를 이용해 SSE를 구현하는 과정은 다른 글에서 정리하겠다.

 

잘못된 내용이 있다면 언제든 피드백 부탁드립니다.

'네트워크' 카테고리의 다른 글

HTTP Connection 역사 알아보기  (0) 2024.02.24
HTTPS 적용 방법과 동작원리  (1) 2023.07.14
WebSocket과 친해지기  (0) 2023.05.30
REST API  (0) 2022.06.14