서버에 star 이미지를 요청하고, 결과로 HTTP 헤더 0.1M + 바디 1.0M 총 1.1M 이미지를 받는다.
여기서 캐시를 사용하지 않으면, 새로고침 하거나 브라우저를 닫고 다시 요청을 한다면 똑같이 1.1 M 이미지를 받게 된다.
이 경우, 데이터가 변경되지 않아도 불필요한 네트워크 사용이 발생하고, 사용자는 느린 로딩 속도를 경험하게 된다.
서버가 응답에 캐시 설정을 포함하여 전송
클라이언트 브라우저의 캐시 저장소에 해당 응답 데이터가 일정 시간(위 사진에서 60초) 동안 저장
클라이언트가 60초 이내에 같은 이미지를 요청할 경우 캐시에서 데이터가 제공되어 네트워크를 사용하지 않고 빠르게 로딩된다.
캐시 시간이 초과되면?
서버에 다시 요청을 할 때, 두 가지 상황이 나타난다.
캐시가 만료되었지만 서버의 데이터가 변경되지 않았다면, 서버가 데이터를 다시 전송하지 않고 클라이언트가 기존 캐시를 재사용하는 것이 더 효율적
단, 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법이 필요하다!
HTTP 헤더에 데이터가 마지막에 수정된 시간인 Last-Modified
라는 검증 헤더를 추가한다.
캐시 저장소에 헤더에 있던 데이터의 최종 수정일 정보도 함께 저장한다.
캐시 유효 시간이 초과한 후, 클라이언트가 서버에 요청을 보낼 때
if-modified-since
라는 조건부 요청을 포함해 요청을 보낸다.
서버의 데이터와 클라이언트의 데이터의 최종 수정일이 같다.
서버는 데이터가 변경되지 않았음을 확인하고 304 Not Modified
와 함께 HTTP 헤더만 보낸다. (HTTP Body 보내지 않음)
클라이언트는 유효 시간이 초과된 캐시 저장소의 데이터를 사용하고, 헤더 데이터를 갱신한다.
검증헤더
조건부 요청 헤더
조건부 요청 헤더 :
HTTP 요청에서 특정 조건을 기반으로 서버에 요청을 보내도록 하는 헤더
If-Modified-Since
, If-Unmodified Since
: Last-Modified
사용If-None-Match
, If-Match
: ETag
사용If-Range
예를 들어, 웹 사이트에서 이미지를 받았다고 해보자.
이 이미지를 자주 열어본다면, 매번 이미지를 새로 받아올 필요가 없을 것이다.
이전에 받은 이미지가 여전히 최신이라면, 전체 데이터를 다시 다운로드 받지 않고 캐시된 이미지를 그대로 쓰는 것이 더 효율적이다.
조건부 요청은 이렇게 중복된 데이터를 다시 전송하지 않도록 하여 네트워크 사용량을 줄이고, 로딩 시간을 단축하는 데 도움을 준다.
If-Modified-Since
헤더에 마지막으로 받은 리소스의 날짜를 넣어 서버에 요청을 보내면, 서버는 이 날짜 이후에 리소스가 변경되었는지 확인한다.리소스 변경되지 않음 | 304 Not Modified , 헤더 데이터만 전송 (Body 미포함). 클라이언트가 캐시된 데이터 그대로 사용 |
---|---|
리소스 변경됨 | 서버가 새 데이터(Body 포함)를 보내면서 200 OK 응답 보냄 |
리소스 변경되지 않음 | 서버는 요청을 처리 |
---|---|
리소스 변경됨 | 412 Precondition Failed 오류 응답 |
ETag 일치 | 서버는 요청을 처리 |
---|---|
ETag 불일치 | 412 Precondition Failed 응답 |
ETag 일치 | 304 Not Modified . 서버는 헤더만 전송하고 클라이언트는 캐시된 데이터 사용 |
---|---|
ETag 불일치 | 서버가 새 데이터를 보내면서 200 OK 로 응답 |
리소스 변경되지 않음 | 206 Partial Content , 요청한 범위의 데이터만 반환 |
---|---|
리소스 변경됨 | 200 OK , 전체 리소스 반환 |
조건부 요청 헤더 | 정의 |
---|---|
If-Modified-Since | 클라이언트가 가진 리소스의 최종 수정 날짜 이후로 변경되었는지 확인하여 변경되지 않았다면 캐시된 데이터를 사용 |
If-Unmodified-Since | 클라이언트가 지정한 날짜 이후로 리소스가 수정되지 않은 경우에만 요청을 처리 |
If-Match | 클라이언트의 ETag와 서버의 ETag가 일치할 때만 요청을 처리하여 안전한 리소스 수정 또는 삭제를 가능하게 함 |
If-None-Match | 클라이언트의 ETag와 서버의 ETag가 다를 때만 요청을 처리하여 캐시된 데이터가 최신인지 확인하고 필요 시 새 데이터 가져옴 |
If-Range | 리소스가 변경되지 않았다면 클라이어트가 요청한 데이터 범위만 반환하고, 변경된 경우 전체 리소스를 다시 전송 |