캐시와 캐싱
캐시는 데이터를 임시로 복사해두는 임의의 장소이며 ,
캐싱은 주어진 리소소의 복사본을 저장하고 있다가 요청 시에 제공하는 기술이다
캐시는 크게 사설(private) 혹은 공유(shared) 캐시로 나누어 진다.
공유 캐시는 웹 브라우저와 서버 사이에서 동작하는 캐시이며, 한명 이상의 사용자가 재사용 할 수 있도록 응답을 저장하는 캐시이다.(중간 서버에 저장 가능)
사설 캐시는 웹 브라우저에 저장되는 캐시이며 한 사용자가 전용으로 사용한다.
HTTP 캐시들은 일반적으로 GET Method에만 응답만을 캐싱한다.
Cache-Control
HTTP Header에는 Cach-Control이 있다.
Cache-Control: no-store
캐시는 응답과 요청에 어떤 것도 저장 해서는 안된다.
Cache-Control: no-cache
캐시를 생성하지만, 리소스를 요청할때 origin 서버에 유효성 검증을 해라
Cache-Control: public
응답시 어떤 캐시에 캐싱되어도 좋다.
Cache-Control: private
응답이 한 사용자만을 위한것이며 shared 캐시에는 저장되면 안된다.
Cache-Contorl: max-age=??
캐시의 유효시간을 초단위로 설정 할 수 있다.
Cache-Control: must-revalidate
캐시 만료후 최초 조회시 origin 서버에서 검증해야 한다.
origin 서버 접근 실패시에는 반드시 오류가 발생해야 한다. 504 Gateway Timeout
Cache-Control: s-maxage
프록시 캐시에만 적용되는 max-age
확실한 캐시 무효화 응답
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-chace (HTTP/1.0 하위 호환)
Cache-Control은 response에서만 쓰이는 것이 아니라 웹 브라우저에서 프록시 캐시 서버가 아니라 원 서버로 캐시를 요청하고 싶다면 request header에 "Cache-Control: no-cache"를 포함하면 된다.
캐시의 유효시간 만료(검증)
만약 캐시의 유효시간이 초과 된다면,
1. 캐시의 유효시간이 초과되었고, 서버에서 캐시가 다른 정보로 업데이트 되었다.
1의 경우에는 서버에서 캐시를 다시 받아야 한다.
2. 캐시의 유효시간이 초과되었는데, 캐시의 정보가 바뀌지 않았다면?
2번의 경우같은 상황에서 리소스의 정보가 바뀌지 않았는데 유효시간이 만료되었다는 이유로 캐시를 다시 받는다면 자원의 손해가 발생한다. 따라서 헤더에는 다음과 같은 정보가 들어간다.
Last-Modified, If-Modified-since
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
캐싱된 리소스가 마지막으로 수정된 날짜가 응답 header에 입력된다.
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
request header에 지금 웹 브라우저가 가지고 있는 캐싱된 리소스의 마지막 수정 날자를 보낸다.
만약 request의 if-modified-since가 서버가 가진 리소스의 수정 날짜와 동일하다면
HTTP/1.1 304 Not Modified
Content-Type: image/jepg
Cache-Control: max-age=3600, private
Last-Modified: Wed, 30 Oct 2023 07:28:00 GMT
Content-Length: 2030
response에서 HTTP Body 없이 위와 같은 헤더만 전송하게 되고, 캐시를 재사용 할 수 있다.
동일 하지 않다면 200 OK를 응답하며 header와 body 데이터를 다시 받는다.
ETag(Entity Tag)
캐시용 데이터에 임의의 고유한 버전 이름을 달아둔다
ETag: "##"
reponse header에 ETag를 추가하여 현재 캐싱될 데이터의 버전을 함께 보낸다.
If-None-Match: "##"
request header에 If-None-Match에 현재 유효시간이 만료된 캐싱된 데이터의 ETag를 전송한다.
request와 서버의 데이터의 버전이 동일하다면 위와 동일하게 304 Not Modified를 응답한다.
https://hudi.blog/http-cache/
https://developer.mozilla.org/ko/docs/Web/HTTP/Caching
'computer science > network' 카테고리의 다른 글
AWS - 기초 (0) | 2024.06.08 |
---|---|
HTTP response STATUS code (0) | 2023.10.26 |
HTTP 데이터 전송 (0) | 2023.10.26 |
HTTP Method (0) | 2023.10.22 |
HTTP 메시지 (0) | 2023.10.20 |