[Network] HTTP 캐싱
본 내용은 MDN HTTP 캐싱를 보고 공부, 정리한 내용입니다.
웹 캐싱의 역할
클라이언트 요청 시, 이전에 서버로부터 전달받은 리소스에 대한 요청이라면 해당 요청을 가로채 캐시 서버가 클라이언트에게 리소스를 전달한다.
웹 캐싱 효과
- 서버 과부하 해소
- 클라이언트 페이지 로드 빨라짐
웹 캐싱 종류
- 공유 프록시 캐시(공유 캐싱)
해당 웹 서버를 이용하는 한 명 이상의 사용자에 의해 재사용되는 응답을 저장하는 캐시이다.
웹 프록시 서버에서 자주 요청되는 리소스들을 저장해두어 클라이언트에게 응답한다.
대표적인 공유 프록시 캐시는 CDN (Content Delivery Network) 이다. - 사설 브라우저 캐시(로컬 캐싱)
브라우저 설정의 “캐시” 설정과 관련된 캐시이다. 브라우저 캐시는 사용자가 HTTP를 통해 서버로부터 받은 모든 문서를 갖고 있다. 이 데이터를 이용해 뒤로가기, 앞으로 가기, 저장, 소스 보기 등의 기능을 제공한다.
브라우저 캐싱 방법
HTTP/1.1 헤더에 캐싱 동작과 관련된 설정을 할 수 있다. 이 포스트에서는 헤더의 내용 중 캐시와 관련된 내용을 살펴보자. 주로 사용되는 HTTP Response header로는 Cache-Control 이 있다.
Cache-Control 헤더는 서버측에서 클라이언트측에 보내는 HTTP 헤더로, 해당 내용을 캐싱할 수 있는 사용자, 해당 조건 및 기간을 알려주는 역할을 한다.
(서버 → 클라이언트로 해당 내용을 캐싱 시 어떤 정책으로 해야하는지를 알려주는 메세지)
HTTP Request Header에 Cache-Control 헤더를 사용할 수도 있다. 이 때는 보통 웹 브라우저 - 프록시 - 서버 와 같은 형태일 때, 클라이언트가 본 서버에서 직접 리소스를 가져오길 원하면 HTTP Request Header 중 Cache-Control 헤더에 해당 내용을 넣어 요청해야 한다.
이 내용을 공부할 땐 브라우저의 개발자 도구를 통해 각 헤더가 어떤 모습인지 직접 확인하기를 추천한다.
개발자 도구 (F12) -> Network 탭 -> 현재 html 파일을 더블클릭하면 Request/Response 헤더를 확인할 수 있다.
Cache-Control 속성
- max-age
“max-age = 120” 형태로 주어지는 이 속성은, 클라이언트가 제공받은 리소스를 캐싱해둘 유효기간 (초 단위) 을 의미한다. 위 예시는 해당 내용을 120초 동안 캐싱해두는 것을 허가한다는 의미이다. - no-cache
이 속성은 클라이언트의 리소스 캐싱을 허용하되, 캐싱된 리소스를 사용하기 전 서버에 검증 요청을 해야한다는 의미이다. - no-store
이 속성은 클라이언트의 캐싱을 허용하지 않고, 매 요청 시 서버에서 리소스를 다운받아야 함을 의미한다. - public
이 속성은 클라이언트가 어디서 리소스를 받던 해당 내용을 캐싱함을 허용한다는 의미이다. - private
이 속성은 클라이언트의 캐싱을 허용하되, 반드시 본 서버에서 받은 리소스를 캐싱해야함을 의미한다. 즉, CDN과 같은 곳에서 받은 리소스는 캐싱할 수 없다.
Cache-Control 이외에 캐싱과 관련된 HTTP 헤더
- expires
해당 캐시가 언제 만료되는지를 나타낸다. Cache-Control 헤더 속성에 max-age가 명시되어 있다면 무시된다. - ETag
리소스의 버전을 나타내는 토큰(문자열) 이다. 만약 본 서버의 해당 리소스 내용이 바뀌었다면 토큰이 달라지고, 이 때 브라우저는 본 서버에서 변경되거나 추가된 리소스를 다운받아야 한다.
(변경되지 않은 리소스는 재다운로드하지 않는다.)
ETag의 내용이 달라지지 않았다면 응답코드 304(Not Modified) 가 수신되며, 이 때는 캐싱된 리소스를 그대로 사용한다. - vary
HTTP Request 헤더에는 해당 브라우저에 최적화된 encoding, language등의 내용이 포함되어 있다.
vary 헤더는 HTTP Response 헤더에 포함되어 있다. 아래 예시로 이 헤더의 역할을 살펴보자.
만약 어느 클라이언트의 HTTP Request 헤더의 accept-encoding 속성이 deflate이고, 캐싱 서버에 저장된 리소스가 vary: accept-encoding 정책에 의해 저장되었다고 가정하자. 이 리소스가 gzip 포맷이라면 클라이언트가 원하는 deflate 포맷과 다르므로 클라이언트 요청은 본 서버로 넘어가야 하며, 이 때 캐싱 서버가 이를 판단한다.
즉 vary 헤더는 캐싱된 리소스가 클라이언트에게 제공될 때 만족시켜야 할 조건을 의미한다. 클라이언트의 요청과 캐싱된 리소스의 vary 정책이 알맞다면 캐싱 리소스를 클라이언트에게 제공하고, 그렇지 않다면 캐싱 서버가 본 서버에 해당 요청을 전달하게 된다.
vary 헤더를 사용하는 가장 대표적인 예시는 모바일 기기에서 캐싱 서버에 접근하여 리소스를 받을 때, 데스크탑 형식의 리소스를 받는 경우를 방지하는 상황이다.