
이 포스팅은 인프런 김영한 강사님의 <모든 개발자를 위한 HTTP 웹 기본 지식>을 수강하고, 공부하여 글로 정리한 것입니다. 그대로 갖다 붙여넣는 내용이 아니라 기억나는대로 작성한 후 다시 추가적으로 정리하는 방식을 취하고 있기 때문에 틀린 부분이 있을 수 있습니다. 잘못된 점은 짚어주시면 감사하겠습니다.
데이터가 변경되지 않아도 계속 네트워크를 통해 데이터를 다운로드 받아야 하는데, 인터넷 네트워크는 매우 느리고 비싸다. 브라우저 로딩 속도가 느려서 느린 사용자 경험을 할 수밖에 없음.
cache-control (캐시가 유효한 시간) 을 응답 헤더에 입력하여 전달한다.
웹 브라우저 내부에는 캐시를 저장하는 저장소가 있어서 여기에 응답 결과를 저장한다. (이후부터는 캐시에서 먼저 조회하여 가져옴)
캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 되므로, 비싼 네트워크 용량을 줄일 수 있다. 브라우저 로딩 속도가 매우 빨라 빠른 사용자 경험이 가능하다.
캐시 유효시간이 초과하면, 서버를 통해 데이터를 다시 조회하고 캐시를 갱신한다. 이때 다시 네트워크 다운로드가 발생한다.
그런데 캐시 만료 후에도 서버에서 데이터를 변경하지 않았는데도 새로 받아오는 것은 바람직하지 않다. => 이를 해결하기 위해 나온 것이 검증 헤더와 조건부 요청
데이터를 전송하는 대신 저장해두었던 캐시를 재사용할 수 있다. 단, 클라이언트 데이터와 서버 데이터가 같다는 사실을 확인할 방법이 필요.
응답 헤더에 Last-Modified (데이터 최종 수정일) 필드를 추가.
캐시가 만료되어 서버에 요청을 보낼 때 if-modified-since 필드에 데이터 최종 수정일 값을 넣어서 전송하여 데이터의 변동 여부를 검증.
변동이 없으면 응답 상태코드로 304 Not Modified 전송. HTTP Body가 없다.
결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드하여 부하가 줄어듦.
Last-Modified , If-Modified-Since는 1초 미만 단위로 캐시 조정이 불가능하다는 단점이 존재한다.
또한 날짜 기반의 로직을 사용해서 만약 데이터를 수정해서 Last-Modified 날짜는 다르지만 데이터 결과가 똑같은 경우에는 ETag를 사용한다.
ETag(Entity Tag)
캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
예) ETag: "v1.0"
데이터 변경되면 이 이름을 바꾸어서 변경(Hash 다시 생성)
예) ETag: "aaaaa" -> ETag: "bbbbb"
ETag만 보내서 같으면 유지, 다르면 다시 받기
캐시 제어 로직을 서버에서 완전히 관리. 클라이언트는 캐시 메커니즘을 모름.(단순히 이 값을 서버에 제공)
클라이언트에서 원 서버에 직접 접근하는 것이 아닌, 중간에 프록시 캐시 서버를 두어 이를 거쳐 접근할 수 있도록 한다.
확실한 캐시 무효화 응답을 위해
까지 모두 넣어준다.