이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.
캐시와 관련된 헤더들과 조건부 요청과 관련된 헤더들을 정리해보자!!
캐시는 캐시 제어와 관련된 헤더들이 있다.
Pragma나 Expires는 하위 호환을 위해서 사용할 뿐, 지금은 사실상 Cache-Control 다 할 수 있다.
no-cache
는 유효 기간이 있지는 않지만, 이 캐시를 사용하기 위해서는 항상 서버에 있는 데이터와 비교를 해서 검증한 뒤에 사용한다.
=> 서버에 있는 데이터가 바뀌었으면, 새 데이터가 올 것이고
=> 안 바뀌었으면, 304 상태 코드가 올 것이다. 그러면, 로컬에 저장되있는 캐시 데이터를 써도 된다.
원(origin) 서버
??
우리 눈에 보이지는 않지만, 중간에 캐시 프록시 서버 같은 것들이 존재한다. 이것들을 거쳐서 진짜 나한테 데이터를 보내주는 서버에 접근한다. no-cache
는 중간 캐시 서버들에서는 아무 것도 해서는 안 되고, 원(origin) 서버까지 가서 검증을 해야 된다는 뜻이다.
no-store
??
보통 캐시는 하드 디스크 같은 데 저장된다. 그러나, HTTP 응답 코드에 no-store
라고 적혀있으면, 로컬에 저장하지 말고 사용 후 최대한 빨리 삭제하라는 의미이다.
no-cache
와 no-store
의 차이를 구분하자!!
하위 호환이라 지금은 거의 사용하지 않는다.
그러나, 하위 호환 때문에 필요하다면 사용하기도 한다.
- max-age보다 Expires처럼 날짜를 지정해주는 게 더 편하지 않을까??
- 초단위로 하면, 지금부터 내일 00시까지 계산해서 그만큼 초를 넣으면 된다.
즉, 초단위가 훨씬 유연하게 지정할 수 있다.
조건부 요청 헤더는 총 4가지가 있는데, 각 헤더들이 어떤 검증 헤더들과 사용되는지를 알자!!
스펙에는 "오리진 서버"라고 하는 진짜 서버는
한국에 있는 여러 클라이언트들이 미국에 있는 서버에 접근하면, 거기서 실제 어플리케이션에서 이미지를 제공하는 오리진 소스가 있는 서버를 말한다.
다시 말해서, 원래의 "진짜 자원을 가진 서버"라고 해서 "원 서버" 라고 한다.
웹 브라우저의 요청이 미국까지 가려고 꽤 걸릴 것이다. 빛의 속도가 1초에 지구를 7바퀴 반 정도 돌리 때문에, 나름 느리다.
대략 요청이 도달하는데, 500ms가 걸린다고 하면, 사용자들은 전부 이미지 하나 다운로드 받는데, 500ms만큼 기다려야 한다.
그래서, "프록시 캐시"라는 캐시 서버를 도입한다.
보통 CDN 서비스 라고 해서, 위와 같은 원리를 많이하고 있다.
참고로, AWS는 클라우드 프론트 같은 것으로 CDN 서비스를 구현하고 있다.
미국에 있는 원 서버 입장에서는 한국에 있는 사용자들에 대한 응답이 너무 느리다.
그래서, 한국 어딘가에다가 "프록시 캐시 서버"를 넣어놓고, 요청이 오면, 원 서버로 바로 가는 것이 아니라, 이 "프록시 서버"를 거쳐서 오도록 한다.
웹 브라우저 들어오면, 기존에 있던 미국의 원 서버를 가는 게 아니라, DNS나 등등을 확인해보니까 한국에 있는 프록시 캐시 서버로 요청하도록 되어있네?? 라고 하면 IP를 거기로 받아서 거기로 요청을 한다.
한국에 있는 프록시 서버는 당연히 응답 시간이 빠르다!!
대충 100ms라고 가정하자!! 그러면, 400ms를 절약할 수 있다.
바로 이런 원리로, 우리는 YOUTUBE의 영상들을 빠르게 볼 수 있다.
유튜브 볼 때, 사람들이 잘 안 보는 외국 컨텐츠 같은 거 보면, 유튜브 동영상 다운로드가 되게 느리다.
근데, 사람들이 많이 보는 컨텐츠를 보면, 로딩속도가 되게 빠르다. 그 이유는 다 한국 어딘가에 있는 프록시 서버에서 다운로드 받는 원리이다.
글로벌 서비스들은 전부 다 이런 CDN 서비스를 주로 이용한다!!
그리고 캐시를 최초로 요청할 때는 다운로드가 느리다.
웹 브라우저3이 프록시 서버에 없는 데이터를 요청하면, 느리게 받지만, 웹 브라우저2가 같은 데이터를 요청하면 빠르게 받을 수 있다.
프록시 서버에 저장되 있는 캐시를 "public 캐시"라고 부른다.
=> 중간에서 공용으로 사용되니까 당연히 public 이라고 이해할 수 있다.
웹 브라우저에 저장되있는 캐시들을 "private 캐시"라고 부른다.
private
이라는 것은 중간에 위치한 "프록시 캐시" 서버에는 저장이 되면 안 된다는 의미이다.
예를 들어서)
로그인해서 보는 사용자 정보들이 프록시 캐시에 저장이 되면 큰 일난다.
그래서, Default 값은 항상 private이다!!
s-maxage
와 Age
는 특별한 것들인데, 이런 것들이 있다 정도만 알면 된다.