Cache Control & Etag
Cache-Control 헤더
- 브라우저의 응답 캐시를 제어.
- 캐시가 잘 된 경우 개발자도구에 status=
200
, size=(disk cache)
로 표시됨. - Cache-Control 지시문 예시
- Cache-Control: no-store - 캐시하지 않음.
- Cache-Control: no-cache - 서버에 요청하여 캐시를 사용할 것인지 결정…? (미확인)
- Cache-Control: public(private), max-age=60 - 공유캐시/브라우저에 1분 동안 캐시
ETag 헤더
- 응답 본문의 해시값(md5)을 보관. If-None-Match 요청 헤더와 비교하여 캐시 사용 여부를 판단.
- 캐시가 잘 된 경우 개발자도구에 status=
304
, size=90B
로 표시됨. -
서버에서 DB처리 등은 원래대로 하지만(+해시처리), 네트워크 전송량은 대폭 줄어들 수 있다.
- ETag를 사용한 캐시 업데이트
- 최초 요청을 받으면 서버에서 응답 본문을 해시(etag 패키지 사용)하여 ETag 헤더로 내려보낸다.
- 브라우저는 ETag 헤더의 값을 보관하고 있다가 동일 URL 요청 시 If-None-Match 헤더에 담아 보낸다.
- 서버에서 응답 본문을 다시 해시한 값과 If-None-Match 헤더를 비교한다.
- 비교한 값이 같으면 캐시를 사용하고(
304
로 응답하면 됨), 비교한 값이 다르면 캐시를 사용하지 않는다(200
+본문으로 응답하면 됨). - 서비스워커에서 네트워크로 처리를 넘길 경우 서비스워커가 먼저
200
으로 응답하고 이어서 네트워크가304
로 응답함. - express의 경우 app.set() 등으로 etag를 설정할 수 있다고 하나, polka에서는 설정방법을 찾을 수 없어 etag 패키지를 사용하여 수동으로 응답 헤더에 추가함. static 리소스인 경우 sirv의 etag 옵션이 존재함.
Last Modified 헤더
- ETag와 유사하지만 해시값 대신 리소스 변경 시간을 사용. If-Modified-Since 요청헤더와 비교. (미확인)
참고
- HTTP 캐싱
- https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ko
- https://medium.com/@bbirec/http-캐쉬로-api-속도-올리기-2effb1bfab12
Copyrights ⓒ 디디스퀘어, 무단전재 및 재배포 금지