Network

[러닝 HTTP/2] 3. 웹을 파헤치는 이유와 방법

noahkim_ 2025. 3. 30. 00:10

스티븐 루딘, 하비에르 가르사 님의 "러닝 HTTP/2" 책을 정리한 글입니다.


1. 오늘날의 성능 문제

  • 페이지 내 수 백개의 개체, 수천 개의 도메인, 변동이 심한 네트워크, 광범위한 디바이스 기능이 존재하는 환경
  • 일관되고 빠른 웹 경험을 만들어 내는것은 쉬운 일이 아님
  • 사용자와의 상호작용을 원활하게 하기 위해 웹 페이지 렌더링 단계마다 내재된 문제를 이해하는것이 필요함

 

웹 페이지의 요청 과정

  • 브라우저에서 링크를 클릭해서 웹 페이지가 표시될 때까지 일어나는 일을 이해하는 것이 중요
  • 브라우저는 웹 페이지에 필요한 모든 정보를 반복적으로 요청하는 방식으로 일함

 

fetching
단계 설명
1️⃣ Fetch Queue 추가 가져올 URL을 fetch queue에 push
2️⃣ DNS 조회 호스트 이름(IP 주소) 조회
3️⃣ TCP 연결
호스트로 TCP 연결 시도 (HTTPS인 경우 TLS 핸드셰이크 포함)
4️⃣ 요청 전송 웹 서버로 요청(Request) 전송

 

parsing & rendering
단계 설명
1️⃣ 응답 수신 서버로부터 응답(Response) 받기
2️⃣ HTML 파싱 HTML 문서 분석
3️⃣ Fetching 요청 시작
CSS, JS, 이미지 등 추가 리소스 요청 (우선순위 고려)
4️⃣ 렌더링 시작 필수 개체 다운로드 완료 후 화면 그리기 시작
5️⃣ 렌더링 반복
추가 개체 다운로드 완료 시, 화면 업데이트 반복
  • 이러한 반복적인 절차는 네트워크와 디바이스에 부담을 줌
  • 최적화와 성능 튜닝이 필요함

 

중요 지표
성능 요소 설명
지연 시간 (Latency)
IP 패킷이 한 지점에서 다른 지점으로 이동하는 데 걸리는 시간. 성능의 주요 병목점.
왕복 시간 (RTT)
요청이 전송되고 응답이 돌아오는 데 걸리는 시간.
대역폭 (Bandwidth)
네트워크가 초당 전송할 수 있는 최대 데이터 양.
DNS Lookup
도메인 네임을 IP 주소로 변환하는 과정. 호스트 이름당 한 번만 수행됨.
연결 시간
TCP 연결을 설정하는 시간 (3-way Handshake).
TLS 협상 기간
HTTPS 요청 시 TLS 암호화가 설정되는 시간.
TTFB (Time To First Byte)
클라이언트가 페이지 탐색을 시작한 후 서버의 첫 번째 바이트를 받을 때까지 걸리는 시간.
콘텐츠 다운로드 시간 페이지 콘텐츠가 다운로드되는 시간.
렌더링 시작 시간
브라우저가 처음으로 화면에 콘텐츠를 그리기 시작하는 시간.
문서 완성 시간
웹 페이지의 DOMContentLoaded 이벤트가 발생하는 시점.

 

성능 저하 요인
요인 설명
바이트 수 증가
전송되는 데이터의 크기가 커질수록 성능 저하.
개체 수 증가
웹 페이지 내 이미지, 스크립트, 스타일시트 등 개수가 많을수록 요청이 증가하여 성능 저하.
복잡도 증가
웹 페이지의 구조가 복잡해질수록 렌더링 속도가 느려짐.
호스트 수 증가
요청해야 할 도메인이 많아질수록 DNS Lookup 및 연결 시간이 증가하여 성능 저하.
TCP 소켓 수 증가
호스트 수 증가로 인해 동시에 열려 있는 TCP 연결 수가 많아지면 네트워크 병목 발생 가능.

 

HTTP/1.0의 문제점

문제 설명 주요 원인 영향
HOL 블로킹
(Head-of-Line Blocking)
HTTP/1은 파이프라이닝을 지원하지만,
응답이 순서대로 도착해야 함
요청 순서대로 응답을 받아야 하므로,
앞선 요청이 지연되면 뒤 요청도 대기
페이지 로딩 지연
TCP의 비효율적 사용 TCP 혼잡 제어는 공평한 트래픽 처리를 위해 설계됨 최적의 혼잡 윈도우 크기를 얻으려면 여러 번의 왕복이 필요함 전송 속도 저하
비대한 메시지 헤더 HTTP/1은 메시지 헤더를 압축하지 않음 요청 헤더 크기가 커서 불필요한 데이터 전송 증가
대역폭 낭비
속도 저하
제한적인 우선순위 지정 개체 간 우선순위를 설정할 수 있는 옵션이 제한적 중요하지 않은 개체도 대기 상태로 빠짐
중요한 리소스 로딩 지연
서드파티 개체 문제 웹 페이지에는 제어 불가능한 외부 리소스(서드파티 개체)가 포함됨 외부 리소스가 느리면 전체 페이지 로딩이 지연됨 성능 저하

 

2. 웹 성능 기법 

<!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}-->

연도 주요 인물/기업 내용
2000년대 초 스티브 사우더스 웹 브라우저에서 웹 페이지 로딩 속도를 높이는 기법을 제시
웹 사이트 최적화 기법을 정리한 『초고속 웹사이트 구축』 저술
2010년 구글 성능이 비즈니스에 미치는 영향을 연구
성능을 URL 순위 선정의 주요 파라미터로 추가하여 검색 랭킹에 반영

 

웹 성능 모범 사례

카테고리 모범 사례 설명 및 최적화 방법
DNS 조회 최적화
고유한 도메인/호스트 수 제어 불필요한 DNS 조회를 줄여 지연 시간 감소
조회 지연 시간 줄이기 도메인 이름을 캐싱하여 재사용
rel="dns-prefetch" 활용 미리 DNS 조회 수행하여 페이지 로딩 속도 개선
TCP 연결 최적화
rel="preconnect" 활용 필요한 호스트에 미리 연결을 수립하여 TCP/TLS 핸드셰이크 단축
조기 종료 사용 (CDN 활용) 데이터가 가까운 위치에서 제공되도록 설정
TLS 모범 사례 적용 최신 TLS 버전 사용, 세션 재사용 활성화
리다이렉션 최소화
리다이렉션 사용 자제 불필요한 추가 연결 방지
CDN 활용 클라우드에서 리다이렉션 수행하여 성능 최적화
서버의 Rewrite Rules 활용 동일한 호스트에서 리다이렉션을 최소화
클라이언트 캐싱
Cache-Control의 max-age, Expires 설정 요청 횟수 감소 및 성능 개선
적절한 TTL 설정 정적 콘텐츠는 길게, 동적 콘텐츠는 세션 시간 2배 정도 캐싱
네트워크 경계에서 캐싱
CDN 활용 여러 사용자가 동일한 캐시를 활용 가능
민감한 데이터 캐싱 금지 개인정보 및 실시간 데이터는 캐싱하지 않음
조건부 캐싱
If-Modified-Since 활용 콘텐츠가 변경되지 않았을 경우 304 응답 반환
ETag 활용 개체 변경 여부를 엔티티 태그를 통해 판별
압축과 축소화
Gzip, Brotli 활용 텍스트 콘텐츠 크기 최대 90%까지 압축 가능
CSS/JS 축소화 불필요한 공백, 주석 제거로 파일 크기 감소
CSS/JS 차단 피하기
CSS는 문서의 <head>에 배치 초기 렌더링이 차단되지 않도록 최적화
JS의 async 속성 사용 실행 순서가 중요하지 않을 때 병렬 다운로드
JS의 defer 속성 사용 실행 순서가 중요하지만, DOM 로딩 이후 실행 가능할 때 사용
이미지 최적화
불필요한 오버로딩 방지 화면보다 큰 이미지 불필요하게 줄이지 않도록 설정
메타데이터 제거 파일 크기 감소 및 성능 최적화

 

조건부 캐싱
  • 클라이언트가 서버에 그 개체가 변경되었으면 보내주고, 그렇지 않으면 그냥 동일하다 알려달라 요청하는 기능
    • 캐시 TTL이 만료되면, 클라이언트는 서버에 요청을 보냄
    • 대부분 그 응답은 캐싱된 사본과 동일할 것이므로, 조건부 기능을 활용함
  • 자주 변경되지 않지만, 최신 버전을 사용해야 할 경우 사용

 

JS 차단 피하기
  • JS는 기본적으로 HTML 내의 코드가 위치한 지점에서 반입되어 파싱되고 실행됨
  • 브라우저는 이 작업이 끝날 때까지 자원 다운로드 및 렌더링이 차단됨
  • 기본적인 차단 동작은 대게 불필요한 지연을 발생시키고 단일 장애점을 유발할 수 있음
    • 경우에 따라 차단을 푸는것이 성능상 좋을 수 있음

 

안티 패턴

기법 설명 HTTP/2 영향
스프라이팅 여러 개의 작은 이미지를 하나의 큰 이미지로 통합
한 번의 요청으로 처리
병렬 요청이 가능한 HTTP/2에서는 불필요
샤딩 여러 개의 호스트 이름을 사용하여 다중 연결을 열기
병렬 다운로드 수행
HTTP/2에서는 샤딩 해제 과정이 번거로움.
대신 공통 인증서를 활용한 연결 수립 수 감소가 유리
쿠키 없는 도메인 HTTP/1에서는 쿠키 크기를 줄이기 위해 쿠키가 필요 없는 정적 콘텐츠(이미지, CSS, JS 등)를 별도 도메인에서 제공
HTTP/2에서는 헤더 압축과 헤더 이력 저장이 가능하여 쿠키 없는 도메인이 불필요

 

쿠키 없는 도메인

 

  • 웹 페이지를 요청할 때 모든 요청에 쿠키가 포함됨.
    • 정적 콘텐츠(이미지, CSS, JS 등)에는 쿠키가 필요 없지만, 브라우저는 모든 요청마다 쿠키를 전송해야 했음.
    • 불필요한 데이터 전송으로 인해 네트워크 대역폭이 낭비됨.
  • 정적 콘텐츠(이미지, CSS, JS 등)를 쿠키가 없는 별도의 도메인에서 제공하여 쿠키 전송을 방지함.
    • www.example.com (쿠키 사용, 동적 콘텐츠 처리)
    • static.example.com (쿠키 없이 정적 콘텐츠 제공)