네트워크 통신을 통해 리소스를 전달받는 과정은 비용이 크다. 이는 웹 사이트 / 웹 애플리케이션의 성능과 사용자 경험 저하를 초래한다. HTTP 캐시를 활용하면, 리소스를 재사용함으로써 불필요한 통신 과정을 스킵하고 사용자에게 리소스를 단시간 내에 보여주는 것이 가능하다.
HTTP 캐시라는 단일 API는 존재하지 않는다. 이는 웹 플랫폼 API 집합에 대한 이름이고,
모든 브라우저에서 지원된다.
브라우저가 제공하는 모든 HTTP 요청은 먼저 브라우저 캐시로 라우팅되고, 요청을 수행하는 데
사용 가능한 캐시 응답이 있는지 확인한다.
일치하는 항목이 있다면, 캐시에서 응답을 읽어 네트워크 통신에 의해 발생하는 비용을 제거한다.
HTTP 캐시의 동작은 요청 헤더와 응답 헤더의 조합으로 제어된다. 요청 헤더는 브라우저가 대신 설정해주는 기본값 헤더를 사용하는 것이 일반적이고, 응답에 헤더를 추가하여 캐시를 직접 제어한다.
Cache-Control: no-store // 캐시를 사용하지 않음
캐시를 사용하지 않으면 요청은 서버로 전송되고, 응답은 매번 다운로드된다.
Cache-Control: no-cache // 캐시하지만, 재검증
사용자에게 전달하기 전에, 서버에서 검증을 받은 후 서버가 OK하면 사용한다.
max-age=0
과 동작 방식이 같다.
max-age=0
과 동작 방식이 같은 이유?
max-age=0
은 명시한 시간이 만료되어도, 바로 새로운 데이터를 다운받지 않는다.- 서버에 검증을 요청하여, OK하면 사용한다.
Cache-Control: public
Cache-Control: private
Cache-Control: max-age=20 (20초)
Cache-Control: max-age=31536000 (31536000초 = 1년)
// server.js
const header = {
setHeaders: (res, path) => {
// NOTE: Cache를 위한 헤더 옵션을 설정.
res.setHeader('Cache-Control', 'private, no-cache');
res.setHeader('Expires', '-1');
res.setHeader('Pragma', 'no-cache');
}
};
HTTP Caching (MDN Docs)
HTTP Cache로 불필요한 네트워크 요청 방지 (web.dev)
프론트엔드 개발자를 위한, 실전 웹 성능 최적화(feat. React) - Part. 2