Cache-Control에 대해 알아보자
3/5/2025, 12:33:49 AM
HTTP Cache-Control에 대한 분석
ToC
- Cache-Control에 대해
- 예시
- Cache 요청과 브라우저의 저장 방식
- Browser의 Cache Storage와 Cache Control의 차이
- 저장된 Cache의 관리 알고리즘 • 삭제 (Eviction) • 충돌과 크래시 방지 • 데이터 접근 방식
- 정리
- 예시
Cache-Control에 대해
HTTP의 헤더 중 하나입니다. 서버는 유저의 요청에 의해 서버가 가지고 있는 자원을 적절히 가져와 반환합니다.
이 때, 서버는 가져온 자원들 중 한동안은 변경되지 않을 자원들을 미리 알 수 있습니다. 예를 들어 올해의 연도를 반환한다고 하면, 1월 1일에 유저에게 돌려줄 데이터는 적어도 364일간은 변경될 일이 없을 것입니다.
이 때, HTTP 헤더의 Cache-Control을 이와 같이 설정해 보내줍니다.
Cache-Control: public, max-age=31536000 # 365일 = 60 * 60 * 24 * 365
예시
당장 본 사이트에도 Cache-Control이 사용되고 있습니다. 제가 제공하고 있는 사이트의 자원들 중 css, js, html등은 http 통신을 통해 서버에서 브라우저로 전송되어집니다.
서버로 부터 받은 http Response Headers를 확인해보면
access-control-allow-credentials:
true
access-control-allow-headers:
Content-Type, Authorization
access-control-allow-methods:
GET, POST, PUT, DELETE
access-control-allow-origin:
*
cache-control:
public, max-age=3600 # <= 여기!
서버는 3600초만큼 브라우저에 직접 캐싱을 요청하게 됩니다. 브라우저는 이를 적절히 캐시하게 됩니다.
Cache 요청은 서버가 저장 장소는 브라우저가 알아서
Cache 요청은 서버가 브라우저에게 보내는 HTTP 응답의 header에 담아 보냅니다. 브라우저는 그 헤더를 읽고 유저의 디바이스에 적절히 저장을 하게 됩니다.
이 때, 적절히는 유저의 disk 혹은 memory에 저장됩니다.
disk에 저장되는 것은 보통 저장 기간이 아주 긴 경우, 혹은 사이즈가 아주 커서 메모리를 많이 차지 하는 경우입니다.
memory는 위의 disk와 반대로, 저장 기간이 매우 짧거나 아주 가벼운 파일들인 경우입니다.
이는 브라우저가 디바이스의 스펙에 따라 알아서 선택하므로 어디에 저장할지는 강제할 수 없습니다.
Browser의 Cache Storage와 Cache Control
PWA를 하다보면 Web의 Service Worker를 사용해 브라우저의 요청을 프록시(Proxy)하여 응답을 저장하거나, 저장된 응답을 반환하는데 사용되는 것이 Cache Storage입니다.
이는 개발자가 직접 자원을 다루게 됩니다. 이는 브라우저의 IndexedDB에 바이너리 형태로 저장됩니다.
즉 Cache Storage와 Cache Control은 저장 위치부터 전혀 다른 별개의 API입니다.
저장된 Cache에 관련한 알고리즘들
삭제
- 저장된 캐시는 무한정 커질 수 있으므로 크기에 대한 관리가 필요합니다.
- LRU (Least Recently Used) 알고리즘을 통해 삭제가 이루어집니다.
- LFU (Least Frequently Used) 사용 빈도가 낮은 항목을 제거합니다.
- 시간 기반 만료 (Time-based Expiry)
- 특정 시간이 지나면 제거합니다.
- 크기 기반 제거 (Size-based Eviction)
- 캐시의 메모리나 디스크 사용량이 특정 값을 초과하면 제거합니다.
충돌과 크래시
- WAL (Write-Ahead Logging)를 통해 선 로그 기록 후 데이터 저장
- 데이터를 저장하는 행위를 실행하기 전에 log를 먼저 기록합니다.
- 저장을 실행하는 도중 프로세스가 종료되더라도 로그는 정상적으로 남게 됩니다.
- 데이터를 저장하는 행위를 실행하기 전에 log를 먼저 기록합니다.
- Atomic Writes
- 모든 데이터를 완벽하게 저장하거나, 전혀 기록하지 않습니다.
- 캐시 데이터이므로 캐시 되지 않더라도 사실 문제는 없습니다.
- 캐시 데이터가 불완전하게 저장되는 것은 크리티컬한 문제입니다.
데이터 접근
- 인덱싱:
- 해시 테이블이나 B-Tree를 사용하여 접근합니다.