콘텐츠 요청에 빠르게 응답하기 위해 서버와 클라이언트 사이에 응답 콘텐츠의 사본을 저장하는 공간을 “캐시” 라고 한다
캐시를 유지하고 처리해주는 별도의 서버를 “캐시서버” 라고한다. 캐시는 클라이언트 ←→서버 사이에 존재한다.
웹 아키텍쳐에 있는 캐시 서버
- 브라우저 캐시서버 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
'BOOKS' 카테고리의 다른 글
[함수형 코딩] 13. 함수형 도구 체이닝 , 14. 중첩된 데이터에 함수형 도구 사용하기 (1) | 2024.01.01 |
---|---|
[실전에서 바로쓰는 Next.js] Next.js 기초와 내장 컴포넌트 (0) | 2023.05.10 |
[실전에서 바로쓰는 Next.js] 렌더링 전략 (0) | 2023.05.05 |
[웹 성능 최적화 기법]웹에서 가속을 끌어내는 방법 (0) | 2023.04.10 |
[웹 성능 최적화 기법]웹 사이트 개선 방법 (0) | 2023.03.01 |