HTTP Keep-Alive로 TCP 연결 비용 줄이기

HTTP Keep-Alive의 연결 재사용 방식과 TCP 오버헤드, HTTP 버전별 설정, 서버 운영 시 확인할 사항을 정리합니다.

2026-08-14 · 최초 발행 2025-08-10

요청마다 새 연결을 만들던 HTTP

초기 HTTP/1.0에서는 요청 하나가 TCP 연결 하나와 대응했다. 클라이언트는 요청할 때마다 연결을 수립하고, 응답을 받은 뒤 연결을 종료하는 순서를 반복했다.

ServerClientServerClient첫 번째 요청두 번째 요청 - 전체 과정 반복TCP SYNTCP SYN+ACKTCP ACK (연결 수립)HTTP RequestHTTP ResponseTCP FINTCP ACKTCP FINTCP ACK (연결 종료)

이 방식은 단순하지만, HTML과 CSS, JavaScript, 이미지처럼 여러 리소스를 함께 받는 페이지에서는 연결을 반복하는 비용이 누적된다.

TCP 연결을 반복할 때 생기는 부담

새 연결마다 3-way handshake와 4-way handshake가 뒤따른다. 3-way handshake에는 최소 1.5 RTT(Round Trip Time)가 소요되며, 서버는 연결 관리에 CPU와 메모리를 사용한다. 실제 데이터 외에도 연결 관리 패킷이 늘어나고, 새 연결은 전송 속도가 낮은 상태에서 TCP slow start를 다시 시작한다.

하나의 연결을 여러 요청에 쓰는 방식

HTTP/1.1부터 기본적으로 지원되는 Keep-Alive는 최초에 TCP 연결을 수립한 뒤, 여러 HTTP 요청과 응답을 같은 연결에서 주고받는다. 요청이 없는 상태가 일정 시간(timeout) 이어지면 연결을 종료한다.

ServerClientServerClient타임아웃 발생TCP SYNTCP SYN+ACKTCP ACK (연결 수립)HTTP Request 1HTTP Response 1HTTP Request 2HTTP Response 2HTTP Request 3HTTP Response 3TCP FINTCP ACKTCP FINTCP ACK (연결 종료)

HTTP 버전별 연결 제어

HTTP/1.0에서는 연결 유지 의사를 요청에 명시한다.

GET /index.html HTTP/1.0
Connection: Keep-Alive

서버는 다음과 같이 응답할 수 있다.

HTTP/1.0 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100

HTTP/1.1에서는 Keep-Alive가 기본적으로 활성화되어 있으며, 연결을 닫으려면 다음 헤더를 명시한다.

Connection: close

Apache에서는 연결 유지, 연결당 최대 요청 수, 타임아웃을 다음처럼 설정할 수 있다.

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

Nginx 설정 예시는 다음과 같다.

keepalive_timeout 65;
keepalive_requests 100;

성능과 자원 사용에 미치는 영향

연결 설정과 해제에 드는 작업을 줄이면 페이지 로드 시간이 단축될 수 있으며, 30-50% 성능 향상이 가능하다. 서버는 연결 관리에 쓰던 CPU와 메모리 자원을 아낄 수 있고, 불필요한 TCP 패킷 감소는 네트워크 대역폭 사용에도 영향을 준다. 연결이 유지되므로 TCP slow start 문제를 줄이고 혼잡 제어 알고리즘을 더 효율적으로 활용할 수 있다.

대형 전자상거래 사이트 사례에서는 Keep-Alive를 적용하지 않았을 때 평균 페이지 로드 시간이 3.2초였고, 적용 후에는 1.8초로 약 44% 개선됐다. 서버 리소스 사용률은 약 15% 감소했다.

연결 유지와 사용자 상태는 다른 문제다

HTTP의 무상태성은 Keep-Alive로 해결되는 문제가 아니다. Keep-Alive는 연결 수준의 지속성을 제공할 뿐이며, 로그인 정보 같은 사용자 상태는 별도 방식으로 관리해야 한다. 클라이언트 측 데이터를 저장하는 쿠키와 서버 측 데이터를 저장하고 세션 ID를 쿠키로 전달하는 세션이 여기에 해당한다.

연결 레벨애플리케이션 레벨클라이언트 저장서버 저장HTTP 연결 지속성Keep-Alive상태 관리CookieSession

운영 설정에서 확인할 지점

타임아웃이 지나치게 길면 서버 자원을 낭비할 수 있고, 너무 짧으면 연결 재사용의 이점이 줄어든다. 메모리 누수를 막기 위해 연결당 최대 요청 수를 제한해야 하며, 많은 Keep-Alive 연결이 서버 자원을 점유할 수 있다는 점도 고려해야 한다. 프록시나 로드밸런서가 Keep-Alive를 지원하는지도 함께 확인할 대상이다.

HTTP/2와 HTTP/3의 연결 관리

HTTP/2는 멀티플렉싱(Multiplexing)으로 하나의 TCP 연결에서 여러 요청을 병렬 처리한다. HTTP/3는 QUIC 프로토콜을 기반으로 UDP를 사용해 TCP 연결 설정에 따른 오버헤드를 더 줄인다.

연결당 1요청Keep-Alive멀티플렉싱QUIC/UDPHTTP/1.0비효율적인 TCP 사용HTTP/1.1연결 재사용HTTP/2단일 연결에서 병렬 요청HTTP/3연결 설정 오버헤드 최소화

Keep-Alive는 응답 시간, 서버 자원 효율성, 네트워크 사용률에 영향을 주는 웹 성능 최적화의 기본 요소다. 연결 유지의 동작과 설정값이 미치는 범위를 이해하면 시스템 최적화와 문제 해결에서 판단 근거를 세울 수 있다.

HTTPKeep-AliveTCP웹 성능네트워크