![[HTTP] Short Polling과 Long Polling](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWOPM%2FbtsJJTwvVKG%2FOB3PKcfLrUlgNAMyxQz4vK%2Fimg.png)
[HTTP] Short Polling과 Long Pollinglegacy/WEB2024. 9. 24. 16:51
Table of Contents
HTTP 프로토콜
HTTP 프로토콜은 클라이언트-서버 모델로써, 클라이언트가 요청을 보내면 서버가 응답을 내리는 구조이다. HTTP의 특징으로는 stateless(무상태)와 connectionless(비연결성)이다.
- Stateless(무상태)
- 서버는 클라이언트의 이전 요청에 대해서 기억하지 않는다. 즉, 서버는 응답을 내려준 클라이언트의 요청에 대해서 기억하지 않는다는 것이다.
- ex) 사용자가 로그인 페이지에서 로그인을 했더라도 다른 페이지로 이동하면 로그인이 유지되지 않는다.
- 상태를 유지하기 위해서는 쿠키(Cookie), 세션(Session), 토큰(Token) 등을 사용하여 클라이언트와 서버 간의 상태를 기억할 수 있다.
- 서버는 클라이언트의 이전 요청에 대해서 기억하지 않는다. 즉, 서버는 응답을 내려준 클라이언트의 요청에 대해서 기억하지 않는다는 것이다.
- Connectionless(비연결성)
- HTTP는 TCP(Transmission Control Protocol) 위에서 동작하는 프로토콜이다. 클라이언트 요청에 대하여 서버가 응답을 내리면 TCP/IP 연결이 끊어진다. 수많은 사용자의 요청이 발생하더라도 응답이 발생하는 대로 연결이 끊어지기 때문에 서버는 많은 요청을 처리할 수 있다.
따라서 HTTP 요청을 처리하는 클라이언트-서버 모델은 다음과 같다.
- 클라이언트는 서버로 HTTP 요청을 보낸다.
- 1. 이때, 클라이언트와 서버 간에 안전하게 데이터를 주고받기 위해 TCP 연결이 맺어진다.
- 2. TCP 연결은 3-way-handshake를 통해 맺어진다.
- 서버는 응답을 내려줄 데이터를 계산한다.
- 계산된 데이터를 클라이언트로 응답을 보낸다.
- 응답 후 클라이언트와 서버 간에 맺어진 TCP 연결은 끊어진다. 이는 HTTP의 특징인 connectionless 때문이다.
Short Polling
Short Polling 방식은 클라이언트에서 서버로 주기적인 요청을 보내는 것이다. 예를 들면, 클라이언트가 30초 간격으로 요청을 보내어 서버로부터 응답을 받는다. 그러나 한 가지 문제점이 있다면 서버가 내려줄 응답이 없음에도 클라이언트는 계속 요청을 보낸다는 것이다. 또한 서버에서 이벤트가 발생하였을 때, 실시간으로 응답을 내려주는 것이 아니라 클라이언트에서 요청을 해야 응답을 내려준다.
단점
- 불필요한 HTTP 요청이 발생한다.
- 실시간 통신 애플리케이션에는 적절하지 않다.
Long Polling
클라이언트는 HTTP 요청을 통해 서버에 데이터를 요청한다. 이때, Short Polling과는 달리 Long Polling에서는 서버가 즉시 응답을 내려주지 않는다. 클라이언트와 서버가 TCP 연결을 맺은 상태에서 서버에서 이벤트가 발생할 때까지 기다린다. 서버에서 이벤트가 발생하면 이미 맺어진 TCP 연결을 통해 즉시 응답을 내려줄 수 있다. 그러나 Long Polling 방식은 클라이언트와 서버가 TCP 연결 상태를 유지하기 때문에, 서버로부터 응답을 받을 때까지 연결이 지속된다. 서버가 응답을 내려주거나 연결 시간 초과(timeout)이 발생할 때까지 연결이 끊어지지 않는다.
단점
- 클라이언트와 서버가 TCP 연결을 맺고 이를 유지하는 동안 서버는 대기 상태로 유지한다. 동시에 많은 클라이언트가 접속할 경우 서버의 자원(CPU, 메모리)이 많이 소모된다.
- 서버에서 이벤트가 발생하지 않는 경우에도 클라이언트와 서버 간에 연결이 맺어져 있기 때문에 불필요한 연결 비용이 발생한다.
- ex) 채팅 애플리케이션에서는 Long Polling 방식이 적절하지 않을 수 있다. 사용자 간에 채팅이 발생하지 않더라도 TCP 연결을 계속 유지해야 한다. 이는 서버의 자원을 계속 소모하게 되므로 클라이언트가 많아질수록 서버 부하가 늘어난다.