- 시작하기 앞서 -
캐시도 어렸을 적에 궁금증이 많았다. 특히 휴대폰의 애플리케이션이 느릴때 캐시삭제하면 빨라진다는 블로그를 진짜 많이 본거 같다.(캐시 용량이 커서 삭제시 빠르게 느껴지는...), 컴퓨터의 임시파일 삭제 같은 것도...
캐시가 뭐길래 용량을 많이 차지하는 걸까?
캐시 : 한마디로 요청한 데이터(html,json,image 등)를 임시 저장하는 곳
응답 (서버) |
---|
HTTP/1.1 200 OK |
Content-Type: image/jpeg |
cache-control: max-age=60 // 캐시의 유효 시간(초) |
Content-Length: 34012 |
lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklaslkjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123 |
캐시 유효 시간 초과시 : 재요청 후 캐시 브라우저에 캐시 갱신 (재 다운로드)
✔️ 장점
캐시 유효시간이 초과해서 서버에서 다시 요청시 2가지 상황
저장해 두었던 캐시 재사용 가능
클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 방법 필요
→ 검증헤더 추가
응답 (서버) |
---|
HTTP/1.1 200 OK |
Content-Type: image/jpeg |
cache-control: max-age=60 // 캐시의 유효 시간(초) |
Last-Modified: 2020년 11월 10일 10:00:00 // 데이터 최종 수정 시간 |
Content-Length: 34012 |
lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklaslkjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123 |
💠 과정은 기본과 같으나 다른점은 캐시 유효기간 초과시 데이터 최종 수정일을 요청 헤더에 추가한다.
요청 (클라이언트,브라우저) |
---|
GET /star.jpg |
if-modified-since: 2020년 11월 10일 10:00:00 // 소유 캐시의 최종 수정일 |
💠 데이터가 변경되지 않았으면 서버는 HTTP Body를 제외한 304 응답을 보낸다
응답 (서버) |
---|
HTTP/1.1 304 Not Modified |
Content-Type: image/jpeg |
cache-control: max-age=60 // 캐시의 유효 시간(초) |
Last-Modified: 2020년 11월 10일 10:00:00 // 데이터 최종 수정 시간 |
Content-Length: 34012 |
💠 HTTP Body(데이터)를 전송하지 않았기에 HTTP 헤더(매우 적은 용량)만 전송
💠 브라우저는 응답 결과를 재사용, 헤더 데이터 갱신 (다시 캐시 유효 기간동안 사용)
검증 헤더
🔖 참고: If-Unmodified-Since
도 있다.
If-Modified-Since: 이후에 데이터가 수정되었으면?
Last-Modified, If-Modified-Since 단점
ETag(Entity Tag)
캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
If-Match
, If-None-Match
: ETag 값 사용Modified와 같다.
응답 (서버) |
---|
HTTP/1.1 200 OK |
Content-Type: image/jpeg |
cache-control: max-age=60 // 캐시의 유효 시간(초) |
ETag: "aaaaaaaaaa" // ETag |
Content-Length: 34012 |
lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklaslkjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123 |
요청 (클라이언트,브라우저) |
---|
GET /star.jpg |
If-None-Match: "aaaaaaaaaa" |
응답 (서버) |
---|
HTTP/1.1 304 Not Modified |
Content-Type: image/jpeg |
cache-control: max-age=60 // 캐시의 유효 시간(초) |
ETag: "aaaaaaaaaa" |
Content-Length: 34012 |
HTTP Body가 없으므로 용량은 적다
응답을 받은 브라우저는 캐시에서 해당 데이터를 조회해서 재사용한다.
단순하게 ETag만 서버에 보내서 같으면 유지, 다르면 다시 받기
캐시 제어 로직을 서버에서 완전히 관리
클라이언트는 단순히 이 값을 서버에 제공(클라이언트는 캐시 메커니즘 모름)
ex) 애플리케이션 배포 주기에 맞추어 ETag 모두 갱신
Cache-Control: max-age
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
• 캐시 만료후 최초 조회시 원(Origin) 서버에 검증해야함
• 원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
• must-revalidate는 캐시 유효 시간이라면 캐시를 사용함
Pragma: no-cache
expires: Mon, 01 Jan 2000 00:00:00 GMT
캐시 만료일을 정확한 날짜로 지정
HTTP 1.0 부터 사용
지금은 더 유연한 Cache-Control: max-age 권장
Cache-Control: max-age와 함께 사용되면 Expires는 무시
의미 : 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램
먼 곳에 있는 원서버 직접 접근 → 오래걸림
나의 위치와 가까운 곳의 프록시 캐시 서버 ( 빠름)
프록시 캐시 서버는 public
캐시이고
웹 브라우저(클라이언트)의 캐시는 private
캐시이다.
Cache-Control: public
Cache-Control: private
Cache-Control:s-maxage
Age: 60 (HTTP 헤더)
// 전부 적으면 된다.
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache // HTTP 1.0 하위 호환
웹브라우저가 캐시 서버 요청 (no-cache
or must-revalidate
+ ETag)
프록시 캐시에서 원 서버에 요청 (no-cache
or must-revalidate
+ ETag)
원 서버 검증
변화 없으면 프록시에 304 응답 (ETag 검증)
프록시 캐시서버는 브라우저에 304 응답
브라우저 캐시 사용
❗ 문제 발생 : 프록시 캐시 서버가 원 서버에 접근 불가시 (순간 네트워크 단절)
✔️ no-cache 의 경우
(프록시)캐시 서버 설정에 따라서 캐시 데이터를 반환할 수 있음
✔️ must-revalidate 의 경우
원 서버에 접근할 수 없는 경우, 항상 오류가 발생해야 함
📖 출처 및 참고자료