April 24, 2022
데이터나 값을 미리 복사해 놓은 임시 장소나 그런 동작을 의미합니다.
브라우저 캐시의 종류에는 메모리 캐시, 디스크 캐시가 있는데 메모리 캐시는 RAM에 저장되며 브라우저 종료 시 사라지지만 리소스를 빠르게 읽어올 수 있습니다 . 디스크 캐시는 디스크에 파일 형태로 되며 영구적입니다. 이런 캐시의 종류는 브라우저 내부의 알고리즘으로 사용 빈도나 사이즈 등에 의해 결정됩니다.
크롬 접속 시 네트워크 요청을 확인하면 메모리/디스크 캐시를 사용하는 리소스를 확인할 수 있다.
Cache-contorl
Cache-contorl
은 HTTP 헤더로 캐시의 동작 지정을 지정합니다.
no-cache
: 캐시 사용 전 서버에 사용 가능한 지 검사 후 필요
max-age: 0
no-store
: 캐시 사용 Xpublic
: 모든 환경에서 캐시 가능private
: 브라우저 환경에서만 캐시 가능 (외부 서버 X)
max-age
: 캐시의 유효시간 설정max-age
)이 지난 경우?지정된 max-age
가 지나도 저장된 캐시를 바로 지우지는 않습니다. 서버에서 기존 데이터를 변경하지 않은 경우에 304 Not Modified
로 응답하며 클라이언트에서는 기존 캐시를 사용하도록 합니다. 이때 서버는 바디 없이 응답하므로 네트워크 요청의 부하를 줄일 수 있습니다.
바디 없이 보내기 때문에 원래 요청보다 사이즈가 훨씬 작다
그렇다면 서버는 우리가 가지고 있는 캐시가 서버의 최신 데이터와 같은지 알 수 있을까요?
ETag
일종의 리소스에 대한 해시로, 서버는 리소스에 임의의 고유한 버전 이름을 붙여 ETag
헤더에 포함하여 응답합니다. 클라이언트는 캐시의 ETag
를 기억했다가 요청 시 If-None-Match
헤더로 서버에 전달하고 서버는 리소스의 ETag
와 비교하여 변경되지 않았다면 기존 캐시를 사용하도록 합니다.
Last-Modified
서버는 리소스가 마지막으로 수정된 날짜를 의미하는 Last-Modified
헤더를 포함하여 응답하고 클라이언트에서 캐시의 Last-Modified
를 기억하고 있다가 요청 시 If-Modified-Since
헤더에 포함하여 서버에 전달합니다. 서버는 리소스가 해당 날짜와 시각 이후로 수정됐는지 확인하고 수정되지 않았다면 기존 캐시를 사용하도록 합니다.
max-age
가 크게 설정되어 있으면 서버에서 리소스가 바뀌어도 클라이언트 상에서는 최신 리소스의 상태를 반영하지 못하는 문제가 있습니다. HTML과 같이 최신 상태를 반영해야 하는 리소스는 no-cache
로 설정하는 것이 좋습니다. 마찬가지로 js, css 파일도 no-cache
로 설정해야할 것 같지만 웹팩을 사용하는 경우 파일 이름에 해시가 포함되어 있기 때문에 파일 내용이 수정됐을 때 새로운 js, css 파일이 생성되게 됩니다. HTML이 최신 컨텐츠를 반영한다면 기존의 js 파일이 업데이트 됐을 때 새로운 js 파일을 요청할 것이기 때문에 js, css 리소스의 max-age
는 크게 설정해도 무관합니다.