웹사이트 캐시 & 서버 내부 캐시: 워드프레스 캐시가 작동하는 방식

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)

웹사이트 캐시와 서버 내부 캐시를 이 사이트를 운영하는 서버에서 확인해 보니, 워드프레스 페이지 요청은 브라우저부터 CDN·페이지 캐시·OPcache·Redis 순서로 내려가다 사본이 있는 층에서 멈췄습니다. 원본 서버로 바로 들어온 페이지 요청은 nginx가 WP Rocket이 만든 HTML 파일을 바로 보내, PHP와 데이터베이스까지 내려가지 않았습니다.

Ⅰ. 워드프레스 캐시 구조

컴퓨터에서 캐시는 일시적인 데이터를 빠르게 접근할 수 있도록 임시 저장하는 기술로, 웹에서도 동일한 원리로 작동해 성능 향상에 크게 기여합니다.

캐싱은 데이터를 저장함으로써 웹 사이트에 방문자가 접속할 때 매번 서버에서 새로 요청하지 않고, 저장된 데이터를 빠르게 불러와 페이지 로딩 시간을 단축합니다. 이를 통해 서버 부하를 줄이고 사용자 경험을 개선할 수 있습니다.

워드프레스 요청에 쓰이는 캐시는 웹사이트 캐시와 서버 내부 캐시 두 갈래입니다. HTTP 캐시 표준은 방문자 한 사람의 브라우저에만 저장되는 캐시를 private cache로, 여러 방문자가 함께 쓰는 CDN·프록시 캐시를 shared cache로 나누며, 이 글에서는 이 둘을 웹사이트 캐시로 묶었습니다.

페이지 캐시와 OPcache, 오브젝트 캐시는 서버 안에서 워드프레스가 실행되는 과정에 붙는 캐시입니다. HTTP 표준에는 따로 분류가 없고, 워드프레스 공식 문서가 캐싱 플러그인(페이지 캐시)·오브젝트 캐시·서버 캐시(OPcache 같은 opcode 캐시)로 나눠 설명합니다.

🗂️ 워드프레스 요청이 거치는 캐시
├─ 🌐 웹사이트 캐시HTTP 캐시 · MDN 분류
│ ├─ private cache브라우저 캐시
│ └─ shared cache
│ ├─ proxy cache회사·통신사 망의 프록시
│ └─ managed cacheCDN · 리버스 프록시(Varnish)
└─ 🖥️ 서버 내부 캐시워드프레스 공식 문서 분류
├─ 페이지 캐시캐싱 플러그인이 만든 정적 HTML(WP Rocket)
├─ OPcacheopcode 캐시 · PHP 실행
└─ 오브젝트 캐시요청이 끝나도 남는 데이터(Redis)

캐시가 쓰이는 분야 전체는 캐시: 정의와 캐싱이 사용되는 모든 분야 글에, 캐시를 포함한 성능 최적화 네 갈래는 웹 성능 최적화: 구조와 정의 글에 정리했습니다.

아래 시뮬레이터에서 왼쪽 트리의 캐시를 고르고 칩을 누르면, 요청이 어느 층에서 멈추는지 볼 수 있습니다. 워드프레스 운영자가 캐시 플러그인으로 가장 먼저 켜는 층은 페이지 캐시입니다.

🧭 캐시 층 시뮬레이터설명 시뮬레이터
🗂️ 워드프레스 요청이 거치는 캐시
🧰 요청 종류
브라우저 캐시
방문자의 브라우저에 저장되는 HTTP 캐시입니다. [이미지 · CSS]로 [첫 방문] → [다시 방문]을 누르면 두 번째부터 서버로 요청이 가지 않습니다.
HTTP 캐시 헤더
서버가 브라우저와 CDN에 저장 기간을 알려 주는 규칙입니다. 응답 기록의 헤더 줄은 Nginx + Apache 구성 서버에서 받은 실제 값입니다.
CDN · 프록시 캐시
여러 방문자가 함께 쓰는 사본입니다. [CDN 사용]을 켜고 [첫 방문] → [다시 방문]을 누르면 엣지에서 응답이 끝납니다.
페이지 캐시
PHP가 만든 HTML을 파일로 저장해 둡니다. [다시 방문]을 누르면 PHP와 데이터베이스까지 내려가지 않습니다.
OPcache
컴파일된 PHP 바이트코드를 메모리에 둡니다. [글 수정 뒤 방문]에서 PHP는 다시 실행되지만 컴파일은 건너뜁니다.
오브젝트 캐시
쿼리 결과를 Redis에 저장합니다. [글 수정 뒤 방문]에서는 바뀐 글 데이터만 MariaDB에서 다시 읽습니다.
전체 흐름
요청은 위에서 아래로 내려가다 사본이 있는 첫 층에서 멈춥니다.
층저장 위치저장하는 것Nginx + Apache 구성 예
브라우저 캐시방문자 기기HTML·CSS·JS·이미지·폰트CSS·이미지 7일
CDN·프록시 캐시서버 앞단(엣지·리버스 프록시)페이지·정적 파일 사본Bunny CDN
페이지 캐시서버 디스크·메모리PHP가 만든 HTMLWP Rocket + nginx
OPcache서버 메모리PHP 바이트코드PHP 8.3, JIT 끔
오브젝트 캐시서버 메모리쿼리 결과·객체Redis
브라우저 안에서만 동작하는 설명용 시뮬레이터입니다. 응답 기록의 헤더 줄은 2026년 10월 10일 Nginx + Apache 구성 서버에서 받은 값이며, 수정 뒤 ETag처럼 괄호로 적은 값은 예시입니다.

Ⅱ. 웹사이트 캐시

웹사이트 캐시는 서버가 응답 헤더로 저장 방법을 알려 주면, 방문자의 브라우저와 CDN·프록시가 그 지시대로 사본을 저장하는 캐시입니다. 대표적인 헤더는 [Cache-Control]·[ETag]·[Expires]이며, 저장 기간이 지나면 조건부 요청([304 Not Modified])으로 바뀌었는지 확인합니다.

1️⃣ 브라우저 캐시

브라우저 캐시는 방문자의 웹 브라우저에 저장되는 HTTP 캐시로, HTML·CSS·JavaScript·이미지·폰트를 저장해 두고 같은 리소스를 다시 요청할 때 서버까지 가지 않거나 바뀌었는지만 확인합니다.

저장 기간은 방문자가 아니라 서버가 정합니다. 아래 Nginx + Apache 구성 서버는 CSS와 이미지에 7일을 지시하고, HTML 페이지는 기간 없이 다시 방문할 때마다 확인하도록 응답합니다.

📨 응답 헤더 실측Nginx + Apache 구성 · 2026-10-10
💻 방문자 컴퓨터브라우저 캐시
──────▶① 첫 요청GET /style.css
🖥️ 웹사이트 서버Nginx + Apache
💻 방문자 컴퓨터브라우저 캐시
◀──────② 파일 + 저장 지시cache-control: max-age=604800
🖥️ 웹사이트 서버Nginx + Apache
③ 브라우저가 지시대로 7일 동안 저장하고, 그 사이 다시 방문하면 서버로 요청을 보내지 않습니다.
💻 방문자 컴퓨터브라우저 캐시
──────▶④ 기한이 지난 뒤 확인If-None-Match: "6ab12775-2ee8"
🖥️ 웹사이트 서버Nginx + Apache
💻 방문자 컴퓨터브라우저 캐시
◀──────⑤ 바뀌지 않음HTTP/2 304 (본문 없음)
🖥️ 웹사이트 서버Nginx + Apache
🖼️ CSS · 이미지
cache-control: max-age=604800
expires: Sat, 17 Oct 2026 03:21:00 GMT
etag: "6ab12775-2ee8"
브라우저가 7일 동안 서버에 다시 묻지 않고 저장된 사본을 씁니다.
📄 HTML 페이지
etag: "6ac9298c-95575"
last-modified: Fri, 09 Oct 2026 17:51:08 GMT
저장 기간 지시가 없어, 다시 방문하면 ETag로 바뀌었는지 먼저 묻습니다.
같은 ETag로 다시 요청하면 서버는 본문 없이 [HTTP/2 304]만 돌려주고, 브라우저는 저장된 사본을 그대로 씁니다.

2️⃣ CDN · 프록시 캐시

CDN·프록시 캐시는 방문자와 원본 서버 사이에서 여러 방문자가 함께 쓰는 캐시입니다. 정방향 프록시는 기업 네트워크처럼 방문자 쪽 앞단에서, 역방향 프록시와 CDN은 서버 앞단에서 원본 서버 대신 저장된 사본으로 응답합니다.

대표적인 역방향 프록시는 Varnish Cache이며, Bunny CDN·Akamai 같은 CDN도 같은 구조를 따릅니다. 지역별 DNS를 쓰면 원본 서버가 있는 지역의 방문자는 원본 서버로 바로 연결하고, 다른 지역 방문자에게는 가까운 CDN 엣지(예: Bunny CDN)가 HTML까지 저장해 응답하도록 나눌 수 있습니다.

👤 원본 서버 지역 방문자DNS가 원본 주소를 줌
→
🖥️ 원본 서버CDN을 거치지 않고 바로 응답합니다.
👤 다른 지역 방문자DNS가 가까운 엣지 주소를 줌
→
☁️ Bunny CDN 엣지HTML·파일 사본이 있으면 여기서 응답합니다.
→
🖥️ 원본 서버엣지에 사본이 없을 때만 갑니다.

CDN의 구조와 이점은 CDN이란? CDN 사용 이유와 이점 5가지 글에 정리했습니다.

Ⅲ. 서버 내부 캐시

서버 내부 캐시는 요청이 원본 서버에 도착한 뒤 워드프레스가 페이지를 만드는 과정에 붙는 캐시입니다. Nginx + Apache로 구성한 서버는 아래 순서로 요청을 처리하며, 앞 단계에서 사본을 찾으면 뒤 단계는 거치지 않습니다.

🅐 페이지 캐시에 파일이 있을 때로그인하지 않은 방문자의 페이지 요청 대부분
① nginx가 요청을 받음원본 서버에 도착한 요청을 웹 서버가 받습니다.
↓
1️⃣ 페이지 캐시 ↓② 페이지 캐시 파일로 응답WP Rocket이 만든 HTML 파일을 nginx가 그대로 보냅니다.x-rocket-nginx-serving-file: HIT
PHP · OPcache · Redis · MariaDB를 거치지 않고 끝납니다.
🅑 페이지 캐시에 파일이 없을 때캐시를 비운 직후 첫 방문 · 로그인 화면 · AJAX 요청
① nginx가 요청을 받음파일이 없으니 Apache로 넘깁니다.
↓
2️⃣ OPcache ↓② PHP 실행 · OPcache워드프레스 PHP 파일을 컴파일된 바이트코드로 실행합니다.
↓
3️⃣ 오브젝트 캐시 ↓③ 오브젝트 캐시(Redis)저장된 쿼리 결과·객체는 Redis에서 가져옵니다.
↓
④ MariaDBRedis에 없는 데이터만 조회하며, 자주 쓰는 데이터는 InnoDB 버퍼 풀(메모리)에서 읽습니다.
↓
⑤ 응답 · 페이지 캐시 저장완성된 HTML을 보내고 WP Rocket이 파일로 저장해, 다음 요청은 🅐로 처리됩니다.
Nginx + Apache 구성 기준(페이지 캐시 파일이 없을 때만 Apache·PHP로 넘김), 2026-10-10 확인.

Nginx + Apache 구성은 클라우드웨이즈와 스칼라호스팅에서 옵션으로 고를 수 있습니다. 클라우드웨이즈는 애플리케이션마다 하이브리드 스택(Nginx + Apache)과 라이트닝 스택(Nginx만) 중 하나를 고르고, 스칼라호스팅은 SPanel에서 Apache 앞에 Nginx를 붙이는 설정을 켤 수 있습니다.

🖥️ Nginx + Apache 구성을 고를 수 있는 호스팅
Cloudways애플리케이션마다 스택 선택
하이브리드 스택Nginx + Apache
라이트닝 스택Nginx만
Cloudways →
ScalaHostingSPanel 웹 서버 설정
기본Apache
Nginx 켜기Nginx + Apache
ScalaHosting →
캐시저장하는 것저장되는 때
1️⃣ 페이지 캐시완성된 HTML 페이지🅑 ⑤ 응답할 때 WP Rocket이 파일로
2️⃣ OPcache컴파일된 PHP 코드(바이트코드)🅑 ② PHP 파일을 처음 실행할 때
3️⃣ 오브젝트 캐시쿼리 결과·옵션 같은 데이터 조각🅑 ③ 워드프레스가 데이터를 처음 꺼낼 때

1️⃣ 페이지 캐시

  • ↪️ 풀 페이지 캐시 or HTML 캐시

페이지 캐시는 풀 페이지 캐시(full-page cache)라고도 하며, 저장하는 것이 HTML이라 HTML 캐시로 부르기도 합니다. PHP가 만든 웹페이지 전체를 정적인 HTML 파일로 저장해 두었다가, 같은 페이지 요청에 PHP를 실행하지 않고 그 파일을 보냅니다. 위 처리 순서에서 🅐의 경우입니다.

저장 위치는 서버 메모리(RAM) 또는 디스크(HDD/SSD)이며, 메모리는 빠르지만 비용이 높고 용량이 제한적이고, 디스크는 용량이 넉넉하지만 상대적으로 느립니다.

종류예시저장·응답 방식
캐시 플러그인WP Rocket · WP Super Cache · W3 Total Cache · Cache Enabler워드프레스가 페이지를 HTML 파일로 저장하고, 웹 서버가 그 파일을 보냅니다.
웹 서버 캐시Nginx FastCGI 캐시 · LiteSpeed Cache웹 서버가 PHP 응답을 직접 저장해 다음 요청에 보냅니다.
리버스 프록시 캐시Varnish웹 서버 앞에 둔 캐시 서버가 페이지를 저장해 응답합니다.

Nginx + Apache 구성에서는 WP Rocket이 만든 HTML 파일을 nginx가 직접 읽어 보내며, 응답 헤더에 [x-rocket-nginx-serving-file: HIT]가 붙습니다. WP Rocket으로 페이지 캐시를 켜고 설정하는 순서는 WP Rocket 설정 가이드 글에 정리했습니다.

2️⃣ OPcache

OPcache는 PHP 코드를 미리 컴파일한 바이트코드를 메모리에 저장해, 같은 파일을 다시 실행할 때 PHP 파서를 거치지 않게 합니다. PHP 5.5부터 기본으로 들어 있으며, 예전에 쓰이던 APC와 XCache는 PHP 7을 지원하지 않아 지금은 쓰이지 않습니다. 위 처리 순서 🅑의 ②단계에 해당합니다.

종류상태설명
Zend OPcachePHP 5.5부터 기본 포함지금 쓰이는 표준 opcode 캐시이며, [opcache.enable=1]로 켭니다.
OPcache JITPHP 8부터 OPcache 안에 포함바이트코드를 기계어로 한 번 더 바꿔 실행하며, [opcache.jit]로 켜고 끕니다.
APC개발 종료OPcache 이전에 쓰이던 opcode 캐시이며, 데이터 캐시 기능은 APCu로 이어졌습니다.
XCache개발 종료PHP 7을 지원하지 않습니다.
WinCacheWindows(IIS) 서버용워드프레스 공식 문서가 OPcache와 함께 드는 opcode 캐시입니다.

OPcache는 PHP 설정 [opcache.enable=1]로 켜며, PHP 8 이후 들어온 JIT는 [opcache.jit=disable]로 따로 끌 수 있습니다. 설치와 설정은 Zend OPcache 개념과 설치 및 설정 글에 있습니다.

3️⃣ 오브젝트 캐시

오브젝트 캐시는 데이터베이스 쿼리 결과나 계산한 객체를 Redis·Memcached 같은 메모리 저장소에 저장합니다. 워드프레스는 기본으로 한 번의 요청 안에서만 객체를 기억하며, Redis 같은 저장소를 붙여야 요청이 끝난 뒤에도 결과가 남습니다. 위 처리 순서 🅑의 ③단계에 해당합니다.

종류구분요청이 끝나도 남는가설명
WP_Object_Cache워드프레스 기본아니요한 번의 요청 안에서만 기억하는 내장 캐시입니다.
Redis오브젝트 캐시예별도 메모리 저장소이며, Redis Object Cache 플러그인의 드롭인으로 연결합니다.
Memcached오브젝트 캐시예별도 메모리 저장소입니다.
APCu오브젝트 캐시예(같은 서버 안)PHP가 쓰는 공유 메모리에 저장합니다.
파일오브젝트 캐시예디스크에 파일로 저장합니다.
InnoDB 버퍼 풀데이터베이스 자체 캐시 · 오브젝트 캐시 아님예MySQL·MariaDB가 테이블 데이터와 인덱스를 메모리에 올려 둡니다.
쿼리 캐시데이터베이스 자체 캐시 · 오브젝트 캐시 아님—MySQL 8.0에서 제거됐고, MariaDB에는 남아 있지만 기본으로 꺼져 있습니다.

워드프레스는 Redis Object Cache 플러그인이 넣는 드롭인 파일([object-cache.php])로 Redis에 연결합니다. 설치 과정은 워드프레스 Redis Cache 설치 및 설정 글에 있습니다.

🔢 FAQ & 추천 콘텐츠

페이지 캐시나 CDN에 남은 옛 사본이 응답하는 경우입니다. 캐시 플러그인에서 그 글의 캐시를 비우고, CDN을 쓰면 CDN의 사본도 함께 비웁니다.

WP Rocket 같은 페이지 캐시 플러그인은 기본 설정에서 로그인한 사용자에게 저장된 페이지를 보내지 않습니다. 관리자 화면과 로그인 상태의 페이지는 매번 PHP가 새로 만들며, 이때는 OPcache와 오브젝트 캐시가 속도를 받칩니다.

크롬에서 [Ctrl+Shift+R](맥은 [Cmd+Shift+R])을 누르면 지금 페이지를 캐시 없이 다시 불러옵니다. 저장된 캐시 전체는 오른쪽 위 [더보기] → [인터넷 사용 기록 삭제]에서 [캐시된 이미지 및 파일]을 골라 지웁니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 2   +   10   =