일단 캐시를 이해하기 위해서 캐시가 없을 경우를 봐보자
- 첫 번째 요청
1.1M의 star.jpg라는 그림을 클라이언트는 받게 된다.
그러면 첫 번째 요청이 끝나고 캐시가 없을 때의 두 번째 요청 시에는 어떻게 될까?
- 두 번째 요청
똑같은 크기의 응답을 보낼 것이다.
이렇게 캐시가 없을 때는 어떤 특징이 있는지 보면
이제 캐시가 적용된 경우를 확인해보자
- 첫 번째 요청
응답을 보내게 되고
캐시 저장소에 60초 유효한 캐시를 저장한다.
이제 이 상태에서 두 번째 요청을 보내면 어떻게 될까?
- 두 번째 요청
클라이언트는 캐시를 먼저 찾아보고 유효시간 안에 요청한 정보가 있으면 바로 캐시에서 가져온다.
이렇게 해서 캐시 적용시 특징은
- 세 번째 요청(캐시 시간 초과)
이제 캐시 유효 기간이 초과된 경우 요청한다면 어떻게 될까?
캐시 유효 시간이 초과 됐으므로
처음 요청과 같게 된다.
캐시 시간 초과
캐시 유효 시간이 초과해서 서버에 다시 요청하면 어떤 상황들이 있을까?
1. 서버에서 기존 데이터를 변경하지 않음
2. 서버에서 기존 데이터를 변경함
ex)
먼저 서버에서 기존 데이터를 변경하지 않았을 때를 봐 보자
- 검증 헤더 추가
데이터가 같다는 것을 검증 하기 위한 검증 헤더를 추가하고 첫 번째 요청을 봐보면
첫 번째 요청
요청을 받고
캐시에 저장한다.
두 번째 요청(캐시 시간 초과)
먼저 캐시를 확인하고 캐시가 시간 초과됐는지 확인하고 초과 됐다면 요청을 보내야 한다.
그런데 데이터 최종 수정일(2020년 11월 10일 10:00:00)이라는 데이터가 있는 것이 확인되었다. 그러면
요청을 서버로 보낼때 if-modified-since라는 헤더로 최종 수정일을 넘긴다.
그리고 서버가 이 날짜를 보고 수정일을 확인하고 수정이 안됐다면
기존 데이터를 그대로 쓰면 되므로 Body는 따로 보내지 않고 헤더만 보내게 된다.
이제 요청을 확인했으니 다시 60초 유효하고 브라우저는 캐시에서 해당 데이터를 이용하게 된다.
반대로 데이터가 변경되었다면 Last-Modified 를 변경하고 Body를 통해 바뀐 데이터를 전송해서 받으면 된다.
이제 정리를 해보면
하지만 이 방법의 단점 중 하나는 1초 미만 단위로 캐시 조정이 불가하다는 점이다 이를 개선한 것으로 ETag가 있다.
[ http ] 11. 프록시 캐시 (0) | 2021.12.11 |
---|---|
[ http ] 10. HTTP 헤더(2) - 캐시와 조건부 요청2 (0) | 2021.12.10 |
[ http ] 08. HTTP 헤더(쿠키) (0) | 2021.12.08 |
[ http ] 07. HTTP 헤더(1) (0) | 2021.12.05 |
[ http ] 06. HTTP 상태코드 (0) | 2021.11.25 |