HTTP의 이해
HTTP란?클라이언트와 서버가 서로 데이터를 주고받기 위해 사용되는 통신 규약으로 다음과 같은 데이터 타입을 전송할 수 있다.HTML, TEXT이미지, 음성, 영상, 파일 등JSON, XML이렇게 거의 모든 형태
hbb-devlog.tistory.com
HTTP 통신은 요청-응답(Request-Response) 구조를 따르며, 무상태(stateless), 비연결성(connectionless) 이라는 특징을 가진다.
즉, 서버는 클라이언트가 요청을 보낼 때만 응답하고, 응답이 완료되면 연결이 종료되는데, 이러한 특성 때문에 실시간 데이터 통신이 필요한 서비스에서는 한계가 존재한다.
이를 해결하기 위해 클라이언트와 서버 간 데이터를 실시간으로 주고받는 방법으로 Polling과 Long Polling, SSE(Server Sent Event), 소켓 방식이 있는데 이번 시간에는 Polling, Long Polling, SSE의 개념에 대해서 알아보려고 한다.
Polling
Polling은 클라이언트가 일정한 주기로 서버에 HTTP 요청을 보내 데이터를 가져오는 방식이다.
일반적으로 API를 호출하는 방식과 유사하게 동작하기 때문에 호환성이 뛰어나고 구현이 비교적 쉽지만 다음과 같은 단점이 존재한다.
- 서버에 새로운 데이터가 없더라도 클라이언트는 주기적으로 요청을 보내므로 데이터 변경이 드문 경우에도 불필요한 요청이 발생
- 많은 클라이언트가 동시에 Polling을 수행할 경우, 서버는 모든 요청에 대해 응답해야 하므로 서버에 부하가 증가
- 데이터가 생성된 후 다음 Polling 주기까지 클라이언트가 새로운 데이터를 확인할 수 없기 때문에 데이터 갱신 지연이 발생할 수 있음
Long Polling
클라이언트가 서버에 요청을 보내면 서버는 즉시 응답하지 않고 새로운 데이터가 발생할 때까지 대기하다가 데이터가 변경되면 서버는 클라이언트에 응답을 반환하고 연결을 종료하는 방식이다.
이 방식은 Polling에 비해 불필요한 요청을 줄여 서버 부하를 감소시키며, 보다 실시간에 가까운 데이터 제공이 가능하지만 데이터 변경이 자주 일어나는 상황이면 Polling과 유사한 수준의 서버 부하가 발생한다.
SSE (Server Sent Event)
SSE는 서버가 클라이언트로 데이터를 실시간 푸시하는 방식으로, 클라이언트가 서버에 연결을 수립하고 특정 이벤트에 대한 구독 요청(Subscribe)을 보내면 서버는 해당 이벤트가 발생할 때마다 자동으로 데이터를 클라이언트에 전송한다.
이 방식은 서버에서 클라이언트로만 단방향 데이터 전송이 가능하며, 한 번 연결된 후에는 서버가 지속적으로 데이터를 전송하기 때문에 Polling이나 Long Polling에 비해 서버와 네트워크 부하가 적다. 다만, 동시에 연결할 수 있는 클라이언트 수에 제약이 있을 수 있다.
1. 클라이언트는 구독을 위한 요청 전송
- SSE는 HTTP 프로토콜을 기반으로 하는 단방향 통신 방법
- 따라서 클라이언트가 먼저 연결 요청을 보내야 서버가 해당 클라이언트를 식별하고 이벤트를 보낼 수 있다.
- HTTP/1.1 (Persistent Connection)
- Accept: text/event-stream : 해당 연결이 SSE를 위한 것임을 서버에 알림. (이벤트를 위한 요청 표준 - text/event-stream)
- 서버는 이 요청을 받고 연결을 유지한 채로 이벤트를 스트리밍할 준비를 한다.
- Cache-Control: no-cache : 실시간 이벤트 스트리밍에서 캐싱이 불필요하므로 설정
GET /subscribe HTTP/1.1
Accept: text/event-stream
Cache-Control: no-cache
2. 서버는 구독 요청에 대해 응답을 전송
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=UTF-8
Transfer-Encoding: chunked
- Content-Type: text/event-stream - 브라우저는 해당 헤더를 보고 일반 HTTP 응답이 아닌 이벤트 스트림으로 처리
- Transfer-Encoding: chunked - 서버가 전체 응답 크기를 미리 알 수 없는 동적 컨텐츠 전송이므로 사용
3. 구독을 성공적으로 마치게 되면 서버에서 클라이언트로 단방향 데이터 전송이 가능하며 데이터 변경이 일어날 때 마다 응답 전송.
- 이 때 전송할 데이터는 바이너리 데이터가 아닌 UTF-8로 인코딩된 텍스트만 가능하며 이벤트 구조는 아래와 같다.
event: userAlert # 이벤트 이름 (선택)
id: 12345 # 이벤트 ID (선택)
retry: 15000 # 재접속 시도 간격(ms) (선택)
data: {"message": "Hello!"} # 실제 데이터
여러 이벤트가 전송될 때는 아래와 같이 전송된다.
event: userAlert\n
data: {"message": "Hello!"}\n
\n
event: notification\n
data: {"type": "warning"}\n
\n
이렇게 각각의 이벤트는 1개 이상의 key-value 형식이며, 줄바꿈 문자(\n) 2개로 각 이벤트를 구분할 수 있다.
'CS' 카테고리의 다른 글
인터넷과 웹 (0) | 2025.06.05 |
---|---|
WebSocket & STOMP의 개념 (0) | 2025.02.23 |
OAuth2.0 개념 (1) | 2025.01.02 |
HTTP의 이해 (0) | 2024.12.27 |
CORS (0) | 2024.12.26 |