Build Up
캐시란?
데이터를 임시 저장소에 갖다 놓고 빠르게 엑세스 하기 위한 기술입니다.
장단점
캐시를 쓰면 데이터 손쉽게 가져올 수 있는 이점으로 빠르게 응답할 수 있는 장점이 있지만 자주 변경될 경우
캐시의 용량이 디스크에 비해 상당히 작고 비용이 비싸다는 단점이 있습니다.
네트워크 부분의 통신인 HTTP에서도 캐시기능을 지원합니다.
우리가 보고 있는 페이지를 보면 사진, 영상, 텍스트 등으로 이루어져 있고 모든 것이 HTTP를 통해 브라우저에 표현됩니다.
왜 캐시를 적극 활용해야 하는지 혹은 언제 어떨때 어떤 것을 사용하는지 알아볼 것입니다.
Why
빠른 사용자 경험을 위해 사용 := 불필요한 네트워크 전송을 절약
- 웹 브라우저에 사진, 영상, 텍스트 등 각각은 네트워크를 통해 전송되어서 브라우저에 도착해 화면에 그려줍니다.
- 해당 과정에서 서버에서 받아야할 리소스들이 더욱더 많아진다면, 페이지 로딩 즉 우리가 보이는 화면이 느려지게 되고 이러한 부분이 사용자 서비스 이탈율을 증가시킬 수 있습니다. 결국 느린 사용자 경험을 제공하는 것입니다.
- 이런 문제를 해결하기 위해 캐시를 적절히 사용한다면 네트워크에 전송되는 데이터 양을 절약하고 꼭 필요한 데이터 전송에만 쓸 수 있습니다. 와이파이가 아닌 스마트폰 셀룰러라면 해당 데이터의 송수신으로 인해 사용자들이 사용량이 많아지게 되면서 사용량만 축내는.. 안좋은 웹 서비스가 될 수 있습니다.
What & How
Browser
- http에서는 header에 cache-control이라는 지시어를 사용하여 캐시를 사용합니다.
- max-age: ${time}
- 일정 시간동안 원서버에 요청하지 않고 응답된 것을 캐시하여 사용한다는 의미입니다.
- last-modified (검증헤더)
- 마지막으로 변경된 시간으로 표현되며 캐시 시간 max-age 만료후 우선 last-modified의 조건부 헤더를 추가해 이전에 받은 last-modified 날짜와 비교를 하고 같다면 304 코드를 반환하고 body없이 응답하게 되면서 통신 자체는 발생하지만 전송량을 절약하는 효과를 얻을 수 있습니다
- 조건 헤더: last-modified-since
- 1초 미만 단위로 캐시 조정이 불가능하다는 단점이 있습니다.
- A→ B → A로 변경될 때 대상 자체가 달라지므로 A→B, B→A로 변경이 일어나면서 다운로드를 2회 수행하게 됩니다.
- 전체 적으로 봤을 때 결국 A임에도 불구하고도 불필요한 전송량을 낭비하고 있습니다.
- 해당 부문을 해결할 수 있는 것이 바로 Etag입니다.
- Etag (검증 헤더)
- 일정한 고유 값인 해시값 형태를 가지며 고유한 버전 이름을 가지고 있습니다.
- 예를 들어 ETag: "aaaaa"라고 달아두고, 데이터가 변경되면 이 이름을 바꿔서 변경(Hash 재생성)합니다. 예를 들어 ETag: 'aaaaa'에서 ETag: 'bbbbb'로 변경합니다. 만약 ETag가 같으면 캐시를 유지하고, 다르면 다시 받는 것입니다.
- 캐시 시간이 초과되면 ETage를 서버에 전달합니다. 같으면 304코드와 빈 Body를 새로운 Etag이면 네트워크를 통해 다운로드를 받습니다.
- no-cache: 캐시는 해도 되지만 항상 원서버로 검증하겠다 라는 것입니다.
- no-store: 민감 정보가 있으므로 저장하면 안돼! 라는 의미를 가진 속성 값입니다.

유효시간이 만료되면 다시 원서버로 요청을 하고 네트워크 다운로드가 발생하게 됩니다.
만약 원서버로 부터 똑같은 데이터를 받을 수 있는 경우가 있을 수 있게 되는데 시간에만 너무 의존적이게 됩니다. 이러한 부문을 해결하기 위해는 다음 last-modified 헤더를 이용할 수 있습니다.



단점


지금 까지 브라우저단 즉 사용자단의 캐시 활용방안에 대해 알아보았습니다. 이 외로 cache-control 지시어에 다른 속성들또한 있습니다.
기타 속성값
Proxy

유튜브를 예시로 들어보면, 유튜브를 운영하는 원 서버는 미국에 있겠지만, 한국에서 빠르게 유튜브 영상을 볼 수 있도록 프록시 캐시 서버를 둡니다. 한국에서 많이 시청하는 영상을 프록시 캐시 서버에 저장함으로써 한국의 유튜브 사용자에게 빠르게 영상을 볼 수 있게 돕습니다. 프록시 캐시를 활용할 때도 Cache-Control을 상세하게 조정할 수 있습니다.
cache-Control프록시 캐시 서버를 활용할 때, 추가적으로 활용할 수 있는 캐시 지시어가 3가지 있습니다.
- Cache-Control: public응답이 public 캐시에 저장되어도 됩니다. 여기서 public 캐시라는 것은 프록시 캐시 서버에 저장한다는 뜻입니다.
- Cache-Control: private응답이 해당 사용자만을 위한 것이라는 뜻입니다. 즉 사용자의 웹 브라우저에 저장되어야 한다는 뜻입니다.
- Cache-Control: s-maxage프록시 캐시에만 적용되는 max-age입니다.
캐시 무효화
- 캐시는 실시간적으로 변화가 많은 부분에는 적용해선 안됩니다. 왜냐하면 불특정 다수가 서로 다른 정보를 보게되고 공정성을 잃게 되며 안좋은 사용자 경험이 될 수 있기 때문입니다. 그렇기 때문에 해당 부분을 무효화 하기 위한 방법 또한 알고 있어야 합니다.
Chach-Control : no-Chach
Chach-Control : no-store
Chach-Control : must-revalidate: 캐시 만료 후 최초 조회시 원서버에 검증해야 합니다. 원서버 접근 실패시 504(badgateway timeout)이 발생해야 합니다.
must-revalidate와 no-chache의 차이
- 둘다 원서버로 부터 검증해야 하는 것은 동일하지만
- no-chache는 만약 원서버로 부터 504가 발생하면 캐시된 것이라도 보여주고 revalidate는 504를 클라이언트에게 전달합니다.

