Cache

hoyong.eom·2023년 7월 5일
0

스프링

목록 보기
8/59
post-thumbnail

Spring


Cache

일반적으로 알고 있듯이 캐시가 존재하면 사용자의 경험이 개선된다.
캐시를 적용하려면 Http Request Header에 값을 넣어줘야한다.
cache-control:max-age=60 -> 60초간 유효하다고 지정
웹브라우저는 캐시를 저장하는 공간이 별도로 존재한다.

만약 max-age가 초과하면 데이터를 다시 캐시에 저장합니다.

하지만, 캐시 시간 초과시에 발생할 수 있는 상황은 2가지입니다.

1) 기존 데이터가 변경된 경우
2) 기존 데이터가 변경되지 않은 경우

1번인 경우는 다시 받아야겠지만 2번인 경우는 캐시에 있는 데이터를 다시 사용해도 된다.
그렇다면 클라이언트의 캐시에 존재하는 데이터와 서버에 존재하는 데이터가 일치하다는 정보를 확인할 수 있어야한다.

이를 위해서 검증 헤더가 추가된다.

검증 헤더

클라이언트가 요청하면 서버는 Last-Modified 헤더를 기록해서 전달한다.
(Last-Modified : YYYY년 XX일 MM 날짜 데이터(UTC), 서버에서 클라이언트로 전달)

그래서 클라이언트에서 max-age가 초과하면 캐시에 들고 있는 Last-Modified 값을 서버로 전달한다.
(if-modified-since: YYYY년 XX일 MM 날짜 데이터(UTC), 클라이언트에서 서버로 전달)

서버는 클라이언트에서 전달한 modified값을 가지고 수정 여부를 판단해서 클라이언트에 요청값을 전달한다.
만약 캐시가 바뀌지 않았다면 HTTP Body는 값이 들어있지 않고 Header만 전달된다.(304 Not Modified 를 전달함)

만약 데이터가 변경되었다면 200 OK를 보내고 모든 데이터를 전송한다.

Last-modified <-> if-modified-since 를 사용하는 방법도 존재하지만, ETag를 사용하는 방법도 존재한다.

ETag(Entity Tag)

ETag는 캐시용 데이터에 임의의 고유한 버전 이름을 달아놓는것을 말한다고 한다.
따라서 데이터가 변경되면 이 이름을 바꿔서 변경한다(Hash를 다시 생성함)
따라서 ETag만 보내서 같으면 304, 다르다면 200 응답을 보내게 된다고 한다.

ETag가 더 나은 이유는 Last-Modified의 경우 실제 데이터가 바뀌지 않아도 이름만 바뀐 경우 날짜가 업데이트 될수 있기 떄문에 진짜 데이터가 변경되지 않아도 다시 받기도 한다.

ETag <-> If-None-Match


참고

해당 포스팅은 아래의 강의를 공부 후 개인적으로 정리한 내용입니다.
김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식

0개의 댓글