캐시(Cache)는 다운로드 받은 데이터나 값을 미리 복사해 놓는 임시 저장소로, 데이터 접근 시간이 오래 걸리는 경우나 값을 재계산하는 시간을 절약하고 싶은 경우에 사용한다.
똑같은 파일을 받아오기 위해 요청을 보내는 경우, 전에 받아 두었던 파일을 재사용할 수 있으므로 네트워크 리소스의 낭비를 줄일 수 있다.
첫 번째 요청 시 응답 결과를 캐시에 저장한다.
이 때, 서버에서 응답을 보내줄 때 Cahe-Control
을 작성해서 보내주는데, Cache-Control: max-age=60
의 경우, 해당 파일이 60초동안 유효하다 는 것을 의미한다.
두 번째 요청부터는 캐시를 우선 조회하며, 캐시에 데이터가 존재하면서 유효시간이 지나지 않았다면 해당하는 데이터를 가져와서 사용한다.
단, 유효시간이 지났을 경우, 서버에서 다시 이미지를 받아온다.
따라서, 브라우저 캐시를 활용하면 다음과 같은 장점이 있다.
캐시가 유효한 동안 네트워크 리소스를 아낄 수 있다.
파일을 다시 받아올 필요가 없으므로 브라우저 로딩이 빨라진다.
로딩이 빨라진 만큼 빠른 사용자 경험 제공이 가능하다.
캐시 유효시간이 지났지만, 다시 받아와야하는 파일이 캐시에 저장되어 있는 파일과 같은 경우, 다시 받아올 필요 없이 재사용하기 위해 사용할 수 있는 HTTP 헤더들이 존재한다.
캐시에 저장된 데이터와 서버의 데이터가 동일한지 확인하기 위한 정보를 담은 응답 헤더
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
값을 담아 요청을 보낸다.304 Not Modified
응답을 보내주고, 캐시 데이터의 유효 시간이 갱신되면서 해당 데이터를 재사용할 수 있게 된다.Etag
헤더에 담긴 내용도 캐시에 함께 저장한다.If-None-Match
를 작성하고 캐시에 함께 저장해놓았던 Etag 값을 담아 요청을 보낸다.Etag
와 캐시에 저장된 데이터의 Etag
를 비교라는데, 두 데이터가 동일한 데이터라면 두 Etag
값이 같다.304 Not Modified
응답을 보내주고, 캐시 데이터의 유효 시간이 갱신되면서 해당 데이터를 재사용할 수 있게 된다.두 쌍 중 하나만 사용했을 때, 매칭되는 응답 헤더가 없는 경우에는 재사용할 수 있는 경우에도 리소스를 다시 받아와야 하는 경우가 생길 수 있기 때문에 두 쌍 모두 사용하는게 좋다.
Reference: 코드스테이츠