노트

브라우저 캐시

HTTP Caching

프런트엔드#http#browser · 연결된 개념 15개

쉽게 말하면

브라우저 캐시는 한 번 사 온 식재료를 냉장고에 넣어 두고 유통기한 안에는 마트에 다시 가지 않는 거예요. 같은 파일을 매번 서버에서 받느라 기다릴 필요가 없어져요.

비유가 깨지는 곳 기한이 지났다고 바로 버리진 않아요. 서버에 '바뀌었나요?' 하고 물어 안 바뀌었으면 304만 받아 그대로 쓰고, no-cache도 '저장 안 함'이 아니라 '쓸 때마다 확인'이라는 뜻이에요.

한 번 받은 리소스(HTML·CSS·JS·이미지)를 브라우저가 저장해 두었다가 다시 쓰는 기능. 서버가 응답 헤더로 얼마나, 어떻게 캐시할지 알려 주고 브라우저가 그대로 따른다.

두 가지 방식

  • 신선한 동안 그냥 쓰기: Cache-Control: max-age=31536000이면 그 시간 동안 서버에 묻지도 않고 캐시를 쓴다
  • 확인하고 쓰기: 유효 기간이 지났거나 no-cache면 서버에 "바뀌었나요?"라고 묻는다. 안 바뀌었으면 서버는 본문 없이 304 Not Modified만 보낸다 → ETag와 조건부 요청
flowchart TD
  Q[리소스 요청] --> C{캐시에 있고 신선한가?}
  C -- 예 --> U[서버에 묻지 않고 캐시 사용]
  C -- "아니오 (만료 또는 no-cache)" --> V["서버에 재검증 (If-None-Match 등)"]
  V --> S{바뀌었나?}
  S -- 아니오 --> N["304 Not Modified, 캐시 사용"]
  S -- 예 --> F[200 + 새 본문, 캐시 갱신]

자주 쓰는 지시어(Cache-Control):

  • no-cache: 저장은 하되 쓸 때마다 확인. "캐시 안 함"이 아니다
  • no-store: 아예 저장하지 않음(민감한 응답)
  • private / public: 브라우저만 / CDN(Content Delivery Network) 같은 공유 캐시도
  • immutable: 유효 기간 동안 절대 안 바뀜

실무 패턴

  • 빌드 결과 JS·CSS는 파일 이름에 내용 해시를 넣고(app.3f9a1c.js, 캐시 버스팅(Cache Busting)) 1년짜리 max-age와 immutable을 준다. 내용이 바뀌면 이름이 바뀌므로 캐시 무효화가 필요 없다
  • HTML은 no-cache로 두어 항상 최신 파일 이름을 가리키게 한다
  • 배포 직후 열려 있던 탭이 옛 HTML 기준으로 이미 사라진 청크를 요청하면 Failed to fetch dynamically imported module 에러가 난다. 옛 청크를 한동안 남겨 두거나, 에러를 잡아 새로고침한다 → 코드 스플리팅과 동적 임포트

개발 중 옛 파일이 남을 때

개발 서버는 모듈을 자주 새로 만드는데 브라우저가 이전 버전을 캐시에서 꺼내 쓰면 위와 같은 동적 import 실패나 이상 동작이 난다. 시크릿 창에서는 되는데 일반 창에서만 안 된다면 캐시를 의심한다.

  • 하드 리프레시(macOS Cmd+Shift+R)로 캐시를 무시하고 다시 받는다
  • DevTools Network 탭의 "Disable cache"를 켜 둔다(DevTools가 열려 있을 때만 적용) → 크롬 개발자 도구 팁

서버 쪽 캐시 전략은 읽기 캐시 전략, Next.js의 여러 캐시 계층은 Next.js 캐시 계층 참고.

출처: MDN — HTTP caching · MDN — HTTP caching: Cache busting

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • "use cache"와 Cache Components

    'use cache'는 Next.js 16의 Cache Components 모델에서 async 함수나 컴포넌트의 반환값을 캐시하라고 명시하는 지시어(Directive)다. 아무것도 표시하지 않으면 매 요청 실행되고, 캐시하고 싶은 곳에만 직접 붙인다(옵트인, Opt-in).

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • 크로스 브라우징

    크로스 브라우징은 브라우저 종류·버전·기기가 달라도 웹 페이지가 같은 기능을 제공하도록 만드는 일이다. 모든 브라우저에서 픽셀까지 똑같이 보이게 하는 것이 목표가 아니라, 지원하기로 한 환경에서 핵심 기능이 동작하고 오래된 환경에서도 쓸 수는 있게(점진적 향상, Progressive Enhancement) 하는 것이 목표다.

  • localStorage와 sessionStorage

    브라우저에 문자열 키-값을 저장하는 Web Storage API의 두 가지. 쿠키와 달리 요청에 자동으로 실리지 않고, 출처 단위로 나뉘며(same-origin-policy), 보통 출처당 5MB 안팎을 쓸 수 있다. 동기 API라 큰 데이터를 자주 읽고 쓰면 메인 스레드를 막는다.

  • 브라우저 렌더링 파이프라인

    브라우저가 받은 HTML·CSS·JS를 화면의 픽셀로 바꾸는 순서. 처음 로드할 때도, 이후 무언가 바뀔 때도 같은 단계를 거친다. 바뀐 내용에 따라 어느 단계부터 다시 시작하는지만 다르다.

보기 옵션