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

웹사이트 캐시와 서버 내부 캐시를 이 사이트를 운영하는 서버에서 확인해 보니, 워드프레스 페이지 요청은 브라우저부터 CDN·페이지 캐시·OPcache·Redis 순서로 내려가다 사본이 있는 층에서 멈췄습니다. 원본 서버로 바로 들어온 페이지 요청은 nginx가 WP Rocket이 만든 HTML 파일을 바로 보내, PHP와 데이터베이스까지 내려가지 않았습니다.
Ⅰ. 워드프레스 캐시 구조
컴퓨터에서 캐시는 일시적인 데이터를 빠르게 접근할 수 있도록 임시 저장하는 기술로, 웹에서도 동일한 원리로 작동해 성능 향상에 크게 기여합니다.
캐싱은 데이터를 저장함으로써 웹 사이트에 방문자가 접속할 때 매번 서버에서 새로 요청하지 않고, 저장된 데이터를 빠르게 불러와 페이지 로딩 시간을 단축합니다. 이를 통해 서버 부하를 줄이고 사용자 경험을 개선할 수 있습니다.
워드프레스 요청에 쓰이는 캐시는 웹사이트 캐시와 서버 내부 캐시 두 갈래입니다. HTTP 캐시 표준은 방문자 한 사람의 브라우저에만 저장되는 캐시를 private cache로, 여러 방문자가 함께 쓰는 CDN·프록시 캐시를 shared cache로 나누며, 이 글에서는 이 둘을 웹사이트 캐시로 묶었습니다.
페이지 캐시와 OPcache, 오브젝트 캐시는 서버 안에서 워드프레스가 실행되는 과정에 붙는 캐시입니다. HTTP 표준에는 따로 분류가 없고, 워드프레스 공식 문서가 캐싱 플러그인(페이지 캐시)·오브젝트 캐시·서버 캐시(OPcache 같은 opcode 캐시)로 나눠 설명합니다.
캐시가 쓰이는 분야 전체는 캐시: 정의와 캐싱이 사용되는 모든 분야 글에, 캐시를 포함한 성능 최적화 네 갈래는 웹 성능 최적화: 구조와 정의 글에 정리했습니다.
아래 시뮬레이터에서 왼쪽 트리의 캐시를 고르고 칩을 누르면, 요청이 어느 층에서 멈추는지 볼 수 있습니다. 워드프레스 운영자가 캐시 플러그인으로 가장 먼저 켜는 층은 페이지 캐시입니다.
| 층 | 저장 위치 | 저장하는 것 | Nginx + Apache 구성 예 |
|---|---|---|---|
| 브라우저 캐시 | 방문자 기기 | HTML·CSS·JS·이미지·폰트 | CSS·이미지 7일 |
| CDN·프록시 캐시 | 서버 앞단(엣지·리버스 프록시) | 페이지·정적 파일 사본 | Bunny CDN |
| 페이지 캐시 | 서버 디스크·메모리 | PHP가 만든 HTML | WP Rocket + nginx |
| OPcache | 서버 메모리 | PHP 바이트코드 | PHP 8.3, JIT 끔 |
| 오브젝트 캐시 | 서버 메모리 | 쿼리 결과·객체 | Redis |
Ⅱ. 웹사이트 캐시
웹사이트 캐시는 서버가 응답 헤더로 저장 방법을 알려 주면, 방문자의 브라우저와 CDN·프록시가 그 지시대로 사본을 저장하는 캐시입니다. 대표적인 헤더는 [Cache-Control]·[ETag]·[Expires]이며, 저장 기간이 지나면 조건부 요청([304 Not Modified])으로 바뀌었는지 확인합니다.
1️⃣ 브라우저 캐시
브라우저 캐시는 방문자의 웹 브라우저에 저장되는 HTTP 캐시로, HTML·CSS·JavaScript·이미지·폰트를 저장해 두고 같은 리소스를 다시 요청할 때 서버까지 가지 않거나 바뀌었는지만 확인합니다.
저장 기간은 방문자가 아니라 서버가 정합니다. 아래 Nginx + Apache 구성 서버는 CSS와 이미지에 7일을 지시하고, HTML 페이지는 기간 없이 다시 방문할 때마다 확인하도록 응답합니다.
If-None-Match: "6ab12775-2ee8"cache-control: max-age=604800 expires: Sat, 17 Oct 2026 03:21:00 GMT etag: "6ab12775-2ee8"
etag: "6ac9298c-95575" last-modified: Fri, 09 Oct 2026 17:51:08 GMT
2️⃣ CDN · 프록시 캐시
CDN·프록시 캐시는 방문자와 원본 서버 사이에서 여러 방문자가 함께 쓰는 캐시입니다. 정방향 프록시는 기업 네트워크처럼 방문자 쪽 앞단에서, 역방향 프록시와 CDN은 서버 앞단에서 원본 서버 대신 저장된 사본으로 응답합니다.
대표적인 역방향 프록시는 Varnish Cache이며, Bunny CDN·Akamai 같은 CDN도 같은 구조를 따릅니다. 지역별 DNS를 쓰면 원본 서버가 있는 지역의 방문자는 원본 서버로 바로 연결하고, 다른 지역 방문자에게는 가까운 CDN 엣지(예: Bunny CDN)가 HTML까지 저장해 응답하도록 나눌 수 있습니다.
CDN의 구조와 이점은 CDN이란? CDN 사용 이유와 이점 5가지 글에 정리했습니다.
Ⅲ. 서버 내부 캐시
서버 내부 캐시는 요청이 원본 서버에 도착한 뒤 워드프레스가 페이지를 만드는 과정에 붙는 캐시입니다. Nginx + Apache로 구성한 서버는 아래 순서로 요청을 처리하며, 앞 단계에서 사본을 찾으면 뒤 단계는 거치지 않습니다.
Nginx + Apache 구성은 클라우드웨이즈와 스칼라호스팅에서 옵션으로 고를 수 있습니다. 클라우드웨이즈는 애플리케이션마다 하이브리드 스택(Nginx + Apache)과 라이트닝 스택(Nginx만) 중 하나를 고르고, 스칼라호스팅은 SPanel에서 Apache 앞에 Nginx를 붙이는 설정을 켤 수 있습니다.
| 캐시 | 저장하는 것 | 저장되는 때 |
|---|---|---|
| 1️⃣ 페이지 캐시 | 완성된 HTML 페이지 | 🅑 ⑤ 응답할 때 WP Rocket이 파일로 |
| 2️⃣ OPcache | 컴파일된 PHP 코드(바이트코드) | 🅑 ② PHP 파일을 처음 실행할 때 |
| 3️⃣ 오브젝트 캐시 | 쿼리 결과·옵션 같은 데이터 조각 | 🅑 ③ 워드프레스가 데이터를 처음 꺼낼 때 |
1️⃣ 페이지 캐시
페이지 캐시는 풀 페이지 캐시(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 OPcache | PHP 5.5부터 기본 포함 | 지금 쓰이는 표준 opcode 캐시이며, [opcache.enable=1]로 켭니다. |
| OPcache JIT | PHP 8부터 OPcache 안에 포함 | 바이트코드를 기계어로 한 번 더 바꿔 실행하며, [opcache.jit]로 켜고 끕니다. |
| APC | 개발 종료 | OPcache 이전에 쓰이던 opcode 캐시이며, 데이터 캐시 기능은 APCu로 이어졌습니다. |
| XCache | 개발 종료 | PHP 7을 지원하지 않습니다. |
| WinCache | Windows(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 & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.