본문 바로가기
BOOKS

HTTP 캐시

by zieunee 2023. 9. 27.
반응형

콘텐츠 요청에 빠르게 응답하기 위해 서버와 클라이언트 사이에 응답 콘텐츠의 사본을 저장하는 공간을 “캐시” 라고 한다

캐시를 유지하고 처리해주는 별도의 서버를 “캐시서버” 라고한다. 캐시는 클라이언트 ←→서버 사이에 존재한다.

웹 아키텍쳐에 있는 캐시 서버

  • 브라우저 캐시서버 or 로컬 캐시
  • 리버스 프록시 형태의 캐시서버 ( = 웹 서버), 리버스 프록시 서버에 캐시 기능을 추가해 리버스 프록세 캐시 서버로 사용하기도 하는데 이를 “웹 캐시” 라고 한다.

캐시 서버는 프록시 서버, ISP라우터 등 다양한 위치에 존재하며 네트워크 대역폭 및 비용절감을 위해 사용된다.

웹 캐시 동작 원리

웹서버와 웹 브라우저 중간에 위치하면서 원본 컨텐츠 요청을 최종 서버에 보내 응답을 받은 후 복사본을 만들어 저장하고 사용자에게 응답한다. 이후 같은 콘텐츠 요청이 오면 복사본을 번달하게 된다. → 트래픽이 줄고, 요청에 대한 반응 속도가 빨라진다.

캐시서버는 HTTP/1.1규격 기반으로 동작한다.

HTTP

인터넷에서 데이터를 주고받기위한 클라이언트/서버 모델을 따르는 프로토콜. OSI계층모델의 마지막 7계층인 Application 레벨의 프로토콜이며 TCP/IP위에서 동작한다.

TCP Connection이 맺어지면 HTTP는 어떤 종류의 데이터든 전송할 수 있도록 설계되어있다.

HTTP 특징

  • 클라이언트 서버 모델로 동작한다.
  • 비연결성이며 상태를 유지하지 않는 프로토콜이다.
  • 클라이언트와 서버간 HTTP 메세지를 주고받으며 통신한다.
  • HTTP메세지는 헤더와 바디 부분으로 구분되어 전송한다.
  • 하위 Transport Layer프로토콜로 TCP를 사용하는데 일반적으로 80포트를 사용한다.

HTTP 메세지 > 헤더 + 페이로드로 구분된다. 헤더에는 메세지를 전송 할 호스트명, URL패스 등 메세지 전송 및 처리에 필요한 데이터들이 포함되어 있다. 페이로드는 html,이미지 등 서버가 실제 전송하고자 하는 데이터를 포함한다.

HTTP1.0은 캐시를 제어하는 명시적인 기술이 없었다. 1.1부터 명시적으로 캐시를 제어할 수 있는 헤더를 추가했는데, 이것이 Cache-Control헤더이다.

  • Expire
    • HTTP/1.0에서는 Expire 헤더를 이용해 원본 서버 콘텐츠의 유효기간을 지정하도록 정의한다. 원본서버는 Expire와 Date헤더를 함께 보내야하며, Date헤더는 요청에 대한 응답이 작성된 시점을 표시한다. 이 값을 빼서 응답의 캐시 유지시간(Time to Live)를 결정할 수 있다.
  • Cache-Control: max-age
    • HTTP/1.1에서는 Cache-Control:max-age라는 헤더로 콘텐츠의 캐시 유지시간을 정의한다. !! 유효기간 !! 을 지정하는 것
  • Cache-Control: s-maxage
    • CND같은 공용 캐시 주기를 관리한다. 사용중인 모든 CDN캐시 주기를 일괄적으로 설정하거나 변경할 수 있다.
  • ETag
    • 원본서버가 리소스를 식별하기 위해 부여하는 고유번호 이다.
  • no-cache
    • 요청헤더에 있으면 “캐시된 응답을 받지 않겠다” 라는 메세지 → 최신 응답을 받아 사용자에게 전달한다.
    • max-age=0와 차이가 있음
      • no-cache: 원본으로부터 항상 최신응답을 한다.
      • max-age=0 : 조건부 요청을 이용해 캐시된 콘텐츠에 변경 이력이 있는지 검증한다. 캐시된 응답이 유효하면 캐시반환값 반환 한다.
    • 응답헤더에 포함되면 원본서버 → 캐시서버에게 응답 보내기 전에 원본서버를 항상 확인하도록 강제 하는 것
  • no-store
    • 서버가 로컬 저장소에 메세지를 저장하지 않도록 지시한다. → 데이터 유출 방지 목적

캐시 유효성 체크

방법1: 시간 기반 조건부 요청

→ If-Modified-Since라는 헤더에 날짜를 보낸다.

방법2: 콘텐츠 기반 조건부 요청

→ ETag헤더에 콘텐츠 고유값(해시값)을 넣어서 보낸다.

콘텐츠 갱신

콘텐츠 급하게 변경했다면 강제로 갱신해야하는데

방법1 : 퍼지

→ 저장소를 완전히 지우는 방식 / 명령어나 API가 존재한다.

방법2 : 무효화

→ Cache-Control헤더를 사용해 무효화 할 수 있다. max-age=0, must-revalidate

반응형