HTTP 완벽 가이드 7장 캐시

DARTZ·2022년 6월 5일
0

HTTP 완벽 가이드

목록 보기
1/11

캐시란?

웹 캐시는 자주 쓰이는 문서의 사본을 자동으로 보관하는 HTTP 장치이다.

캐시를 사용하는 이유

1. 불필요한 데이터 전송

복수의 클라이언트가 자주 쓰이는 하나의 서버에서 접근할 때, 서버는 클라이언트들에게 각각 한 번씩 전송하게 된다. 이때, 똑같은 바이트들이 네트워크를 통해서 반복해서 이동하는데 캐시를 이용하면 첫 번째 서버 응답은 캐시에 보관되고 캐시된 사본이 뒤이은 요청들에 대한 응답으로 사용할 수 있기 때문에 트래픽을 주고받는 낭비가 줄어들게 된다.

2. 대역폭 병목

네트워크 병목을 줄여준다. 대다수의 네트워크가 원격 서버보다 로컬 네트워크 클라이언트에 더 넓은 대역폭을 제공한다. 그래서 서버에 접근하는 것보다. 캐시로부터 사본을 가져온다면, 성능을 개선할 수 있다.

3. 갑작스런 요청 쇄도

갑작스런 사건으로 인해 많은 사람이 거의 동시에 웹 문서에 접근할 때 이런일이 발생한다.
ex) 연예인 스캔 기사들이 났을 때

4. 거리로 인한 지연

대역폭이 문제가 되지 않더라도, 거리가 문제가 될 수 있다. 거리가 멀면 당연히 문서를 받아오는 시간도 오래 걸린다. 캐시를 이용하면 근처에서 문서를 가져올 수 있기 때문에 그만큼 속도도 줄어든다.

5. 적중과 부적중

1) 캐시 적중 (cache hit): 캐시에 요청이 도착했을 때, 만약 그에 대응하는 사본이 있다면 그걸 이용해 요청이 처리될 수 있다. 이를 캐시 적중이라고 부른다.

2) 캐시 부적중 (cache miss): 만약 대응하는 사본이 없다면 그냥 원 서버로 전달되기만 할 뿐이다. 이것을 캐시 부적중이라고 부른다.

3) 재검사(revalidation): 웹 서버의 콘텐츠는 변경 될 수 있기 때문에, 캐시는 반드시 그들이 갖고 있는 사본이 최신인지 서버를 통해 점검해야한다. 이러한 '신선도 검사'를 HTTP 재검사라고 부른다.

이를 확인하기 위해서 가장 많이 쓰이는 것은 If-Modified-Since 헤더이다. 이를 서버에 보내는 GET 요청 헤더에 추가하면 캐시된 시간 이후에 변경된 경우에만 사본을 보내달라는 의미가 된다.

3가지 상황을 받을 수 있는데

<1> 변경되지 않았다면 304 Not Modified 응답을 보낸다.
<2> 바뀌었다면 200 OK 응답을 보낸다.
<3> 서버 객체가 삭제되었다면 404 Not Found 응답을 돌려보내며, 캐시는 사본을 삭제한다.

6. 캐시 토폴로지

캐시는 한 명의 사용자에게만 할당될 수도 있고 반대로 수천 명의 사용자들 간에 공유될 수도 있다. 한 명에게만 할당된 캐시를 개인 전용 캐시라고 부르고 공유된 캐시는 공용 캐시라고 부른다.

1) 개인 전용 캐시 (private cache): 웹브라우저에 내장하고 있고 사용자가 사이즈와 설정을 수정할 수 있도록 허용한다. 무엇이 있는지도 확인이 가능하다.

2) 공용 프락시 캐시 (public cache): 프락시 캐시는 로컬 캐시에서 문서를 제공하거나, 혹은 사용자의 입장에서 서버에 접근한다. 여러 사용자가 접근하기 때문에, 불필요한 트래픽을 줄일 수 있는 더 많은 기회가 있다.

7. 캐시 처리 단계

1) 요청 받기 - 캐시는 네트워크로부터 도착한 요청 메시지를 읽는다.
2) 파싱 - 캐시는 메시지를 파싱하여 URL과 헤더들을 추출한다.
3) 검색 - 캐시는 로컬 복사본이 있는지 검사하고, 사본이 없다면 사본을 받아온다. (그리고 저장)
4) 최신 검사 - 캐시는 캐시된 사본이 최신인지 검사하고, 최신이 아니라면 변경사항이 있는지 서버에게 물어본다.
5) 응답 생성 - 캐시는 새로운 헤더와 캐시된 본문으로 응답 메시지를 만든다.
6) 발송 - 캐시는 네트워크를 통해 응답을 클라이언트에게 돌려준다.
7) 로깅 - 선택적으로, 캐시는 로그파일에 트랜잭션에 대해 서술한 로그 하나를 남긴다.

8. 캐시를 최신으로 유지하기

캐시된 사본 모두가 항상 서버의 문서와 일치하는 것은 아니다.

1) 문서 만료: HTTP는 Cache-Control과 Expires라는 특별한 헤더들을 이용해서 서버가 각 문서에 유효기가을 붙일 수 있게 해준다. (우유의 유효기한이랑 비슷한 개념)

2) 유효기간과 나이:
<1> Cache-Control: max-age는 문서의 최대 나이를 정의힌다. (max-age=484200)
<2> Expires: 절대 유효기간을 명시한다. (Expires: Fri, 05 Jul 2002, 05:00:00 GMT)

3) 서버 재검사: 캐시가 원 서버에게 문서가 변경되었는지의 여부를 물어볼 필요가 있음을 의미
-> 만료되었을 경우에만 한 번만 서버와 재검사하면 된다.

4) 조건부 메서드와 재검사: 서버가 갖고 있는 문서가 캐시가 갖고 있는 것과 다른 경우에만 객체 본문을 보내달라고 하는 것이다.

<1>If-Modified-Since: < date > - 문서가 주어진 날짜 이후로 수정되었다면 요청 메서드를 처리 (IMS 요청으로 불린다.)
<2>If-None-Match: < tag > - 마지막 변경된 날짜를 맞춰보는 대신 문서에 대한 일련번호와 같이 동작하는 특별한 태그를 제공할 수 있다. 서버와 캐시된 태그가 다를 때만 요청을 처리

5) 약한 검사기와 강한 검사기: 콘테츠가 바뀔 때마다 바뀌는건 강한 검사기, 조금 변경되어 거의 비슷하다 생각되면 약한 검사기

9. 캐시 제어

HTTP는 문서가 만료되기 전까지 얼마나 오랫동안 캐시될 수 있게 할 것인지 서버가 설정할 수 있는 여러가지 방법을 정의한다.

  • Cache-Control: no-store - 캐시가 그 응답의 사본을 만드는 것을 금지한다.
  • Cache-Control: no-cache - 저장될 수는 있지만 먼저 서버와 재검사를 해야한다.
  • Cache-Control: must-revalidate - 서버와 최초의 재검사 없이는 제공해서는 안된다.
  • Cache-Control: max-age
  • Expires 날짜 헤더를 응답에 첨부할 수 있다.
  • 아무 만료 정보도 주지 않고, 캐시가 스스로 체험적인 방법으로 결정하게 할 수 있다.
profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글