전체 목록
네트워크Medium#106

HTTP 캐싱에서 Cache-Control, ETag, Last-Modified의 역할을 설명해주세요.

#HTTP#캐싱#ETag#성능

답변 포인트

캐시 수명과 캐시 검증을 나누어 생각해보세요.

정답 및 해설

빠른 요약

Cache-Control은 응답을 얼마나 오래, 어디에 저장할 수 있는지 지정하는 캐시 정책 헤더입니다. max-age, no-cache, no-store, public, private 등이 있습니다.

HTTP 캐싱은 브라우저나 CDN이 응답을 저장해두고, 같은 리소스 요청 시 네트워크 비용과 서버 부하를 줄이는 메커니즘입니다. 핵심은 얼마나 오래 재사용할 수 있는지캐시된 응답이 아직 유효한지 검증하는 방법입니다.

Cache-Control

Cache-Control은 캐시 정책을 지정하는 가장 중요한 헤더입니다.

HTTP
Cache-Control: public, max-age=31536000, immutable

자주 쓰는 지시어:

지시어의미
max-age=6060초 동안 fresh 상태로 사용
no-cache저장은 가능하지만 사용 전 서버 검증 필요
no-store저장 자체를 금지
public공유 캐시(CDN 등)에 저장 가능
private사용자별 캐시만 가능, 공유 캐시 저장 불가
immutable만료 전에는 변경되지 않는 리소스

정적 파일처럼 해시가 붙는 리소스는 길게 캐시할 수 있습니다.

HTTP
Cache-Control: public, max-age=31536000, immutable

HTML처럼 자주 바뀌는 문서는 보통 짧게 캐시하거나 검증하도록 둡니다.

HTTP
Cache-Control: no-cache

ETag

ETag는 리소스의 특정 버전을 식별하는 값입니다. 브라우저는 다음 요청에서 If-None-Match를 보내 서버에 변경 여부를 확인합니다.

HTTP
ETag: "user-list-v3"

다음 요청:

HTTP
If-None-Match: "user-list-v3"

서버가 리소스가 바뀌지 않았다고 판단하면 본문 없이 304 Not Modified를 반환합니다.

HTTP
HTTP/1.1 304 Not Modified

본문 다운로드가 없으므로 응답이 빨라집니다.

Last-Modified

Last-Modified는 리소스가 마지막으로 변경된 시간을 나타냅니다.

HTTP
Last-Modified: Tue, 05 May 2026 10:00:00 GMT

브라우저는 다음 요청에서 If-Modified-Since를 보냅니다.

HTTP
If-Modified-Since: Tue, 05 May 2026 10:00:00 GMT

서버는 이후 변경이 없으면 304 Not Modified를 반환합니다.

ETag와 Last-Modified 비교

구분ETagLast-Modified
기준리소스 버전 식별자마지막 수정 시간
정밀도높음초 단위라 한계 가능
변경 감지내용 기반 가능시간 기반
우선순위보통 더 우선보조 검증자

캐시 흐름

  1. 첫 요청에서 서버가 리소스와 캐시 헤더를 내려줍니다.
  2. max-age 내에서는 브라우저가 캐시를 바로 사용합니다.
  3. 만료되면 ETag 또는 Last-Modified로 서버에 검증합니다.
  4. 변경이 없으면 304, 변경이 있으면 새 본문과 새 헤더를 받습니다.

정리

Cache-Control은 캐시 수명과 저장 정책을 정하고, ETagLast-Modified는 캐시가 만료된 뒤 리소스가 바뀌었는지 검증합니다. 정적 자산은 긴 캐시와 파일명 해시를, HTML/API 응답은 데이터 특성에 맞는 짧은 캐시 또는 검증 전략을 사용하는 것이 일반적입니다.

HTTP 캐싱을 흐름으로 보기

HTTP 캐싱은 브라우저와 CDN이 응답을 재사용해 네트워크 비용을 줄이는 메커니즘입니다. 핵심은 “얼마나 오래 신선한가”와 “신선하지 않다면 변경 여부를 어떻게 확인할 것인가”입니다.

HTTP
Cache-Control: public, max-age=31536000, immutable

해시가 포함된 정적 파일(app.8f3a1.js)은 길게 캐시할 수 있습니다. 반면 사용자별 API 응답은 보통 짧게 두거나 캐시하지 않습니다.

ETag와 Last-Modified

HTTP
ETag: "user-123-v5"
Last-Modified: Wed, 21 May 2026 02:00:00 GMT

브라우저는 다음 요청에 조건부 헤더를 보낼 수 있습니다.

HTTP
If-None-Match: "user-123-v5"
If-Modified-Since: Wed, 21 May 2026 02:00:00 GMT

서버가 변경 없음으로 판단하면 304 Not Modified를 반환하고 본문 전송을 생략합니다.

실무 주의사항

  • 인증이 필요한 응답은 private 또는 no-store를 신중히 사용합니다.
  • 배포 파일은 파일명 해시 + 긴 TTL 조합이 안전합니다.
  • HTML 문서는 새 번들을 참조해야 하므로 너무 길게 캐시하지 않는 편이 좋습니다.
  • CDN 캐시와 브라우저 캐시는 별도 계층이므로 헤더 정책을 구분해 설계합니다.

관련 질문

같은 카테고리/태그 기준