캐싱(Caching) - application의 속도를 향상 시켜주는 방법중 하나로, 이미 가져온 데이터나 계산된 결과값을 복사본으로 저장
이를 통해 향후 요청을 더욱 빠르게 처리 할 수 있도록 해줍니다. 대부분의 program은 동일한 데이터나 명령어에 반복하여 액세스 하기 때문에 캐싱은 효율적인 아키텍처 패턴으로 볼 수 있습니다.
웹 캐시(WEB Cache) - 사용자(client)가 웹 사이트(server)에 접속할 때, 정적 contents(img, js, css)들을 특정 위치(client, network... 등)에 저장합니다. 이후 동일한 URL의 웹 사이트 접속 시 , 해당 컨텐츠들을 매번 요청하는 것이 아니라, 특정 위치에서 불러옴으로써 응답시간을 줄이고, 서버 트래픽을 감소시키는 효과를 볼 수 있도록 해줍니다.
# 캐시를 어떻게 컨트롤 하는가?
1. HTML Meta Tags
<META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
위와 같이 HTML Meta Tag를 페이지에 삽입하는 방법이 있습니다. 하지만 예전 몇몇 브라우저에만 유효했고, 지금은 사용되지 않는 방법입니다.
2. HTTP Headers
요즘 사용하는 방식으로, HTTP Header를 이용합니다.
이전 파일과 비교하여 변경사항을 체크하는 Validation, 캐시의 만료 여부를 체크하는 freshness로 이루어져있습니다.
HTTP 헤더 지시문을 제공하여 브라우저가 응답을 캐싱할 수 있는 시기와 지속 기간을 지시할 때 사용됩니다.
HTTP 1.1의 Cache-Control은 하나의 값이 아니라 다양한 지시자를 ,를 이용하여 값을 전달할 수 있습니다. 그로 인해 여러가지 컨트롤이 가능합니다.
max-age=[sec] |
Expires 와 동일한 의미지만 고정된 절대 시간 값이 아닌 요청 시간으로부터의 상대적 시간을 표시 |
s-maxage=[sec] |
max-age와 동일한 의미지만 shared caches(예:proxy)에만 적용 명시된 경우 max-age나 Expires보다 우선순위를 가짐 |
public |
공유 캐시(또는 중개 서버)에 저장이 허용 됨 |
private | 특정 유저(사용자의 브라우저)만 캐시 하도록 설정 |
no-cache | 응답 데이터를 캐시하고는 있지만, 먼저 서버에 요청해서 유효성 검사(validation)을 하도록 강제 함 |
no-store | 어떤 상황에서도 해당 response 데이터를 저장하지 않음 |
no-transform | 이미지나 문서들의 성능향상을 위한 포맷변환을 허용치 않음 |
must-revalidate | fresh하지 않은 캐쉬 데이터임에도 불구하고 사용하는 경우를 방지 |
proxy-revalidate | must-revalidate와 유사, shared caches에만 적용 됨 |
# 캐시는 어떻게 동작하나?
브라우저는 서버에 index.html 파일을 요청 - 서버는 index.html을 탐색 후 존재하는 파일일시 파일 내용과 header값을 응답 - 브라우저는 응답 받은 내용을 브라우저에 표시 및 header값에 따른 캐시 정책 수행
(응답 헤더에 Last-Modified, Etag, Expires, Cache-Control:max-age 항목이 존재 한다면 복사본을 생성하고 값을 저장 )
① LAST-MODIFIED
1. 브라우저는 최초 응답시 받아온 Last-Modified 값을 If-Modified-Since라는 헤더에 포함시킨 후 페이지를 요청
2. 서버는 요청 파일의 수정시간을 If-Modified-Since 값과 비교, 값이 동일하다면 304 Not-Modified를 응답,
다르다면 200 OK와 함께 새로운 Last-Modified 값을 응답헤더에 전송
3. 브라우저는 Response Code가 304 Not-Modified면 캐시에서 페이지를 로드, 200 OK 일 시에는 새로 다운로드 받은후 Last-Modified 값을 갱신
② ETAG
1. 브라우저는 최초 응답시 받아온 Etag 값을 If-None-Match라는 헤더에 포함시켜 페이지를 요청
2. 서버는 요청 파일의 Etag 값을 If-None-Match의 값과 비교하여, 동일하다면 304 Not-Modified를 응답,
다르다면 200 OK와 함께 새로운 Etag 값을 응답헤더에 전송
3. 브라우저는 Response Code가 304 Not-Modified면 캐시에서 페이지를 로드, 200 OK 일 시에는 새로 다운로드 받은후 Etag 값을 갱신
③ Expires
브라우저는 최초 응답시 받은 Expire 시간과 비교하여, 기간내라면 서버를 거치지 않고 바로 캐시에서 로드시킴,
기간 만료시에는 Validation 작업을 수행 (변경사항 확인)
④ Cache-Control
ex) max-age
브라우저는 최초 응답시 받은 Cache-Control 중 max-age를 GMT와 비교, 기간내라면 서버를 거치지 않고 캐시에서 페이지를 로드, 만료시에는 Validation 작업을 수행
이 외에도 다른 Cache-Control들도 각자 가진 정책대로 역할을 수행
'아카이브' 카테고리의 다른 글
200316 / TIL (0) | 2020.03.16 |
---|---|
200315 / TIL (0) | 2020.03.15 |
200313 / TIL (0) | 2020.03.13 |
Django Pagination - 페이지네이션 (0) | 2020.03.13 |
200310 / TIL (0) | 2020.03.11 |