[CS] 브라우저 캐시

LMH·2023년 2월 1일
0

이번 포스팅에서는 브라우저 캐시에 대해 정리하겠습니다.

캐시란?

캐시(Cache)는 다운로드 받은 데이터나 값을 미리 복사해 놓는 임시 장소를 뜻하며, 데이터에 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용합니다.

클라이언트와 서버가 요청과 응답을 주고 받을 때 브라우저 캐시를 이용하면, 리소스 낭비를 줄일 수 있습니다. 캐시는 클라이언트가 서버로 반복된 데이터를 요청할 경우, 캐시에 그 데이터이 저장되어 있다면 클라이언트는 서버를 통하지 않고 캐시에서 그 데이터를 가져와 사용합니다.

클라이언트는 어떠한 기준으로 캐시에 있는 데이터를 가져올까요? 클라이언트는 캐시에 있는 데이터의 신뢰성을 확인하기 위해 HTTP 요청의 헤드를 활용합니다.

캐시 사용하기

유효 시간으로 데이터 검증

클라이언트의 요청으로 서버에서 클라이언트로 데이터를 보낼 떄 헤더에 Cache-Control을 추가하여 응답합니다. " max-age = 60"이란 뜻은 60초간 해당 데이터가 유효하다는 의미 입니다. 클라이언트가 첫 응답으로 부터 60초 이내에 동일한 데이터를 요청하면 서버가 아닌 캐시에서 데이터를 가져와 사용하게 됩니다.

요청 시 만약 60초가 지났다면 서버에서 다시 데이터를 받아오게 됩니다.

HTTP/1.1 200 OK
Content-Type : image/jpeg
Cache-Control : max-age = 60
Content-Length : 34012

asdfd234123sdvfdsa43452341dsd324134123dsafasd <데이터>

데이터 최신화 여부 검증

캐시 유효 시간은 지났지만, 서버에서 다시 받아와야하는 파일이 캐시에 저장되어 있는 파일과 완전히 동일한 경우에 검증을 통해서 캐시의 데이터를 사용할 수 있습니다.

캐시 검증 헤더

캐시에 저장된 데이터와 서버의 데이터가 동일한지 확인하기 위한 정보를 담은 응답 헤더 입니다.

  • Last-Modified : 데이터가 마지막으로 수정된 시점을 의미하는 응답 헤더로, 조건부 요청 헤더인 If-Modified-Since 와 묶어서 사용합니다.
  • Etag : 데이터의 버전을 의미하는 응답 헤더로, 조건부 요청 헤더인 If-None-Match 와 묶어서 사용합니다.

조건부 요청 헤더

캐시의 데이터와 서버의 데이터가 동일하다면 재사용하게 해달라는 의미의 요청 헤더

  • If-Modified-Since : 캐시된 리소스의 Last-Modified 값 이후에 서버 리소스가 수정되었는지 확인하고, 수정되지 않았다면 캐시된 리소스를 사용합니다.
  • If-None-Match : 캐시된 리소스의 ETag 값과 현재 서버 리소스의 ETag 값이 같은지 확인하고, 같으면 캐시된 리소스를 사용합니다.

Last-Modified 와 If-Modified-Since

클라이언트가 서버에 데이터를 요청하면 서버에서는 응답과 함께 서버에서 데이터가 마지막으로 수정된 시간을 의미하는 헤더의 Last-Modified 값 "2023년 2월 2일 08:00:00"을 캐시에 함께 저장합니다.

HTTP/1.1 200 OK
Content-Type : image/jpeg
Cache-Control : max-age = 60
Last-Modified : 2023년 2월 2일 08:00:00
Content-Length : 34012

asdfd234123sdvfdsa43452341dsd324134123dsafasd <데이터>

그리고 다음에 클라이언트가 요청을 보낼 때 서버의 응답 헤더에 있던 Last-Modified 값을 "2023년 2월 2일 08:00:00"을 헤더에 If-Modified-Since 값으로 작성합니다.

GET /logo.jpg
If-Modified-Since : 2023년 2월 2일 08:00:00

이 후에 서버는 요청 헤더에 있는 2023년 2월 2일 08:00:00 값을 이용하여 동일한 데이터임을 검증하고 데이터가 그 이후 수정되지 않았다면 304 Not Modified라는 응답 메시지를 클라이언트에 보냅니다. 그리고 캐시 데이터의 유효 시간이 다시 갱신되어 클라이언트는 브라우저 캐시에서 60초간 데이터를 받아 올 수 있게 됩니다.

Etag 와 If-None-Match

Last-Modified 와 If-Modified-Since와 마찬가지로 동작합니다. 다만 서버의 응답에 헤더 포함되어 있는 ETag 값 "845eed07c5887cf"이 캐시에 저장됩니다.

HTTP/1.1 200 OK
Content-Type : image/jpeg
Cache-Control : max-age = 60
ETag : "845eed07c5887cf"
Content-Length : 34012

asdfd234123sdvfdsa43452341dsd324134123dsafasd <데이터>

그 이후 클라이언트가 서버에 요청을 보낼 때 헤더에 If-None-Match 값을 "845eed07c5887cf"를 포함시킬 경우 서버에서 서버와 캐시의 데이터가 동일한 데이터임이 검증한 후 데이터가 수정되지 않았음을 의미하는 304 Not Modified 라는 응답을 보내주고, 캐시 데이터의 유효 시간이 갱신되면서 해당 데이터를 재사용할 수 있게 됩니다.

GET /logo.jpg
If-None-Match : "845eed07c5887cf"

두 쌍의 캐시 검증 헤더와 조건부 요청 헤더를 알아보았습니다. 두 쌍중의 헤더 중 한 쌍만 사용할 수도 있지만, 보통 두 종류를 동시에 사용합니다. 둘 중 하나만 사용했다가 매칭되는 응답 헤더가 없는 경우에는 재사용할 수 있는 경우에도 리소스를 다시 받아와야 하는 경우가 생길 수 있기 때문입니다.

Reference

https://urclass.codestates.com/

profile
새로운 것을 기록하고 복습하는 공간입니다.

0개의 댓글