캐시(Cache)는 다운로드 받은 데이터나 값을 미리 복사해 놓는 임시 장소이다.
데이터에 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다.
클라이언트와 서버가 요청과 응답을 주고 받을 때 브라우저 캐시를 이용하면, 리소스 낭비를 줄일 수 있다. 캐시는 클라이언트가 서버로 반복된 데이터를 요청할 경우, 캐시에 그 데이터이 저장되어 있다면 클라이언트는 서버를 통하지 않고 캐시에서 그 데이터를 가져와 사용한다.
클라이언트는 어떠한 기준으로 캐시에 있는 데이터를 가져올까?
클라이언트는 캐시에 있는 데이터의 신뢰성을 확인하기 위해 HTTP 요청의 헤드를 활용한다.
// 응답 헤더
Cache-Control:max-age=300 // max-age - 리소스가 유효하다고 판단되는 최대 시간.
Content-Length:128475
Content-Type:image/jpeg
클라이언트의 요청으로 서버에서 클라이언트로 데이터를 보낼 떄 헤더에 Cache-Control을 추가하여 응답한다.
"max-age = 300"이란 뜻은 300초간 해당 데이터가 유효하다는 의미이다. 클라이언트가 첫 응답으로 부터 60초 이내에 동일한 데이터를 요청하면 서버가 아닌 캐시에서 데이터를 가져와 사용하게 된다.
요청 시 만약 300초가 지났다면 서버에서 다시 데이터를 받아 오게 된다.
캐시 유효 시간은 지났지만, 서버에서 다시 받아와야하는 파일이 캐시에 저장되어 있는 파일과 완전히 동일한 경우에 검증을 통해서 캐시의 데이터를 사용할 수 있다.
Date:Mon, 01 Apr 2024 00:56:40 GMT
Expires:Sat, 27 Apr 2024 10:56:50 GMT
Last-Modified:Fri, 08 Sep 2023 00:00:00 GMT
Etag:Z-2GCz4R6Sq+4IXlm6BaPmer+MUS6U831KjrkexB1Nw=
Date
HTTP 응답이 발생한 날짜와 시간. HTTP 응답을 생성하는 서버가 해당 응답을 생성할 때의 시간.
Expires
리소스가 캐시되어 있을 때 캐시가 만료되는 날짜와 시간. 클라이언트는 이 날짜 이후에는 캐시된 데이터를 다시 서버로 요청하여 새로운 데이터를 받아와야 한다.
Last-Modified
해당 리소스가 마지막으로 수정된 날짜와 시간. 이 값은 서버에서 리소스를 마지막으로 수정한 시간.
Etag
특정 리소스의 버전을 나타내는 식별자. 클라이언트가 이전에 받은 리소스의 ETag를 서버에게 다시 제공하면, 서버는 이 ETag를 사용하여 리소스가 변경되었는지 여부를 판단.. 이를 통해 캐시된 리소스를 다시 전송할 필요가 있는지를 결정하게 된다.
클라이언트가 서버에 데이터를 요청하면 서버에서는 응답과 함께 서버에서 데이터가 마지막으로 수정된 시간을 의미하는 헤더의 Last-Modified 값 Fri, 08 Sep 2023 00:00:00 GMT 을 캐시에 함께 저장.
이 후에 클라이언트가 요청을 보낼 때 서버의 응답 헤더에 있던 Last-Modified 값인 08 Sep 2023 00:00:00 GMT 을 헤더에 If-Modified-Since 값으로 작성.
GET /logo.jpg
If-Modified-Since : 08 Sep 2023 00:00:00 GMT
이 후에 서버는 요청 헤더에 있는 08 Sep 2023 00:00:00 GMT 값을 이용하여 데이터가 동일한지 검증하고 데이터가 그 이후 수정되지 않았다면 304 Not Modified라는 응답 메시지를 클라이언트에 보낸다. 그리고 캐시 데이터의 유효 시간이 다시 갱신되어 클라이언트는 브라우저 캐시에서 300초간 데이터를 받아 올 수 있게 된다.
Last-Modified 와 If-Modified-Since와 마찬가지로 동작한다. 다만 서버의 응답에 헤더 포함되어 있는 ETag 값 "Z-2GCz4R6Sq+4IXlm6BaPmer+MUS6U831KjrkexB1Nw=" 이 캐시에 저장된다.
HTTP/1.1 200 OK
Content-Type : image/jpeg
Cache-Control : max-age = 300
ETag : "Z-2GCz4R6Sq+4IXlm6BaPmer+MUS6U831KjrkexB1Nw="
Cache-Control:max-age=300 // max-age - 리소스가 유효하다고 판단되는 최대 시간.
Content-Length:128475
이 후에 클라이언트가 서버에 요청을 보낼 때 헤더에 If-None-Match 값을 "Z-2GCz4R6Sq+4IXlm6BaPmer+MUS6U831KjrkexB1Nw="를 포함시킬 경우 서버에서 서버와 캐시의 데이터가 동일한 데이터임이 검증한 후 데이터가 수정되지 않았음을 의미하는 304 Not Modified 라는 응답을 보내주고, 캐시 데이터의 유효 시간이 갱신되면서 해당 데이터를 재사용할 수 있게 된다.