사전 퍼지
개념

퍼지

gabury1고친 사람 github-actions[bot]

퍼지는 캐시에 남아 있는 사본을 운영자가 명령으로 지우는 일입니다. 보관 기한이 끝나기를 기다리지 않고 옛 내용을 바로 걷어 냅니다. 사본이 사라진 뒤의 요청은 원본에서 새 내용을 받아 갑니다. 캐시 밖에서도 쌓인 것을 한꺼번에 비우는 일을 같은 이름으로 부릅니다.

쉽고 빠른 이해

퍼지는 캐시에 남은 옛 사본을 지우라고 명령하는 일입니다. 상품 사진을 새로 올려도 사용자 화면에 옛 사진이 계속 뜰 때가 있습니다. 그때 그 사진의 주소를 대고 지우라고 합니다.

캐시는 보관 기한 동안 원본에 묻지 않고 사본을 내줍니다. 기한이 길수록 빠릅니다. 그 대신 원본을 고쳐도 기한이 다할 때까지 옛 내용이 나갑니다. 퍼지는 이 기다림을 건너뜁니다.

어떻게 도는가:

  1. 운영자가 지울 대상을 주소로 지목합니다
  2. 명령이 캐시 서버 전부에 닿습니다. 각 서버가 사본을 버립니다
  3. 다음 요청은 사본이 없어 원본에서 새 내용을 받아 다시 담습니다

대가도 있습니다. 지운 직후의 요청은 전부 원본까지 갑니다. 한꺼번에 많이 지우면 원본이 그 요청을 다 받아야 합니다. 사용자 브라우저에 담긴 사본은 퍼지로 지울 수 없습니다.

상세

편의점 가격표를 떠올려 봅시다. 본사가 값을 내리면 전 매장에 옛 가격표를 떼라고 한 번에 지시합니다. 매장은 가격표를 떼어 내기만 합니다. 새 값은 손님이 찾을 때 그제야 본사에서 받아 옵니다.

퍼지는 캐시에 보관된 사본을 운영자가 명령으로 지우는 일입니다. 캐시는 원본을 매번 부르지 않으려고 응답을 복사해 두는 저장소입니다. 퍼지는 그 사본의 보관 기한이 남아 있어도 지웁니다.

퍼지를 가장 자주 거는 곳은 CDN(Content Delivery Network, 콘텐츠 전송 네트워크)입니다. CDN 은 사용자 가까이에 캐시 서버를 흩어 두고 원본 대신 응답하는 망입니다. 먼 원본까지 가지 않아도 되니 응답이 빨라집니다.

엣지 서버는 CDN 이 흩어 둔 캐시 서버 하나하나입니다. 사용자의 요청은 가까운 엣지 서버가 받습니다.

쇼핑몰이 상품 사진을 새로 올렸다고 합시다. 사진 주소가 바뀌지 않았으니 엣지 서버들은 옛 사진을 계속 내줍니다. 운영자가 그 주소를 대고 퍼지를 걸면 엣지 서버들이 옛 사진을 버립니다. 다음 요청이 오면 엣지 서버는 원본을 가진 오리진 서버에서 새 사진을 받아 옵니다.

퍼지는 무효화의 한 방법입니다. 무효화는 사본을 더는 못 쓰게 만드는 일을 두루 가리킵니다. 퍼지는 그중에서 사람이 명령을 내려 사본을 지우는 방법입니다.

기한을 기다리지 않는 까닭

캐시는 사본마다 보관 기한을 둡니다. 기한이 남은 사본은 원본에 묻지 않고 바로 내줍니다.

기한을 길게 잡을수록 원본에 가는 요청이 줄어듭니다. 응답도 빨라집니다. 그 대신 원본을 고쳐도 기한이 다할 때까지 옛 내용이 나갑니다.

기한이 하루면 잘못 올린 공지가 하루 동안 보입니다. 가격을 잘못 적은 상품 페이지나 지워야 할 개인정보가 담긴 파일이라면 하루를 기다릴 수 없습니다. 퍼지는 이 기다림을 건너뛰려고 씁니다.

퍼지 명령이 지나가는 길

이 소절은 퍼지 명령 하나를 처음부터 끝까지 따라갑니다. 운영자, 엣지 서버, 오리진 서버, 사용자 넷이 나옵니다.

운영자는 대개 CDN 이 내주는 관리 화면이나 API(Application Programming Interface, 응용 프로그램 인터페이스)로 퍼지를 겁니다. API 는 프로그램이 다른 프로그램에 일을 시키는 통로입니다. 배포 스크립트 끝에 퍼지 호출을 넣어 두면 새 버전을 올릴 때마다 옛 사본이 저절로 지워집니다.

명령을 받은 엣지 서버는 사본을 버립니다. 그래서 다음 요청은 내줄 사본을 못 찾습니다. 캐시 미스는 사본이 없어 원본까지 가야 하는 경우를 말합니다.

sequenceDiagram
    participant 운영자
    participant 엣지 as 엣지 서버
    participant 오리진 as 오리진 서버
    participant 사용자
    운영자->>엣지: 이 주소의 사본을 지워라
    Note over 엣지: 사본을 버린다
    사용자->>엣지: 같은 주소를 요청한다
    Note over 엣지: 사본이 없다 · 캐시 미스
    엣지->>오리진: 원본을 달라
    오리진-->>엣지: 새 응답
    엣지-->>사용자: 새 응답을 내주고 다시 담는다

그림의 마지막 줄에서 엣지 서버는 새 응답을 다시 담습니다. 퍼지가 하는 일은 사본을 없애는 데까지입니다. 새 사본은 그다음 요청이 채웁니다.

그림은 엣지 서버를 하나만 그렸습니다. CDN 에는 엣지 서버가 여러 지역에 흩어져 있습니다. 명령이 그 전부에 닿아야 퍼지가 끝납니다.

지울 대상을 고르는 방법

퍼지는 무엇을 지울지 지목해야 돕니다. 지목하는 단위가 넓을수록 한 번에 많이 지웁니다. 아래 표는 흔히 쓰는 단위를 좁은 것부터 늘어놓았습니다.

단위 지목하는 법 쓰는 때
주소 하나 파일 하나의 전체 주소 사진 한 장이나 페이지 하나를 고쳤을 때
경로 앞부분 /products/ 처럼 주소의 앞부분 한 경로 아래를 한꺼번에 바꿨을 때
태그 응답에 미리 달아 둔 꼬리표 주소가 흩어진 여러 사본을 한 번에 지울 때
호스트 도메인 이름 하나 사이트 하나를 새로 띄웠을 때
전체 캐시에 든 모든 사본 설정을 크게 바꿨을 때

표에서 가장 쓸모가 큰 것은 태그입니다. 주소를 몰라도 내용의 성격으로 지울 수 있기 때문입니다.

태그는 오리진 서버가 응답의 헤더(본문 앞에 붙는 부가 정보 줄)에 실어 보내는 꼬리표입니다. 상품 42번에 딸린 응답마다 product-42 라는 태그를 달아 둘 수 있습니다. 태그를 싣는 헤더 이름은 CDN 마다 다릅니다.

flowchart TD
    P["퍼지 명령 · 태그 product-42"] -->|지운다| A["상품 페이지 · /products/42"]
    P -->|지운다| B["사진 · /images/42.jpg"]
    P -->|지운다| C["가격 조회 · /api/price/42"]

그림처럼 명령은 태그 하나만 댑니다. 그 태그가 달린 사본은 주소가 달라도 모두 지워집니다. 상품 정보가 바뀔 때 주소를 하나씩 모을 필요가 없습니다.

주소 하나를 대도 사본이 안 지워질 때가 있습니다. 캐시 키는 캐시가 사본마다 붙여 구별하는 이름표입니다. 대개 주소가 곧 키입니다. 설정에 따라 헤더 값이나 쿠키가 키에 섞이면 주소만 대서는 그 사본을 못 찾습니다.

버리는 퍼지와 표시만 하는 퍼지

흔한 퍼지는 사본을 바로 버립니다. 소프트 퍼지는 사본을 남겨 두고 낡았다는 표시만 붙이는 퍼지입니다.

표시가 붙은 사본은 다음 요청 때 원본에 먼저 물어봅니다. 사본이 아직 쓸 만한지 원본에 확인받는 이 절차를 재검증이라고 부릅니다. 원본이 바뀌지 않았다고 답하면 사본을 다시 씁니다.

표시만 해 두면 설정에 따라 원본이 멈췄을 때 낡은 사본이라도 내줄 수 있습니다. 바로 버린 사본으로는 그럴 수 없습니다. 지워야 할 개인정보처럼 한 번이라도 더 나가면 안 되는 내용에는 버리는 쪽을 씁니다.

퍼지와 헷갈리는 이웃

사본이 캐시에서 사라지는 길은 퍼지 말고도 있습니다. 누가 정하고 언제 일어나는지로 가르면 헷갈리지 않습니다.

이름 누가 정하나 언제 일어나나
만료 사본에 붙은 보관 기한 기한이 다했을 때
축출 캐시 자신 공간이 모자라 덜 쓰는 사본을 내보낼 때
퍼지 운영자 운영자가 명령을 내렸을 때

만료와 축출은 사람이 손대지 않아도 일어납니다. 퍼지만 사람이 내용이 바뀐 것을 알고 겁니다. 내용이 바뀐 것을 캐시가 스스로 알 길은 없어서 이 일은 사람 몫으로 남습니다.

퍼지가 닿지 않는 캐시

캐시는 서버 쪽에만 있지 않습니다. 사용자의 브라우저도 받은 응답을 제 기기에 담아 둡니다. 이것을 브라우저 캐시라고 부릅니다.

퍼지 명령은 운영자가 관리하는 캐시에만 닿습니다. CDN 의 엣지 서버가 그런 캐시입니다.

리버스 프록시는 서버 앞에서 요청을 대신 받아 넘겨주는 서버입니다. 여기에 둔 캐시도 운영자가 관리하므로 퍼지가 닿습니다.

사용자 기기에 담긴 사본은 퍼지로 지울 수 없습니다. 그 사본은 보관 기한이 다할 때까지 남습니다. 그래서 브라우저에 오래 담기는 파일은 퍼지 대신 주소를 바꾸는 방법을 씁니다.

해시는 내용에서 뽑아 낸 짧은 값입니다. 내용이 바뀌면 이 값도 바뀝니다. 그래서 파일이 바뀌었는지를 값 하나로 가릴 수 있습니다.

캐시 버스팅은 파일 이름에 이 해시를 붙여 새 주소로 내보내는 방법입니다. app.js 를 고치면 app.3f9a.js 처럼 이름이 바뀝니다. 새 주소에는 어느 캐시에도 사본이 없으니 모두 새 파일을 받아 갑니다.

옛 주소의 사본은 아무도 찾지 않으니 지울 필요도 없습니다. 첫 화면 주소처럼 이름을 바꿀 수 없는 주소는 이 방법을 못 씁니다. 그런 주소에 퍼지를 씁니다.

퍼지가 지는 대가

퍼지는 사본을 지우는 데서 끝나지 않습니다. 사본이 비는 순간부터 부담이 몇 가지 생깁니다.

첫째, 지운 사본을 다시 채울 때까지 요청이 원본으로 갑니다. 인기 있는 주소일수록 짧은 순간에 많은 요청이 오리진 서버에 몰립니다. 캐시 스탬피드는 같은 사본을 채우려는 요청이 이렇게 동시에 몰리는 일입니다.

둘째, 전체 퍼지는 이 부담을 모든 주소로 넓힙니다. 평소 캐시가 막아 주던 요청이 한꺼번에 원본에 닿습니다. 원본이 그 양을 견디도록 짜여 있지 않으면 사이트가 느려지거나 멈춥니다.

셋째, 명령이 모든 엣지 서버에 닿기까지 틈이 있습니다. 그동안 어떤 지역은 새 내용을, 어떤 지역은 옛 내용을 내줍니다. 퍼지를 건 직후에도 옛 내용이 보이면 이 틈일 수 있습니다.

넷째, CDN 은 대개 퍼지 호출 횟수에 한도를 둡니다. 배포할 때마다 주소를 수천 개씩 하나하나 지우도록 짜 두면 한도에 걸립니다. 그럴 때는 태그나 경로 앞부분으로 묶어 한 번에 지웁니다.

캐시 밖에서 쓰는 퍼지

퍼지라는 낱말은 캐시 말고도 여러 분야에서 씁니다. 뜻의 뼈대는 같습니다. 쌓인 것을 한꺼번에 지웁니다.

메시지 큐는 보내는 쪽과 받는 쪽 사이에 메시지를 쌓아 두는 중간 저장소입니다. 받는 쪽이 못 따라가면 메시지가 쌓입니다.

분야 퍼지가 지우는 것
메시지 큐 아직 처리하지 않은 채 쌓인 메시지 전부
데이터베이스 더는 아무도 읽지 않는 옛 기록

퍼지 논리와 퍼지 체크포인트의 「퍼지」는 다른 낱말입니다. 「흐릿하다」는 뜻의 영어 fuzzy 를 옮긴 것이라 지우는 일과 관계가 없습니다.

관련 항목

퍼지 명령이 오가는 캐시와 서버

CDN · 엣지 서버 · 오리진 서버 · 리버스 프록시 · 공유 캐시 · HTTP 캐시 · 캐싱

퍼지할 사본을 지목하는 수단

캐시 키 · URL · 태그 · Cache-Tag · 서로게이트 키 · 헤더 · 단일 파일 퍼지

사본을 쓸 수 없게 만드는 다른 절차

무효화 · 만료 · 축출 · 재검증 · 소프트 퍼지

사본이 낡았는지 가르는 기준

신선도 · TTL · max-age · s-maxage · Cache-Control · 낡은 데이터

퍼지가 닿지 않는 캐시와 그 우회 수단

브라우저 캐시 · 캐시 버스팅 · 해시 · 정적 자원

퍼지 직후 원본에 몰리는 부하와 그 대책

캐시 미스 · 캐시 스탬피드 · 썬더링 허드 · 캐시 워밍 · request collapsing · stale-while-revalidate · stale-if-error

퍼지 명령을 보내고 제한하는 수단

API · 배포 · 지속적 배포 · 속도 제한 · 토큰 버킷

퍼지 기능을 갖춘 CDN 과 프록시 제품

Cloudflare · Fastly · Akamai · Amazon CloudFront · Varnish · nginx

퍼지라는 낱말을 다른 뜻으로 쓰는 분야와 용어

메시지 큐 · 데이터베이스 · MVCC · 퍼지 논리 · 퍼지 체크포인트

다른 이름: purge · cache purge · 캐시 퍼지