이번엔 캐시에 대해서 더 자세히 배운다.
저번 시간에 캐시에 대해 대충은 공부를 했을 것이다.
캐시가 없을 때는 헤더와 바디에 해당하는 내용을 몇번이고 다시 전송해야 한다.
인터넷 네트워크가 메모리와 디스크에 비해 느리기 때문에 사용자가 기다리는 시간이 길어진다.
여기에 캐시를 추가해보자.
이렇게 캐시를 추가하면 캐시가 유효한 60초 동안은 HTTP 바디에 해당하는 부분은 전송할 필요가 없다.
그렇게 되면 사용자가 기다리는 시간이 훨씬 줄어들게 된다.
근데 만약 60초의 시간이 지나간 후에는 어떻게 될까?
당연히 서버에서 데이터를 다시 조회하고 캐시를 갱신해야 할 것 같다.
하지만 서버에서도 데이터가 변하지 않았다면 굳이 캐시를 갱신해야할까?
- 캐시 시간 초과
캐시 만료후에도 서버에서 데이터를 변경하지 않았다면, 저장해두었던 캐시를 재사용 할 수 있을 것이다.
하지만 서버에서 데이터가 변하지 않았다고 확인을 받아야 할 것이다.
그 방법에 대해 살펴보자.
이렇게 HTTP 헤더에 그 데이터가 마지막으로 수정된 시각을 포함해서 보낸다.
그리고 그 다음에 GET으로 조회를 한다면 요청에 마지막 수정된 시각을 포함해서 확인을 받는다.
만약 서버에서 확인을 한 후 변동이 없다면 304로 데이터가 수정되지 않았음을 알리고 해당 캐시데이터를 재사용한다.
이렇게 하면 데이터가 상대적으로 작은 헤더끼리만 보내도 데이터를 사용할 수 있어 매우 실용적인 해결책이다.
이 방법도 굉장히 좋지만 여기에 추가로, 같은 데이터를 수정해서 데이터는 같지만 수정된 날짜만 다른 경우도 생각을 해보자.
이런 경우 캐시를 사용하면 되지만, 서버에서는 용량이 상대적으로 큰 데이터를 전송해주게 될 것이다.
그렇기에 ETag라는 검증 헤더를 추가하게 된다.
ETag(Entity Tag)는 캐시용 데이터에 고유한 이름을 달아두고, 데이터가 변경될 때마다 이 이름을 바꾼다.
그냥 서버에서 ETag를 확인하고 현재 데이터의 ETag와 같으면 캐시를 사용하고, 다르면 HTTP 바디 내용을 재전송하는 간단한 방식이다.
위에 방법처럼 서버에서 응답할 때 ETag를 같이 캐시에 저장한 후
다시 클라이언트에서 요청할 경우 ETag를 같이 확인 받는 방법이다.
이렇게 캐시를 확인 받을 수 있다.
- 캐시와 조건부 요청 헤더
Cache-Control
- Cache-Control: max-age
캐시 유효 시간(초)
- Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 origin 서버에 검증한 후에 사용
- Cache-ControlL no-store
데이터를 저장하면 안됨
Validator(검증 헤더)
- ETag
위에 보았듯이 ETag를 확인
- Last-Modified
마지막 수정시간을 확인
조건부 요청 헤더
- If-Match, If-None-Match
ETag를 확인하여 조건부로 HTTP 메시지 바디까지 전송 요청
- If-Modified-Since, If-Unmodified-Since
Last-Modified를 확인하여 조건부로 HTTP 메시지 바디까지 전송 요청
- 캐시 무효화
Cache-Control: no-cache, no-store, must-revalidate를 사용한다.
- Cache-Control: no-cache
데이터는 캐시해도 되지만, 항상 Origin 서버에 검증하고 사용
- Cache-Control: no-store
데이터를 저장하면 안됨
- Cache-Control: must-revalidate
Origin 서버 접근 실패시 반드시 오류가 발생