Polling, Long Polling, WebSocket, Server-Sent Events (SSE)의 개념과 장단점을 비교하고 Python으로 직접 실행해볼 수 있는 예제를 실행해봅니다.
클로드의 도움을 받아 작성했습니다.
최초작성 2026. 1. 22
최종작성 2026. 1. 26
Polling
Long Polling
WebSocket
Server-Sent Events (SSE)
선택 가이드
상세 비교표
예제 코드
Polling
클라이언트가 서버에 주기적으로 요청을 보내 새로운 데이터가 있는지 확인하는 방식입니다. 예를 들어, 클라이언트가 일정한 간격(예: 1초, 5초)마다 서버에 “새로운 데이터 있어?”라고 물어보는 것과 같습니다.
장점
구현이 매우 단순함 일반적인 HTTP 요청/응답만 사용하므로 특별한 프로토콜이나 라이브러리 없이 기존 REST API 방식 그대로 구현 가능합니다.
모든 브라우저와 서버에서 지원 HTTP 표준을 사용하므로 별도의 호환성 문제가 없음
디버깅과 모니터링이 쉬움 각 요청이 독립적인 HTTP 요청이므로 일반 API처럼 로깅하고 추적 가능
방화벽/프록시 문제가 거의 없음 표준 HTTP 포트(80, 443)를 사용하는 일반 요청이라 네트워크 장비에서 차단되지 않음
서버가 상태를 유지할 필요 없음 (Stateless)
단점
새로운 데이터가 없어도 계속 요청하므로 서버 부하와 네트워크 낭비됩니다. 예를 들어 사용자 1000명에게 1초 간격으로 폴링하면 초당 1000개의 요청이 발생하지만 대부분은 “데이터 없음” 응답을 받을 가능성이 높습니다.
폴링 간격만큼 지연됨으로 실시간성이 낮습니다. 폴링 간격이 2초라면 서버에 데이터가 이미 준비되었더라도 최대 2초를 기다려야 클라이언트가 새로운 데이터의 존재를 알게됩니다.
폴링 간격을 짧게 하면 부하가 올라가고 길게 하면 지연이 올라갑니다 (트레이드오프)
활용
클라이언트가 1초마다 요청하여 서버로부터 기온을 받아옵니다.
동작 흐름
Long Polling
클라이언트가 요청을 보내면, 서버가 새 데이터가 생길 때까지 응답을 보류합니다. 데이터가 생기면 즉시 응답하고, 클라이언트는 바로 다시 요청을 보냅니다. 일반 polling보다 효율적이지만 여전히 HTTP 연결을 반복적으로 맺어야 합니다.
장점
Polling보다 실시간성이 좋습니다. 서버에 데이터가 생기는 즉시 응답하므로 폴링 간격만큼의 지연이 없습니다.
불필요한 요청이 감소하여 서버 부하가 감소합니다. 데이터가 없을 때 빈 응답을 반복하지 않고, 데이터가 있을 때만 응답하므로 트래픽 절약됩니다.
HTTP 기반이라 방화벽/프록시 통과 용이하며 WebSocket과 달리 프로토콜 업그레이드가 없어서 일반 HTTP 트래픽으로 인식됩니다.
WebSocket 미지원 환경에서 대안으로 사용 가능하며 오래된 브라우저나 WebSocket을 차단하는 기업 네트워크에서도 동작합니다.
단점
여전히 HTTP 연결을 반복적으로 맺어야 하며 응답을 받을 때마다 새 요청을 보내야 하므로 TCP 핸드셰이크, HTTP 헤더 등의 오버헤드 발생합니다.
서버가 많은 연결을 동시에 유지해야 합니다. 모든 클라이언트가 응답 대기 상태로 연결을 유지하므로 동시 연결 수가 사용자 수만큼 증가합니다.
타임아웃 처리 로직 필요합니다. 프록시나 로드밸런서가 오래 열린 연결을 끊을 수 있어서 적절한 타임아웃과 재연결 로직이 필수입니다.
활용
채팅 애플리케이션의 새 메시지 알림
동작 흐름
WebSocket
클라이언트와 서버 간에 지속적인 양방향 연결을 유지합니다. 한 번 연결되면 서버가 언제든 클라이언트에게 데이터를 푸시할 수 있어 실시간 애플리케이션(채팅, 게임, 주식 시세 등)에 적합합니다.
장점
진정한 실시간 양방향 통신 연결이 이미 열려 있으므로 데이터 발생 즉시 전송 가능하며 밀리초 단위의 지연만 발생합니다.
연결 오버헤드 최소화 최초 핸드셰이크 이후에는 연결을 재사용하므로 매번 TCP/HTTP 연결을 맺는 비용이 없습니다.
서버가 먼저 클라이언트에게 푸시 가능 클라이언트 요청 없이도 서버가 원할 때 데이터를 보낼 수 있어 알림, 실시간 업데이트에 적합합니다.
네트워크 효율성 최고 HTTP 헤더 없이 작은 프레임 단위로 데이터를 주고받아 대역폭 사용량이 적습니다.
단점
구현이 복잡함 연결 상태 관리, 하트비트, 재연결 로직 등을 직접 구현해야 하며 상태를 유지(Stateful)해야 합니다.
일부 프록시/방화벽에서 문제가 될 수 있음 WebSocket은 HTTP에서 프로토콜 업그레이드를 하므로 이를 지원하지 않는 프록시에서 연결이 끊어질 수 있습니다.
연결이 끊어지면 재연결 로직 필요 네트워크 불안정 시 자동 재연결, 미전송 메시지 처리 등을 직접 구현해야 합니다.
스케일링이 어려움 서버가 모든 연결 상태를 메모리에 유지해야 하므로 서버 증설 시 세션 공유(Redis Pub/Sub 등)가 필요합니다.
활용
실시간 채팅
동작 흐름
Server-Sent Events (SSE)
서버에서 클라이언트로 단방향 스트림을 열어 데이터를 푸시합니다. WebSocket보다 단순하고, 뉴스 피드나 알림처럼 서버에서 클라이언트 방향만 필요한 경우에 유용합니다.
장점
HTTP 기반이라 구현이 간단 특별한 프로토콜 없이 HTTP 응답을 스트리밍하는 방식이라 기존 웹 서버에서 쉽게 구현 가능합니다.
자동 재연결 기능 내장 브라우저의 EventSource API가 연결이 끊어지면 자동으로 재연결을 시도하므로 별도 구현 불필요합니다.
방화벽/프록시 통과 용이 일반 HTTP 응답과 동일하게 취급되어 네트워크 장비에서 차단되지 않습니다.
WebSocket보다 가벼움 양방향 통신이 필요 없는 경우 불필요한 복잡성 없이 서버 푸시만 구현 가능합니다.
단점
단방향만 지원 서버에서 클라이언트 방향만 스트리밍되므로 채팅처럼 양방향 통신이 필요하면 부적합합니다.
클라이언트에서 서버는 별도 HTTP 요청 필요 사용자 입력을 서버로 보내려면 SSE 연결과 별개로 POST 요청 등을 추가로 구현해야 합니다.
바이너리 데이터 전송 어려움 SSE는 텍스트 기반이라 이미지나 파일 같은 바이너리 데이터는 Base64 인코딩이 필요해 비효율적입니다.
IE/Edge 레거시 미지원 Internet Explorer와 구버전 Edge에서는 EventSource API를 지원하지 않아 폴리필이 필요합니다.
활용
실시간 주식 시세 업데이트
동작 흐름
만약 클라이언트가 서버에 데이터를 보내고 싶다면?
선택 가이드
[질문 1] 실시간 양방향 통신이 필요한가? (클라이언트 ↔ 서버 자유롭게 주고받기)
├── ✅ YES ─────────────────────────────> 🔌 WebSocket : 실시간 채팅(예 – 카카오톡 )
│
└── ❌ NO ───> [질문 2]로 이동
[질문 2] 서버에서 클라이언트로 푸시만 필요한가? (서버가 먼저 데이터 보내기)
├── ✅ YES ───> [질문 3]으로 이동
│
└── ❌ NO ───────────────────────────> ⏰ Short Polling : 1분마다 기온 전송
[질문 3] 오래된 브라우저(IE 등) 호환성이 필요하거나 인프라 제약이 있는 경우
├── ✅ YES ─────⏳ Long Polling : 로컬 개발 환경에서 Webhook 설정 없이 봇 테스트 가능,업데이트 수신 ( Telegram Bot )
│
└── ❌ NO ───────────────────────────────> 📡 SSE : 실시간 주식 시세 표시
상세 비교표
구현 쉬움 Short Polling ━━━> SSE ━━━> Long Polling ━━━> WebSocket
실시간성 높음 Short Polling <━━━ Long Polling <━━━ SSE ═══ WebSocket
서버 효율 좋음 Short Polling <━━━ Long Polling <━━━ SSE ═══ WebSocket
예제 코드
01_polling.py
https://github.com/webnautes/polling_long_polling_websocket_sse/blob/main/01_polling.py
02_long_polling.py
https://github.com/webnautes/polling_long_polling_websocket_sse/blob/main/02_long_polling.py
03_websocket.py
https://github.com/webnautes/polling_long_polling_websocket_sse/blob/main/03_websocket.py
04_sse.py
https://github.com/webnautes/polling_long_polling_websocket_sse/blob/main/04_sse.py
이해를 돕기위해 파이썬 코드 동작 영상이 포함된 유튜브 영상을 제작했습니다.