HTTP Keep-Alive란 무엇인가
웹 브라우저가 서버에 데이터를 요청할 때마다 매번 새로운 TCP 연결을 맺는다면 어떻게 될까요? 마치 편지를 한 통 보낼 때마다 우체국에 가서 새로 계약을 맺는 것과 같아서, 실제 내용을 주고받는 시간보다 연결을 준비하는 시간이 더 오래 걸릴 수 있습니다. HTTP Keep-Alive는 이런 비효율을 줄이기 위해 한 번 맺은 TCP 연결을 끊지 않고 여러 번의 요청과 응답에 재사용하는 기술입니다.
HTTP/1.0에서는 기본적으로 요청 하나당 연결 하나를 맺고 끊는 방식이었지만, HTTP/1.1부터는 별다른 설정이 없어도 Keep-Alive가 기본값으로 동작합니다. 클라이언트나 서버가 연결을 끊고 싶다면 응답 헤더에 ‘Connection: close’를 명시해야 합니다.
동작 원리와 예시
일반적인 TCP 통신은 데이터를 주고받기 전에 3-way handshake라는 과정을 거쳐 연결을 확립합니다. 이 과정 자체가 네트워크 왕복 시간(RTT)을 소모하기 때문에, 매 요청마다 연결을 새로 만들면 그만큼 지연이 누적됩니다.
예를 들어 한 웹 페이지에 이미지 10개, CSS 파일 1개, JS 파일 2개가 포함되어 있다고 가정해봅시다. Keep-Alive가 없다면 13번의 TCP 연결과 종료 과정을 각각 거쳐야 하지만, Keep-Alive를 사용하면 하나의 연결로 13개의 리소스를 순차적으로 주고받을 수 있습니다. 서버는 응답 헤더에 ‘Connection: keep-alive’와 함께 ‘Keep-Alive: timeout=5, max=100’처럼 연결을 얼마나 유지할지, 최대 몇 번의 요청을 처리할지 명시하기도 합니다.
실무에서 왜 사용하는가
Keep-Alive를 사용하면 다음과 같은 이점이 있습니다.
- 연결 수립에 드는 지연시간(latency) 감소로 전체 페이지 로딩 속도 향상
- TCP handshake와 슬로우 스타트(slow start) 반복을 줄여 서버와 클라이언트의 리소스 절약
- 다수의 소켓을 새로 열고 닫는 부담이 줄어 서버의 동시 처리 성능 향상
다만 연결을 무한정 유지하면 서버의 메모리와 소켓 자원을 낭비할 수 있으므로, 보통 nginx나 Apache 같은 웹 서버에서는 timeout 값과 최대 요청 수를 적절히 설정해 관리합니다. 실무에서는 이 값을 서비스의 트래픽 특성에 맞게 튜닝하는 것이 성능 최적화의 중요한 포인트 중 하나입니다.