"HTTP 성능의 오래된 기본기는 여전히 강해. 본문은 필요할 때 압축하고, 이미 맺은 연결은 버리지 말고 재사용해. 둘 다 전송 계층에서 협상되므로 애플리케이션 코드에는 잘 드러나지 않지만, 설정이 빠지면 비용은 곧바로 드러나."
콘텐츠 압축 — 헤더로 협상하고 투명하게 해제하기
HTTP 본문 압축은 두 헤더로 협상해.
Accept-Encoding(요청) — 클라이언트가 해제할 수 있는 콘텐츠 인코딩 목록이야. 예를 들면gzip, br, zstd, identity가 있어.Content-Encoding(응답) — 서버가 실제 응답 본문에 적용한 인코딩을 알려 줘.
브라우저는 지원하는 Accept-Encoding을 보내고, 서버나 CDN은 그중 제공 가능한 표현을 골라 본문을 압축해. 클라이언트는 대개 응답을 투명하게 해제하므로 애플리케이션은 디코딩된 내용을 보게 돼. 인코딩에 따라 본문이 달라진다면 캐시에는 Vary: Accept-Encoding도 필요해.
현재 널리 쓰이는 알고리즘은 이 셋이야.
- gzip — 지원 범위가 넓고 인코딩과 디코딩이 빠른 편이야. 텍스트의 반복 정도와 설정에 따라 크기를 크게 줄일 수 있어 안전한 기본 선택으로 자주 쓰여.
- Brotli (br) — 텍스트에서 gzip보다 더 작은 결과를 만들 수 있고 디코딩 속도도 실용적이야. 다만 높은 품질의 인코딩은 CPU 비용이 커서 정적 자산 사전 압축에 특히 잘 맞아.
- Zstandard (zstd) — 중간 압축 수준에서 속도와 압축률의 균형이 좋아. HTTP 콘텐츠 인코딩 지원은 늘고 있지만 모든 클라이언트와 중간 장치가 지원한다고 가정하면 안 돼.
정적 자산은 사전 압축, 동적 응답은 요청별 압축
인코딩 비용은 한 번 치르는지 요청마다 치르는지에 따라 의미가 달라져.
- 정적 자산 — 빌드 단계에서 높은 품질의 Brotli로 미리 압축하고, Accept-Encoding 협상 결과에 따라 .br 파일을 제공할 수 있어. 한 번 쓴 CPU 비용을 많은 요청에 나누는 방식이야.
- 동적 응답 — 중간 품질의 gzip이나 Brotli(level 4-6)를 요청마다 적용해. 어느 크기부터 이득인지는 응답 내용, CPU 여유, 네트워크 비용에 따라 달라지므로 ~1KB 같은 임계값은 출발점일 뿐 측정으로 조정해야 해.
JPEG, WebP, 동영상, .tar.gz처럼 이미 압축된 콘텐츠는 다시 압축해도 거의 줄지 않아. CPU만 쓰고 결과가 더 커질 수도 있으니 보통 제외해.
연결 유지 — 이미 맺은 연결 재사용하기
HTTP/1.0의 기본 동작은 응답마다 TCP 연결을 닫는 방식이었어. 새 연결에는 TCP 핸드셰이크가 필요하고, HTTPS라면 TLS 협상 비용도 더해져. 자산마다 새 연결을 순차적으로 만든다면 왕복 시간이 계속 누적돼. 실제 브라우저는 여러 연결을 병렬로 열어 완화하지만, 핸드셰이크 비용과 연결 수 제한 자체는 남아.
HTTP/1.1은 지속 연결이 기본이고, 오래된 구현에서는 Connection: keep-alive로 이를 명시하기도 해. 응답 뒤 연결을 열어 두면 후속 요청이 같은 TCP와 TLS 세션을 재사용할 수 있어. 절약량은 RTT, TLS 버전, 서버 처리 시간, 연결 풀 동작에 따라 달라지므로 고정된 밀리초로 단정하지 말고 새 연결과 재사용 연결을 같은 조건에서 측정해야 해.
HTTP/2는 한 연결에 여러 동시 스트림을 다중화해 연결 재사용의 범위를 넓혀. HTTP/3는 QUIC 위에서 스트림별 전송과 연결 이동을 지원해, 조건이 맞으면 휴대폰이 Wi-Fi와 셀룰러망 사이를 오갈 때도 연결을 이어 갈 수 있어.
연결 관리의 함정
1. 모든 응답에 Connection: close를 보내기. 오래된 서버나 프록시가 요청마다 Connection: close를 보내면 클라이언트는 후속 요청에 연결을 재사용할 수 없어. 중간 장치까지 포함해 누가 헤더를 붙이는지 찾아야 해.
2. 유휴 연결을 너무 오래 유지하기. 지속 연결은 서버의 소켓과 메모리를 사용해. 서버와 프록시의 keep-alive timeout, 클라이언트 연결 풀 크기를 실제 요청 간격과 동시 접속 수에 맞춰 조정해.
3. TLS 세션 재개를 놓치기. 연결을 재사용하지 못해 새 연결이 필요하더라도 TLS 세션 재개가 가능하면 협상 비용을 줄일 수 있어. TLS 1.3 설정과 세션 티켓 정책이 실제로 동작하는지 확인해.