본문 바로가기

카테고리 없음

헤더/쿠키 다이어트: 전송 바이트 줄여 TTFB 개선하기

TTFB는 왕복 지연, 서버 대기, 첫 바이트 송신까지의 합입니다. 같은 인프라에서도 TTFB가 길게 느껴진다면 요청과 응답의 메타데이터가 실제 콘텐츠보다 무겁기 때문인 경우가 많습니다. 헤더와 쿠키를 정리하면 코드 대수술 없이도 효과가 잘 나타납니다. 아래는 이전 구조를 유지하면서 한 단계 더 깊게 확장한 가이드입니다.

1) 왜 헤더/쿠키가 TTFB를 늘리나

요청이 크면 첫 패킷 하나에 담기지 못해 분할되고, 손실·재전송 시 지연이 기하급수적으로 커집니다. TLS 핸드셰이크 직후의 초기 혼잡 윈도우에선 작은 바이트 차이가 곧바로 추가 왕복으로 이어질 수 있습니다. 서버 입장에서도 큰 헤더는 파싱·검증·정규식 매칭 경로를 길게 만들고, 보안 모듈이 검사해야 할 표면을 늘립니다. 특히 모든 API 호출에 긴 쿠키가 자동으로 동승하면 RTT마다 불필요한 바이트가 반복되어 모바일 네트워크에서 체감이 크게 나빠집니다.

2) 먼저 측정: 어디서 바이트가 새는지

브라우저는 DevTools의 Size, Headers 패널, HAR 내 total header size를 기준으로 상위 무거운 라우트를 찾습니다. 서버·프록시에서는 샘플링 로그에 요청 헤더 길이, 쿠키 합계 길이, 응답 헤더 길이를 임시로 기록해 p50·p95 기준 상위 10개를 뽑습니다. 이때 메소드·경로·유저에 따라 분포가 다르므로, 경량 조회·인증·업로드를 분리해 봅니다. 대시보드에는 요청/응답 헤더 크기 p50·p95, 쿠키 합계 길이 p50·p95, TTFB, 패킷 수, 재전송률을 고정 노출해 변화가 바로 보이게 합니다.

3) 쿠키 다이어트 원칙 6가지

범위 축소는 가장 즉효입니다. Domain을 최상위에 두면 서브도메인 전체로 전파되니 필요한 서브도메인으로 내리고, Path도 최소 경로로 제한합니다. 수명은 기능에 맞춰 짧게 잡아 자동으로 사라지게 하고, 가능하면 세션 쿠키로 대체합니다. 크기는 단일 512B, 전체 2kB 내외를 목표로 하며 JSON 구조체를 그대로 싣는 관행을 금지합니다. SameSite=Lax·Strict로 교차 사이트 전송을 줄이고, 자격 증명이 필요 없는 요청은 프런트에서 credentials를 omit으로 둡니다. 분석·광고 식별자는 쿠키 대신 localStorage나 서버 발급 익명 토큰으로 옮기고, 비콘 요청으로 분리해 기본 API에 동승하지 않게 만듭니다. 민감 쿠키는 Secure·HttpOnly를 적용해 범위를 명확히 하고, 조건부로만 발급되게 해 불필요한 Set-Cookie 반복을 막습니다.

4) 요청 헤더 다이어트 포인트

조직마다 X-로 시작하는 커스텀 헤더가 쌓여 있는 경우가 많습니다. 실제로 라우팅·감사에 필요한 최소 목록을 화이트리스트로 정의해 나머지를 제거합니다. Accept/Accept-Language는 기본값이 과도하게 길어지는 대표 사례라 서버가 실제 한두 포맷만 지원한다면 클라이언트에서 명시 축소하는 편이 낫습니다. User-Agent 파싱 의존은 버전 편차와 길이 모두에 취약하니 기능 플래그 전용 헤더로 교체합니다. Authorization은 JWT 길이가 과도하면 매 호출의 바이트 부담이 커지므로 모바일·웹에선 짧은 불투명 토큰 + 서버 조회로 전환하거나, 경로 제한 쿠키 전략으로 바꾸어 특정 API에만 전송되게 설계합니다. 프록시에서는 최대 헤더 크기를 합리적으로 두어 이상치가 조용히 성능을 망치지 않도록 조기 차단합니다.

5) 응답 헤더 다이어트 포인트

Vary는 캐시 적중률을 좌우합니다. 꼭 필요한 항목만 남기고 User-Agent, Accept-Language를 무분별하게 추가하지 않습니다. 정적 자산·이미지는 절대 Set-Cookie를 내리지 않고, 동적 응답도 조건이 충족될 때만 발급해 반복 전송을 막습니다. 보안 헤더는 중복·구버전을 정리해 핵심만 유지하고, Server·X-Powered-By 노출은 제거합니다. ETag·Cache-Control은 캐시 키 폭발을 막는 방향으로 통일해 캐시 미스로 인한 추가 RTT를 줄입니다.

6) 프런트엔드 전략: 기본을 바꿔라

API 클라이언트의 기본 옵션에서 credentials: "omit"을 채택하고, 필요한 엔드포인트에만 include로 올립니다. 분석·로그는 navigator.sendBeacon이나 전용 CORS 엔드포인트로 분리해 비동기 전송하고, API 요청에 태우지 않습니다. 헤더는 모듈 차원에서 화이트리스트를 두고, 전역 인터셉터에서 불필요 항목을 걸러냅니다. SPA 라우팅 전환 시에도 초기 문서 요청에 불필요한 쿠키가 딸려가지 않게 도메인·경로를 다듬습니다. 이미지·폰트 프리로드에 과한 교섭 헤더를 붙이지 않도록 정적 리소스 요청을 별 클라이언트로 분리하는 것도 실전에서 효과적입니다.

7) 백엔드/리버스 프록시 설정 팁

NGINX는 more_clear_headers로 Server류 헤더를 제거하고, large_client_header_buffers로 이상치 헤더 폭주를 방지합니다. proxy_set_header 화이트리스트를 재정의해 상류가 보내는 X-헤더 남용을 줄입니다. Envoy는 request/response_headers_to_remove 목록과 헤더 수정 필터로 라우트별 정리를 자동화하고, 샘플링 로그에서 헤더 길이 이상치를 경보로 올립니다. HAProxy는 http-request del-header, acl 기반 차단으로 경로별 장문 헤더를 걸러내며, http-reuse safe로 커넥션 재사용률을 올려 헤더 전송 변동성을 낮춥니다.

8) 인증/세션 설계 리팩터링

JWT는 클레임을 줄이고 압축을 고민하기 전에 토큰 전략 자체를 점검합니다. 서버 측 인트로스펙션으로 전환하면 토큰은 짧아지고, 캐시된 권한 정보로 조회 부하를 줄일 수 있습니다. 쿠키를 선택한다면 도메인·경로를 세분화해 문서와 API가 서로의 쿠키를 싣지 않도록 하고, 민감 트랜잭션은 별도의 짧은 수명 쿠키로 분리합니다. 권한·세션 데이터는 쿠키가 아니라 서버 캐시에 두고, 요청은 키만 전달하는 방식이 전송 바이트와 파싱 비용을 동시에 줄입니다.

9) 성능 효과를 수치로 보는 방법

A/B 실험은 동일 요일·시간대 기준으로 24시간 전후를 비교합니다. 핵심 지표는 p50·p95 TTFB, 요청 헤더 크기 p50·p95, 쿠키 합계 길이 p50·p95, 응답 헤더 크기, 패킷 수, 재전송률, 캐시 히트율, 서버 CPU sys%입니다. 모바일 네트워크 세그먼트를 따로 분리해 효과를 더 선명히 보세요. 임계는 p95 TTFB 10% 개선, 헤더/쿠키 p95 30% 축소, 패킷 수 감소, 에러율·타임아웃 비악화로 정의해 자동 승급 기준으로 사용합니다.

10) 단계별 체크리스트

상위 무거운 헤더/쿠키를 목록화하고 담당 팀·목적·보관 주체를 붙입니다. 쿠키는 도메인/경로 축소, 만료 단축, SameSite 적용, 크기 목표를 명시합니다. 요청 헤더는 Accept·Accept-Language·X-*·Authorization을 우선 정리하고, 응답은 Vary 최소화·조건부 Set-Cookie·보안 헤더 정비를 진행합니다. 프런트 기본값과 비콘 분리를 적용하고, 프록시에서 제거·상한 정책을 켭니다. 마지막으로 p95 TTFB·헤더 바이트·쿠키 길이·캐시 히트율을 A/B로 검증합니다.

11) 예시로 보는 전후 비교

정적 페이지와 API가 같은 최상위 도메인을 공유해 모든 요청에 3.2kB 쿠키가 실리던 사례에서, API 서브도메인 분리와 Path 제한으로 평균 600B로 줄였고, JWT 1.6kB를 32B 불투명 토큰으로 바꾸어 인트로스펙션 캐시를 도입했습니다. Accept는 application/json으로, Vary는 Accept만 남기고 UA·언어를 제거했습니다. 결과적으로 4G 환경에서 p50 TTFB 12~15%, p95 18~22% 개선, 패킷 수는 초기 요청 기준 2→1로 안정화, 서버 sys%는 5포인트 하락했습니다. 장애나 보안 사고 없이 트래픽 피크에서도 효과가 유지되었습니다.

마무리

헤더/쿠키 다이어트는 전송할 바이트 자체를 줄여 네트워크·파싱·캐시 전 과정을 가볍게 만듭니다. 범위와 수명을 줄이고, 불필요한 전송을 차단하며, 프런트 기본값과 프록시 가드로 지속 가능한 상태를 만들면 TTFB는 빠르게 안정됩니다. 오늘은 상위 10개 무거운 항목을 뽑고, 내일은 쿠키 범위·만료·SameSite부터 손대 보세요. 이어서 Accept/언어·Vary를 정리하면 그래프가 눈에 띄게 내려갈 것입니다.