1. 캐싱이란?
- 어떤 데이터를 한 번 받아온 후에 그 데이터를 불러온 저장소보다 가까운 곳에 임시로 저장하여, 필요시 더 빠르게 불러와서 사용하는 프로세스를 의미한다.
- 엔지니어 입장에서는 재사용을 충분히 많이 할 수 있는 데이터만 선별적으로 캐싱하여, 성능과 비용을 아끼는 것이 중요하다.
2. 브라우저 캐시(HTTP 캐시, 웹 캐시)란?
- 브라우저나 HTTP요청을 하는 클라이언트 애플리케이션의 의해 내부 디스크에 이루어지는 캐시이며, HTTP 캐시라고도 불린다.
- 이러한 캐시는 단일 사용자를 대상으로 하는 사설 캐시(Private Cache)이며, 해당 사용자의 정보만을 저장한다.
- 브라우저에서 캐싱을 처리하는 속성에는 대포적으로 ETag, Cache-Conrol이 있다.
3. Cache-Control
- Cache-Control은 HTTP/1.1의 헤더로, 캐시에 대한 동작을 지정한다.
- 캐시의 유효 시간(생명주기)와 관련된 내용을 명시하는 헤더이다.
1) no-Cache
- request 해더 : 캐싱된 응답값을 받지 않고, 원 서버로부터 응답을 받겠다.
- response 해더 : 캐싱된 데이터를 항상 유효한지 확인하도록 하겠다. 캐싱을 하긴 하지만, 원본 서버에는 항상 갔다 오겠다(실제로 아무 캐시를 지정하지 않으려면 no-store로 설정해주어야 한다)
2) no-Store
- request, response 모두 동일하게 캐시를 사용하지 않겠다라는 의미로 사용한다.
- no-store는 로컬에 저장하는 것 자체를 금지한다.
- 데이터에 민감한 정보가 포함되어 있어 저장 불가 하도록 처리할때 사용한다.
3) max-age
- 캐시 유효시간, 초 단위 설정
- Max-age=60 : 60초 동안 캐시를 유지하겠다는 의미이다.
- 다만, Max-age 60초가 지났다고 해서 해당 리소스에 대한 캐시를 완전히 버리지 않는다. 서버에 한번 물어보고(조건부 요청), 리소스 변경이 없다면 해당 캐싱된 리소스를 그대로 사용한다.
- 흔히, 캐싱되지 않아야 하는 민감한 리소스에 대해서는 max-age=0을 사용한다.
4) age
- Origin server의 응답이 프록시 캐시 서버에 머문 시간, 초 단위(sec)
5) expire
- max-age는 유효시간을 초단위로 설정하였지만, expire는 만료일자를 지정한다.
- cache-control 해더에도 Max-age로 유효시간을 명시하는 것이 더 추천되기 때문에, 현재는 사용이 권장되지 않고 하위호한을 위해 사용한다.
- 만약, max-age와 동시에 사용되면 expire는 무시된다.
6) public
- 응답 헤더에 사용할 수 있다.
- 모든 캐시 서버에 캐시 될 수 있고 사용자 제한 없이 모든 사용자에게 응답이 전달 될 수 있다.
7) private
- public 캐시에 저장불가
- 최종 사용자 개인의 브라우저 환경에서만 캐싱하고, 외부 캐시 서버(CDN등의 범용캐시 서버)에서는 캐싱할 수 없다.
ex) 로그인을 해서 내정보가 들어있는 페이지 접근지, 내 브라우저가 아닌 만약 다른 외부서버에까지 내정보가 캐싱되는 경우를 방지해준다. 응답 메시지를 어디에 캐시할 것인지를 지정하지 위해서 사용할 뿐, 그 자체로 개인정보를 보호하는 장치가 되지는 않는다.
8) s-maxage
- 공유 캐시에 해당하는 캐시에만 적용되는 수명이며, 개인 캐시에서는 무시된디ㅏ.
- 헤더의 age필드와 비교해서 캐시의 유효성을 판단한다.
9) must-revalidate, proxy-revalidate
- must-revalidate : 캐시 만료 후 최초 조회 시 origin server에 검증
- proxy-revalidate : 위의 내용을 공유(public)캐시에만 적용한다.
10) ETag
- HTTP 응답 해더로 리소스의 특정버전에 대한 식별자라고 하며, 원본 서버가 리소스를 식별하기 위해 부여하는 고유번호이다.
- ETag는 캐시 유효성 검사를 위해 사용되며, 캐시된 리소스가 원본 리소스와 일치하는지 확인하는데 사용된다.
11) Pragma
- HTTP/1.0 하위 호환성을 위해 사용되는 헤더로, 캐시 제어를 위해 사용된다.
- 권장하지 않는다.
4. 크롬 브라우저를 기준으로 웹 브라우저는 크게 2가지 방법으로 캐싱을 한다. (브라우저 자체 알고리즘에 따름)
1) 메모리캐시 : RAM에 데이터를 저장해놓는 방식
2) 디스크 캐시 : 하드 디스크에 파일로 저장해놓고 파일을 읽어서 저장하는 방식
- 디스크 캐시보다는 메모리 캐시가 더 빠르다.
디스크 캐시는 하드디스크에 접근하는 시간을 개선하기 위해 RAM에서 가져오며,
메모리 캐시는 더 빨리 가져오기 위해 RAM에 접근하지 않고, CPU 칩안에 있는 (L1, L2, L3) 캐시 메모리에 저장한다.
캐시의 유효기간의 지난 후 재접속하는 경우에는 status가 200이 아니라 304(Not Modified)로 응답한다.
5. 캐시 무효화에 대한 전략
방법1) cache-control: no-cache, Cache-Control: max-age=0 (0초 동안 캐시)
- no-cache 옵션을 사용했다고 해서, 캐시가 사용되지 않는 것이 아니다!!!
- 캐시해도 되지만, 항상 origin server검증하고 사용해야한다.
- 서버로 부터 304 응답을 받으면 캐시를 사용한다.
방법2) cache-control: no-store
- no-store는 캐시를 사용하지 않겠다는 의미이다.
- no-cache, max-age보다 엄격하게 캐시를 완전히 비활성화 한다.
방법3) cache-control: must-revalidate
- 캐시 만료 전에는 캐시를 사용하며, 캐시가 만료된 후에는 원서버에 검증을 요청한다.
방법4) pragma:no-cache
- 해당 방법은 HTTP 1.0 하위호환을 위해 사용한다.
[참고자료]