개발공부/HTTP

[HTTP강의] HTTP 캐시

klyhyeon 2022. 5. 26. 15:05
728x90

본 글은 인프런 김영한님 강의를 정리한 글입니다. 자세한 강의내용은 강의를 통해 들어보시길 추천드립니다.


캐시란

캐시는 서버에 요청하지 않고 캐시 저장소에서 데이터를 꺼내 쓸 수 있기 때문에 네트워크 통신 비용을 아끼고 빠른 속도로 사용자에게 서비스를 제공할 수 있습니다. 캐시가 만료되었을 때 어떤 대안이 있는지도 알아두면 좋을 것 같습니다.

캐시적용

cache-control을 헤더에 넣어 캐시를 설정할 수 있습니다. 주요 옵션은 max-age(초 단위로 만료기간 설정)이 있습니다.

검증헤더와 조건부 요청

만약 캐시의 유효기간이 만료되었다면 어떻게 해야 할까요? 서버에 요청을 해서 다시 그 데이터를 받아와야 할 것입니다. 하지만 변경이 적은 이미지 데이터의 경우 그럴때마다 다시 데이터를 다운로드 받기엔 비용이 적지 않습니다. 따라서 검증헤더와 조건부 요청을 이용해 서버에 기존 캐시를 사용해도 되는지 요청을 보내고 응답을 받아 기존 캐시를 그대로 사용하면서 갱신해주는 방법을 사용할 수 있습니다.

  • last-modified : 시간으로 업데이트 된 시점보다 클라이언트에서의 캐시 시간이 이전일 경우 새로 요청을 해야합니다. 만약 그대로 캐시를 사용해도 될 경우 304 Not Modified를 서버에서 상태코드로 리턴해줍니다.
  • E-Tag : 시간이 아닌 버전을 캐시데이터에 명시해 설령 수정이 되었다가 원래 캐시로 변경된 경우에도 캐시를 검증해줄 수 있습니다.

캐시 제어

  • max-age : 초단위로 캐시 유효기간을 정합니다.
  • no-cache : 항상 원 서버(Origin)에서 캐시를 검증하고 사용합니다.(중간에 프록시 서버가 있을 수 있기 때문에)
  • no-store : 저장해선 안되는 캐시입니다. 데이터를 사용한 후 빨리 삭제해야 합니다.

프록시 캐시

원 서버가 물리적으로 떨어져 있는 경우, 예를 들어 미국에 원 서버가 있고 한국 유저들을 위한 프록시 서버를 아시아에 만들어 응답속도를 개선할 수 있습니다. 이를 CDN(Content Delivery Network)이라 부르며 혹은 AWS에선 Cloud Front가 있습니다.

캐시 무효화

원하지 않아도 브라우저가 임의로 캐시를 만들어 버릴 수 있습니다. 이를 막기위해 캐시 무효화가 필요하며, 설정은 캐시제어(cache-control)에 no-cache, no-store, must-revalidate를 명시해줘야 합니다.

  • must-revalidate : 원 서버로 가는 과정 중 오류가 발생했을 떄, 이전 만료된 캐시를 보여주지 않고 반드시 504 Gateway Timeout 오류를 반환해야 합니다. 주료 민감한 통장, 개인정보일 때 옵션을 사용합니다.

참조: 인프런 김영한님 HTTP 강의