HTTP Cache

HTTP 캐싱은 웹 성능 최적화의 핵심 기술로, 네트워크 트래픽 감소, 응답 시간 단축, 서버 부하 경감을 목표로 한다.

HTTP 캐싱은 성능비용 효율성을 극대화하는 필수 기술이다. 적절한 Cache-Control 설정과 검증 메커니즘을 통해 현명하게 활용해야 한다.
캐시 전략은 애플리케이션 특성(정적/동적 비율, 업데이트 주기)에 맞게 설계하고, 지속적인 모니터링으로 최적 상태를 유지하는 것이 핵심이다.

캐싱 기본 원리

캐시 동작 프로세스

  1. 초기 요청: 클라이언트가 리소스(이미지, CSS, JS)를 요청하면 서버는 Cache-Control 헤더와 함께 응답한다.
1
2
3
4
HTTP/2.0 200 OK
Cache-Control: max-age=3600
Content-Type: image/png
...
  1. 캐시 저장: 브라우저는 응답을 메모리/디스크 캐시에 저장한다.

    • 메모리 캐시: 빠르지만 브라우저 종료 시 삭제
    • 디스크 캐시: 지속적 저장 (e.g., public 리소스)
  2. 재요청 시:

    • 유효 시간 내: 캐시에서 직접 제공 (Cache Hit)
    • 유효 시간 초과: 서버에 검증 요청 (Cache Miss) → 304 Not Modified 또는 새 데이터 수신

캐시 유형 분류

  1. 저장 위치 기준
유형저장 위치예시특징
브라우저 캐시클라이언트Chrome Disk Cache개인 전용, private 지시어
프록시 캐시중간 서버CDN (Cloudflare, Akamai)다수 사용자 공유, public
게이트웨이 캐시서버 앞단Nginx, Varnish서버 부하 분산
  1. 접근 권한 기준
    • Private Cache: 사용자별 개인 데이터 (e.g., Authorization 헤더 포함 응답)
    • Shared Cache: 다수 사용자 공유 (e.g., CDN의 정적 자원)

핵심 HTTP 헤더

HTTP/1.1부터는 Cache-Control 헤더를 통해 캐시 동작을 세밀하게 제어할 수 있다.

헤더설명예시
Cache-Control캐시 동작 지정Cache-Control: max-age=3600
Expires만료 일시 지정Expires: Wed, 21 Oct 2024 07:28:00 GMT
ETag리소스 버전 식별자ETag: "33a64df551425fcc55e4"
Last-Modified마지막 수정 시간Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT

Cache-Control

지시어의미예시
max-age=3600캐시 유효 시간 (초)max-age=86400 (24시간)
s-maxage=3600공유 캐시 유효 시간 (초)s-maxage=3600
no-store캐시 저장 금지 (민감 정보)금융 거래 페이지
no-cache항상 서버 검증 필요no-cache
public공유 캐시 저장 허용CDN 호환 리소스
private브라우저 전용 저장개인화 데이터
must-revalidate만료 시 반드시 서버 검증중요한 업데이트 자원

검증 헤더

1
2
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
1
2
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT

캐싱 전략

전략설명사용 사례
강한 캐싱max-age + immutable정적 자원 (이미지, 폰트)
검증 캐싱no-cache + ETag자주 변경되는 JSON API
조건부 캐싱max-age + must-revalidate중요한 업데이트 (e.g., CSS)

강한 캐싱 (Strong Caching)

적용 예시: 해시가 포함된 정적 이미지

1
2
3
4
HTTP/2 200 OK
Cache-Control: public, max-age=31536000, immutable
Content-Type: image/webp
ETag: "d41d8cd98f00b204e9800998ecf8427e"
사용처

검증 캐싱 (Validation Caching)

적용 예시: 실시간 주식 가격 API

1
2
3
4
5
6
HTTP/2 200 OK
Cache-Control: no-cache
ETag: "a3fWa"
Content-Type: application/json

{"stock": "AAPL", "price": 189.32}
1
2
3
4
GET /api/stock/AAPL HTTP/2
If-None-Match: "a3fWa"

HTTP/2 304 Not Modified
사용처

조건부 캐싱 (Conditional Caching)

적용 예시: 글로벌 CSS 파일

1
2
3
4
5
6
7
HTTP/2 200 OK
Cache-Control: max-age=600, must-revalidate
Last-Modified: Wed, 21 Oct 2026 07:28:00 GMT
Content-Type: text/css

/* main.css */
body { margin: 0; }
1
2
3
4
GET /css/main.css HTTP/2
If-Modified-Since: Wed, 21 Oct 2026 07:28:00 GMT

HTTP/2 304 Not Modified
사용처

전략 선택 가이드

기준강한 캐싱검증 캐싱조건부 캐싱
변경 빈도거의 없음매우 잦음중간
무효화 방법URL 변경ETag/Last-Mod시간 기반
트래픽 절감최대(100%)중간(304 활용)높음
적용 난이도쉬움복잡함중간

최적화 팁:

  • 정적 자원은 immutable + 해시 파일명 조합 권장
  • API 응답에 stale-while-revalidate로 백그라운드 갱신 가능
1
Cache-Control: max-age=3600, stale-while-revalidate=300

캐시 무효화 메커니즘

  1. 수동 무효화
    • 브라우저: Ctrl + F5 (강력 새로고침) → Cache-Control: no-cache
    • CDN: 퍼지(Purge) API 호출
  2. 자동 무효화
    • 파일 이름 해싱: style.[hash].css
    • 쿼리 파라미터: ?v=2 (구식, 권장되지 않음)

캐싱 장단점

장점

단점

고급 기법

Vary 헤더

1
  Vary: Accept-Encoding, Accept-Language

Service Worker 캐싱

모니터링 및 최적화

도구

최적화 체크리스트

  1. 정적 자원은 immutable 사용
  2. 동적 컨텐츠는 no-cache + 검증 헤더
  3. CDN에 s-maxage 설정
  4. ETag 대신 Last-Modified 사용 자제 (정밀도 낮음)

자주 발생하는 문제와 해결

문제원인해결 방법
캐시가 안됨잘못된 캐시 설정Cache-Control 헤더 확인
오래된 컨텐츠 제공캐시 만료 설정 부적절적절한 max-age 설정
용량 문제과도한 캐시 저장캐시 정책 최적화

HTTP 캐싱을 구현할 때 주의해야 할 주요 사항


참고 및 출처