캐시가 어떻게 동작하는지 살펴보자!
star.jpg
이미지를 요청한다. 1.1M
정도 용량의 데이터를 응답한다.star.jpg
이미지를 다시 한 번 요청한다. 1.1M
정도 용량의 데이터를 응답해준다.cache-control
속성을 넣어주어 캐시가 유효한 시간을 넣어준다. cache-control
의 max-age
를 60
으로 지정하여, 60
초 동안 유효하도록 한다. 두 번째 요청할 때는 우선 캐시를 조회한다.
캐시가 존재하고 아직 60초 이내이기에 유효한 캐시가 있어서 해당 캐시에서 자료를 가져온다.
star.jpg
이미지를 응답받아서 캐시를 업데이트 해준다. Last-Modified
)가 있다면 요청 헤더에 if-modified-since
에 해당 날짜를 담아서 서버에 보낸다. 304 Not Modified
로 변경된 것이 없다는 것을 알린다. 0.1M
만 전송된다. Last-Modified
, ETag
If-Modified-Since: Last-Modified
사용If-None-Match
: ETag
사용200 OK
304 Not Modified
Last-Modified, If-Modified-Since
의 단점ETag, If-None-Match
서버에서 완전히 캐시를 컨트롤하고 싶은 경우 ETag
를 사용하면 된다.
💡
ETag (Entity Tag)
캐시용 데이터에 임의의 고유한 버전 이름을 달아둔다.
ETag
만 보내서 같으면 유지하고 바르면 다시 받는다.Cache-Control
: 캐시 제어Pragma
: 캐시 제어 (하위 호환)Expires
: 캐시 유효 기간 (하위 호환)Cache-Control
📌 캐시 지시어(
directives
)
Cache-Control: max-age
- 캐시 유효 시간이고 초 단위이다.
Cache-Control: no-cache
- 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용해야 한다.
Cache-Control: no-store
- 데이터에 민감한 정보가 있기에 저장하면 안된다. (메모리에서 사용하고 최대한 빨리 삭제)
Pragma
캐시 제어 (하위 호환)
Pragma
: no-cache
HTTP 1.0
하위 호환Expires
캐시 만료일 지정 (하위 호환)
expires: Mon, 01 Jan 1990 00:00:00 GMT
HTTP 1.0
부터 사용Cache-Contol: max-age
를 권장한다. max-age
와 동시에 사용되면 Expires
는 무시된다. 웹 브라우저가 프록시 캐시 서버에 접근하도록 하는 것이다. → (원 서버에 비해) 응답 시간이 빨라짐.
그래서 한국 사람들이 많이 안보는 유튜브 영상을 보면 상대적으로 느리다!
Origin
) 서버 직접 접근한국에 있는 클라이언트에서 별 이미지가 필요한데 이 이미지가 미국에 있는 원 서버에 있다고 해보자.
한국에서 미국까지 이미지를 가져오려면 0.5초가 걸린다. 실제로 이것보다 훨씬 오래 걸릴 수도 있고, 만약 이 별 이미지가 자주 사용되는 이미지라면 이렇게 매번 미국에서 직접 가져오는 것은 너무 비효율적이다!
위의 문제를 해결하기 위해서 프록시 캐시가 도입되었다.
한국 어디간에 프록시 캐시 서버를 두고, 한국의 클라이언트(웹 브라우저)들은 이 프록시 캐시 서버에서 자료를 가져오도록 한다.
여러 사람이 찾은 자료일수록 이 프록시 캐시 서버에 등록되어있기 때문에 빠른 속도로 자료를 가져올 수 있다.
이때 클라이언트에서 사용되어 저장되는 캐시를 private 캐시
라고 하고, 프록시 캐시 서버의 캐시를 public 캐시
라고 한다.
Cache-Control
📌 캐시 지시어(
directives
) - 기타
Cache-Control
:public
- 응답이
public
캐시에 저장되어도 된다.Cache-Control
:private
- 응답이 해당 사용자만을 위한 것으로
private
캐시에 저장해야 한다(default
)Cache-Control
:s-maxage
- 프록시 캐시에만 적용되는
max-age
Age: 60
(HTTP 헤더)
- 오리진 서버에서 응답 프록시 캐시 내에 머문 시간(초)