DUOLABS
웹사이트 · 웹서비스

웹 캐시

수정했는데 왜 옛날 게 보이냐는 질문이 여기서 나옵니다. 답은 캐시가 한 곳이 아니라서입니다. 방문자의 브라우저에도, 그 사이의 CDN 에도, 우리 서버 앞에도 각각 사본이 있습니다. 한 층만 비우면 다른 층이 그 자리를 다시 채웁니다.

한 문장으로

캐시는 한 번 만든 결과를 가까운 곳에 두었다가 다음 요청에 그대로 내주는 장치이고, 웹에서는 그 장치가 여러 층에 겹쳐 있습니다.

하는 일

  • 브라우저 캐시 — 방문자 컴퓨터 안의 사본. 우리가 직접 지울 수 없습니다
  • CDN 캐시 — 전 세계 거점에 흩어진 사본. 지역마다 따로 있습니다
  • 서버 캐시 — 만든 결과를 다시 안 만들려고 두는 사본
  • 만료 규칙 — 얼마나 오래 두고 언제 다시 물어볼지
  • 무효화 — 바꿨을 때 어느 층부터 비울지, 그 순서
  • 파일 이름에 버전 붙이기 — 아예 다른 파일로 만들어 캐시를 비켜 가기

하지 않는 일

  • 데이터베이스 조회 캐시 — 이름은 같지만 웹 응답 캐시와 다른 층입니다
  • 속도 개선 전반 — 캐시는 여러 방법 중 하나입니다
  • 로그인한 사용자별 화면 — 사람마다 다른 내용은 캐시 대상이 아닙니다

이웃 개념과 헷갈리는 지점

CDN전 세계 거점에 사본을 두는 서비스
CDN 은 캐시를 두는 장소이고 캐시는 그 안에서 일어나는 일입니다. CDN 을 쓴다고 자동으로 캐시가 잘 되는 것은 아닙니다.
브라우저 새로고침내 컴퓨터의 사본만 버리는 것
나에게는 새 화면이 보여도 다른 사람에게는 그대로일 수 있습니다. 확인은 시크릿 창이나 다른 기기로 해야 합니다.
정적 사이트미리 만들어 두는 방식
만드는 시점의 문제이고 캐시는 전달의 문제입니다. 정적으로 만들어도 캐시가 낡으면 옛날 화면이 나갑니다.
버전 붙이기파일 이름에 고유값을 넣는 것
캐시를 비우는 대신 아예 다른 파일로 만들어 비켜 갑니다. 이미지나 스크립트에는 잘 듣지만 페이지 주소에는 쓸 수 없습니다.

언제 필요한가

이럴 때 필요합니다

  • 내용을 고쳤는데 방문자에게 옛날 화면이 보인다는 말을 들을 때
  • 지역이나 사람에 따라 다른 화면이 보인다고 할 때
  • 이미지나 로고를 바꿨는데 예전 것이 계속 나올 때
  • 사이트가 느려서 개선이 필요할 때

아직 아니어도 됩니다

  • 방문자가 적고 내용이 자주 바뀌지 않는다면 기본 설정으로 충분합니다
  • 내용이 매번 달라지는 화면이라면 애초에 캐시할 대상이 아닙니다
  • 이미 배포할 때 무효화가 자동으로 돌고 있다면 손댈 것이 없습니다

여기서부터는 갈립니다

층이 몇 개이고 어디에 무엇이 걸려 있는지는 구성마다 다릅니다. 그래서 낡은 화면이 나올 때 어디를 비워야 하는지도 일반해가 없습니다. 다만 순서에는 규칙이 있습니다. 안쪽부터 비워야 합니다. 바깥쪽을 먼저 비우면 아직 낡은 안쪽 것을 다시 가져와 채웁니다. 그 순서를 지켜도 브라우저에 남은 사본은 우리가 지울 수 없어서, 일부 방문자에게는 만료 시간이 지날 때까지 옛날 화면이 남습니다.

자주 묻는 질문

사본이 여러 층에 있어서입니다. 서버는 새 내용을 갖고 있어도 그 사이의 거점이나 방문자 브라우저가 옛 사본을 그대로 내줍니다. 각 층의 만료 시간이 지나거나 비워 줄 때까지는 그렇습니다.

내 브라우저의 사본만 버립니다. 다른 방문자에게는 여전히 옛 화면이 나갑니다. 확인하실 때는 시크릿 창이나 휴대폰 데이터로 보시는 편이 정확합니다.

끌 수는 있지만 사이트가 느려지고 서버 부담이 커집니다. 캐시는 속도의 상당 부분을 담당합니다. 끄는 대신 바뀌었을 때 제대로 비우는 쪽으로 푸는 것이 보통입니다.

설정해 두면 됩니다. 안 되어 있으면 손으로 비워야 하고, 잊으면 옛 화면이 계속 나갑니다. 배포 과정에 무효화를 넣어 두는 것이 사고를 가장 많이 줄입니다.

자주 바뀌는 페이지는 짧게, 로고나 스크립트처럼 파일 이름에 버전을 붙일 수 있는 것은 아주 길게 두는 것이 기본입니다. 이름이 바뀌면 다른 파일이 되므로 오래 둬도 낡을 일이 없습니다.

범위가 애매해도 괜찮습니다

지금 상황만 알려 주시면 필요한 범위와 대략의 규모를 짚어 드립니다.