캐시가 없을 때
- 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
- 인터넷 네트워크는 매우 느리고 비싸다.
- 브라우저 로딩 속도가 느리다.
- 느린 사용자 경험
캐시 시간 초과
캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
-> 이 때, 다시 네트워크 다운로드 발생
캐시 유효 시간이 초과해서 서버에 다시 요청하면 다음 두 가지 상황이 나타난다.
검증 헤더와 조건부 요청
- 캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않으면,
304 Not Modified + 헤더 메타 정보만 응답(바디X)- 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신
- 클라이언트는 캐시에 저장되어 있는 데이터 재활용
- 결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드
- 매우 실용적인 해결책
Last-Modified : 최종 수정일
응답 결과를 캐시에 저장한다. Last-Modified와 함께
60초가 경과된 경우
if-modified-since(조건부 요청 헤더) : 데이터 수정일 비교해서 데이터 수정 비교 가능
if-modified-since를 포함한 헤더 전송
변경 된게 없으면 304 Not Modified 보내서 나 변경된거 없어~ 라고 보냄 (Body가 없다.)
검증 헤더
조건부 요청 헤더
예시)
If-Modified-Since : 이후에 데이터가 수정되었나요? 라고 물어보는 것
단점
ETag, If-None-Match
Etag(Entity Tag)
캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
예) ETag : "v1.0", ETag : "a2jiodwjekjl3"
데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성)
예) Etag : "aaaaa" -> Etag : "bbbbb"
진짜 단순하게 Etag만 보내서 같으면 유지, 다르면 다시 받기!
ETag 실어서 전달
캐시에 저장
어랄랄 시간이 초과했네?
ETag 다시 전송
비교
가만보니 변경된게 없잖아?
너네 변경된거 없어~ 304 Not Modified 응답
캐시 유효
캐시에서 꺼내오기
정리
- 진짜 단순하게 ETag만 서버에 보내서 같으면 유지, 다르면 다시 받기!
- 캐시 제어 로직을 서버에서 완전히 관리
- 클라이언트는 단순히 이 값을 서버에 제공 (클라이언트는 캐시 메커니즘을 모름)
- 서버는 배타 오픈 기간인 3일 동안 파일이 변경되어도 ETag를 동일하게 유지
- 애플리케이션 배포 주기에 맞추어 ETag 모두 갱신
캐시 지시어(directives)
원(origin) 서버
: 중간 서버말고 진짜 서버
캐시 제어(하위 호환)
캐시 만료일 지정(하위 호환)
expires : Mon, 01 Jan 1990 00:00:00 GMT
캐시 만료일을 정확한 날짜로 지정
HTTP 1.0 부터 사용
지금은 더 유연한 Cache-Control : max-age 권장
Cache-Control : max-age와 함께 사용하면 Expires는 무시
원서버 : 진짜 실제 서버
클라이언트가 실제 서버로 도달하기 까지는 시간이 오래 걸린다. 그래서 도입된게 프록시 캐시 서버
public 캐시 : 공용으로 사용하는 캐시 서버
private : 로컬이나 웹 브라우저에 저장되는 캐시
Cache-Control
확실한 캐시 무효화 응답
웹 브라우저가 임의로 캐시할 경우가 있다.
이 페이지는 절대 캐시가 되면 안돼. 라고 할 경우
- Cache-Control : no-cache, no-store, must-revalidate
- Pragma : no-cache (HTTP 1.0 하위 호환)
를 다 적어줘야 한다. (예 : 통장 잔고 / 처럼 계속 바뀌는 것)
예전 응답 사이트라도 보여주자.
아니다. 무조건 504 Gateway Timeout 응답을 내야 한다.