Skip to content

5주차 기술공유

kyujonglee edited this page Dec 6, 2019 · 1 revision

기술 공유

예상시나리오

- 유저 로그인
- 개인 프로필 입력
- 메인페이지로 접속
- 피드작성
- 이미지 업로드
- 무한스크롤링
- 검색 (친구요청, 친구요청 수락)
- 친구가 남긴 피드 subscription
- 로그아웃

공유주제

브라우저 캐시

웹 캐쉬란 client가 요청하는 html, image, js, css등에 대해 첫 요청 시에 파일을 내려받아 특정 위치에 복사본을 저장(USING SPACE)하고, 이후 동일한 URL의 Resource요청은 다시 내려 받지 않고 내부에 저장한 파일을 사용하여 더 빠르게 서비스(SAVE TIME)하기 위한 것입니다. 응답 시간과 트래픽이 적어지므로 client와 server 둘다에게 도움이 됩니다. 이로 인해 성능이 향상되고 대역폭 소비가 최소화되어 개선된 환경이 만들어진다.

캐시는 빠른 억세스를 위해 값을 임시로 저장하는 데 사용되는 방식이다. 브라우저 캐시는 CSS, JS, 이미지, 비디오 등의 정적 리소스를 포함하는 작은 데이터베이스라고 할 수 있습니다.

Cache-Control

Cache-Control: no-store

  • 캐시는 클라이언트 요청 혹은 서버 응답에 관해서 어떤 것도 저장해서는 안됩니다.

Cache-Control: no-cache

  • 캐시된 복사본을 사용자에게 보여주기 이전에, 재검증을 위한 요청을 원 서버로 보내도록 강제합니다.

Cache-Control: must-revalidate

  • must-revalidate는 만료된 캐시만 서버에 확인을 받도록 하는 겁니다.

Cache-Control: public 또는 private

  • public이면 공유 캐시(또는 중개 서버)에 저장해도 된다는 뜻이고 private이면 브라우저같은 특정 사용자 환경에만 저장하라는 뜻입니다.

Cache-Control: public, max-age=3600

  • max-age로 캐시 유효시간을 줄 수 있습니다. 초 단위이므로 위 예제에서는 1시간입니다. 1시간이 지나면 이 응답 캐시는 만료된 것으로 여겨집니다.

no-store, no-cache, must-revalidate처럼 콤마로만 구분하면 혼합해서 쓸 수 있습니다.

Cache-Control을 응답 헤더라고 생각할 수 있지만, 요청 헤더로도 사용할 수 있습니다. 프론트 - 중개 서버 - 진짜 서버와 같은 구조인 경우에 중개 서버에 있는 캐시를 가져오지 않도록 하려면 요청 시부터 Cache-Control을 헤더로 넣어주곤 합니다.

Age

Age 헤더는 캐시 응답 때 나타나는데, max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려줍니다.

Expires

Cache-Control과 별개로 응답에 Expires라는 헤더를 줄 수도 있습니다.

Expires: Thu, 26 Jul 2018 07:28:00 GMT 응답 컨텐츠가 언제 만료되는지를 나타내며, Cache-Control의 max-age가 있는 경우 이 헤더는 무시됩니다.

ETag

ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭도 아낄 수 있습니다. 허나, 만약 내용이 변경되었다면, "mid-air collions" 이라는 리소스 간의 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하게 사용됩니다.

If-None-Match

서버보고 ETag가 달라졌는 지 검사해서 ETag가 다를 경우에만 컨텐츠를 새로 내려주라는 뜻입니다.

If-None-Match: W/"3bf2-wdj3VvN8/CvXVgafkI30/TyczHk" 만약 ETag가 같다면 서버는 304 Not Modified를 응답해서 캐시를 그대로 사용하게 합니다.

결론

캐시를 이용할 때 다음과 같은 사항을 주의해야 합니다.

일관된 URL 사용
  • 여러 다른 URL에서 동일한 콘텐츠를 제공하는 경우 해당 콘텐츠를 여러 번 가져오고 저장합니다. 팁: 참고로 URL은 대/소문자를 구분합니다.
서버가 유효성 검사 토큰(ETag)을 제공하는지 확인
  • 유효성 검사 토큰은 서버에서 리소스가 변경되지 않았을 때 동일한 바이트를 전송해야 할 필요성을 없애줍니다.
중간 캐시를 통해 캐시할 수 있는 리소스 식별
  • 모든 사용자에 대해 동일한 응답을 갖는 리소스는 CDN 및 기타 중간 캐시에 의해 캐시될 가능성이 큽니다.
각 리소스에 대해 최적의 캐시 수명 결정
  • 리소스별로 최신 상태 관련 요구사항이 각각 다를 수 있습니다. 각각에 대해 적합한 max-age를 감사하고 결정합니다.
사이트에 가장 적절한 캐시 계층 구조 결정
  • 리소스 URL과 콘텐츠 디지털 지문을 결합하여 사용하고 HTML 문서의 수명을 짧거나 no-cache로 설정하면 클라이언트가 얼마나 빠르게 업데이트를 입수할 수 있을지 제어할 수 있습니다.
이탈 최소화
  • 몇몇 리소스는 다른 리소스보다 더 자주 업데이트됩니다. 리소스에 자주 업데이트되는 특정 부분(예: 자바스크립트 함수 또는 CSS 스타일 집합)이 있다면 해당 코드를 별도의 파일로 제공하는 것이 좋습니다. 그렇게 하면 나머지 콘텐츠(예: 자주 변경되지 않는 라이브러리 코드)를 캐시에서 가져올 수 있으므로, 업데이트를 가져올 때마다 다운로드되는 콘텐츠의 양이 최소화됩니다.

참고사이트

https://cyberx.tistory.com/9

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ko

Clone this wiki locally