[AX 보안 패치 리포트] PHP 8.3.29 → 8.5.12: 운영 중인 WordPress를 안전하게 갈아탄 기록

AX SECURITY PATCH REPORT · 2026.10.23

운영 중인 WordPress를 멈추지 않고
PHP 8.3.29에서 8.5.12로 전환했다

긴급 보안 릴리스 확인부터 호환성 검사, 전체 백업, 자동 롤백 조건, 실제 서비스 검증까지. “업데이트했다”가 아니라 “안전하게 업데이트됐음을 증명한” 작업 기록이다.

8.3.29 → 8.5.12PHP 런타임 전환
1,855개PHP 파일 사전 검사
964MB파일·DB 전체 백업
0건Fatal·Parse 오류

1. 프롤로그: 어제는 JSN, 오늘은 이 블로그였다

하루 전에는 10년 묵은 JSN 레거시를 PHP 8.5 환경으로 전면 현대화한 기록을 남겼다. 그런데 이번에는 대상과 접근법이 달랐다. JSN이 낡은 애플리케이션 자체를 다시 세우는 공사였다면, blog.soohwalee.com은 이미 운영 중인 WordPress를 손상 없이 최신 보안 런타임으로 옮기는 정밀 수술에 가까웠다.

계기는 2026년 10월 21일 공개된 PHP 보안 릴리스였다. PHP 프로젝트는 PHP 8.5.12를 보안 릴리스로 발표했고, 같은 날 공개된 권고문은 웹에서 PHP를 제공하는 환경에 영향을 주는 두 건의 인증 없는 원격 코드 실행 취약점을 설명했다. 특히 Apache 모듈 방식인 mod_php가 가장 높은 위험군으로 지목됐다.

왜 바로 움직였나
CVE-2026-109618과 CVE-2026-109619는 단순 정보 노출이 아니라 원격 코드 실행으로 이어질 수 있는 취약점이다. 이 블로그 역시 Apache의 apache2handler로 PHP를 실행하고 있었기 때문에 “사이트가 정상으로 보인다”는 이유로 기다릴 수 없었다.

WordPress 측도 이 문제는 WordPress 코어의 결함이 아니라 PHP 자체의 취약점이며, 사이트 소유자가 PHP를 즉시 업데이트해야 한다고 별도로 안내했다. 결론은 명확했다. 고칠 대상은 콘텐츠나 테마가 아니라, 그 아래에서 모든 요청을 실행하는 PHP 런타임이었다.

2. 첫 번째 함정: latest라고 최신은 아니었다

운영 환경은 Docker Compose 기반이었고 WordPress 이미지 설정에는 wordpress:latest가 적혀 있었다. 얼핏 보면 최신 버전을 쓰는 것 같지만, 실제 서버가 실행하던 로컬 이미지는 약 7개월 전에 받아 둔 것이었다. 컨테이너는 정상적으로 재시작되고 있었지만 이미지를 새로 가져오지 않는 한 내부 PHP는 계속 8.3.29에 머문다.

latest 태그의 정확한 의미
“항상 자동으로 최신 상태를 유지한다”가 아니라, “레지스트리에서 새로 받을 때 기본 최신 태그를 가리킨다”에 가깝다. 운영 점검에서는 설정 파일의 태그보다 현재 실행 중인 컨테이너 내부 버전을 확인해야 한다.

진단 결과는 다음과 같았다.

점검 항목 업데이트 전 상태 판단
PHP 8.3.29 긴급 보안 릴리스 반영 필요
WordPress 7.1.3 현 상태 유지
데이터베이스 MariaDB 10.6 변경 대상 아님
웹 서버 방식 Apache · apache2handler 취약점 권고상 우선 대응 대상
활성 플러그인 7개 PHP 8.5 호환성 사전 확인 필요

3. 버전 숫자를 바꾸기 전에 안전장치부터 만들었다

운영 서버의 업그레이드는 “새 이미지가 실행되는가”만으로 성공을 판단할 수 없다. 테마·플러그인·업로드 파일·데이터베이스가 함께 움직이고, 실패하면 사용자가 바로 영향을 받는다. 그래서 아래 순서를 바꾸지 않았다.

1

새 이미지를 운영과 분리해 먼저 검증

공식 wordpress:php8.5-apache 이미지를 미리 받아 PHP 8.5.12가 포함됐는지 확인했다. 서버의 ARM64 아키텍처 지원 여부와 필요한 확장 모듈도 실제 이미지 안에서 검사했다.

2

운영 코드를 읽기 전용으로 연결해 구문 검사

운영 컨테이너를 교체하기 전에 새 PHP 8.5 환경에 wp-content를 읽기 전용으로 연결했다. 테마와 플러그인을 포함한 PHP 파일 1,855개를 전수 검사했고 구문 오류는 0건이었다.

3

파일과 데이터베이스를 함께 백업

WordPress 데이터 볼륨, 데이터베이스 덤프, 배포 설정을 한 시점에 묶어 백업했다. 압축 파일 생성으로 끝내지 않고 DB 압축 무결성과 각 파일의 SHA-256 체크섬까지 확인했다. 최종 백업 크기는 약 964MB였다.

4

실패 조건과 복구 절차를 배포 전에 고정

원래 설정과 이전 이미지 정보를 보존하고, 새 컨테이너 기동 실패·PHP 버전 불일치·WordPress 부트스트랩 실패·치명적 로그 발생 시 즉시 되돌릴 조건을 정했다. 롤백은 문제가 생긴 뒤 고민하는 문서가 아니라 배포 절차의 일부가 됐다.

사전검사의 핵심
기존 서비스는 계속 운영한 채 새 런타임에서 코드를 먼저 검사했다. 실제 전환 전에 가장 흔한 실패 원인인 PHP 구문 비호환을 제거했고, 문제가 있더라도 사용자는 전혀 영향을 받지 않는 단계에서 발견할 수 있었다.

4. 전환: 바꾼 것은 런타임, 지킨 것은 운영 상태

검증이 끝난 뒤 이미지 태그를 움직이는 latest 대신 wordpress:php8.5-apache로 명시하고 WordPress 컨테이너만 다시 만들었다. 데이터 볼륨과 데이터베이스는 그대로 유지했기 때문에 콘텐츠·미디어·사용자·설정에는 손대지 않았다.

항목 Before After
PHP 8.3.29 8.5.12
Apache 2.4.65 2.4.69
WordPress 이미지 wordpress:latest wordpress:php8.5-apache
WordPress 코어 7.1.3 7.1.3 · 변경 없음
데이터베이스 MariaDB 10.6 MariaDB 10.6 · 변경 없음
활성 플러그인 7개 7개 · 변경 없음
업로드 한도 64MB 64MB · 변경 없음

이 방식의 장점은 영향 범위가 분명하다는 데 있다. PHP와 Apache가 포함된 애플리케이션 런타임만 교체하고, 데이터 계층과 WordPress 애플리케이션 상태는 보존했다. 문제가 생기면 이전 이미지로 되돌릴 수 있고, 데이터 복원이 필요할 때만 검증된 백업을 사용하면 된다.

5. “켜졌다”가 아니라 “정상 동작한다”를 검증했다

컨테이너가 실행 중이라는 표시는 시작점일 뿐이다. 내부 런타임, WordPress 부트스트랩, 데이터베이스 연결, 확장 모듈, 공개 URL, 오류 로그, 관리자 화면을 순서대로 확인했다.

  • PHP 8.5.12와 Apache 2.4.69가 실제 운영 컨테이너에서 실행됨을 확인
  • WordPress 코어가 데이터베이스에 연결되고 버전 7.1.3으로 정상 부트스트랩됨을 확인
  • mysqli, curl, mbstring, imagick, intl, zip, OPcache, GD, Sodium 등 필수 확장 모듈 확인
  • 홈, REST API, 사이트맵, 대표 게시글이 외부에서 모두 HTTP 200을 반환
  • 운영 로그에서 PHP Fatal error, Parse error, Uncaught 오류가 0건임을 확인
  • WordPress ‘사이트 건강’ 화면에서 PHP 8.5.12, OPcache 활성화, Imagick 지원과 전체 상태 ‘양호’를 최종 확인
최종 결과
PHP 8.3.29에서 8.5.12로 전환 완료. 사전 검사 1,855개 파일 모두 통과, 공개 서비스 핵심 경로 모두 정상, 치명적 PHP 오류 0건. 준비한 롤백 절차는 실행할 필요가 없었다.

6. 이번 작업에서 다시 확인한 운영 원칙

① 정상 화면은 안전하다는 증거가 아니다

업데이트 전에도 블로그는 멀쩡하게 열렸다. 하지만 보안 취약점은 장애처럼 먼저 자신을 드러내지 않는다. 버전과 실행 방식을 확인해야만 보이는 위험이 있다.

② 백업은 “있다”가 아니라 “복구에 쓸 수 있다”여야 한다

파일 백업과 DB 덤프를 함께 만들고 압축 무결성, 체크섬, 이전 설정까지 남겼다. 백업의 목적은 안심이 아니라 복구 가능성을 증명하는 것이다.

③ 호환성 검사는 운영 전환보다 먼저 끝내야 한다

테마와 플러그인을 새 PHP 컨테이너에서 읽기 전용으로 검사한 덕분에, 전환 시간에는 이미 확인한 코드를 실행하기만 하면 됐다. 위험한 발견을 사용자 트래픽이 흐르는 순간까지 미루지 않았다.

④ 자동화의 가치는 속도보다 통제력에 있다

이번 작업에서 AI 에이전트는 진단, 공식 보안 공지 확인, 이미지 검증, 전수 검사, 백업 무결성 확인, 배포, 운영 검증을 하나의 흐름으로 연결했다. 빠른 실행보다 더 중요했던 것은 각 단계마다 성공 조건과 중단 조건을 명확히 둔 점이다.

보안 업데이트의 핵심은 새 버전을 설치하는 일이 아니다.
실패해도 돌아올 수 있게 만든 뒤,
실제 운영 결과로 성공을 증명하는 일이다.

JSN 현대화가 “오래된 시스템을 최신 기준으로 다시 세우는 법”에 대한 기록이었다면, 이번 blog.soohwalee.com 작업은 “살아 있는 서비스를 안전하게 최신 상태로 옮기는 법”에 대한 기록이다. 대상은 달랐지만 결론은 같았다. AI가 실행 속도를 높여도, 운영의 기준은 끝까지 검증 가능성과 복구 가능성이어야 한다.

공식 참고 자료

※ 이 글의 버전과 검증 수치는 2026년 10월 23일 실제 blog.soohwalee.com 운영 환경을 기준으로 기록했다.

댓글 남기기