오래 굴려 온 개인 블로그이 틀을 처음부터 다시 만들었다. 테마를 직접 짜서 갈아 끼우고, 플러그인을 24개에서 14개로 줄이고, 카테고리를 다시 나눈 다음, 서버까지 새 인스턴스로 옮겼다. 글 222편과 이미지 1.3GB를 그대로 살렸다.
작업은 총 3일 걸렸다. 혼자였으면 몇 주가 걸렸거나 아마 시작도 못 했을 일인데, 클로드 코드를 붙여 놓고 하니 진도가 전혀 다르게 나갔다. 그 과정에서 몰랐던 보안 구멍도 여럿 메웠다. 무엇이 어떻게 줄었는지 기록하려고 한다.
두 가지가 동시에 끝났다
개편을 하기로 한 이유는 단순하다. 중요한 2가지 요소가 수명을 다 했기 때문이다.
하나는 테마다. ‘Journey’라는 유료 테마를 사서 자식 테마까지 만들어 쓰고 있었는데, 몇 년 전에 지원이 끝났다. 워드프레스는 계속 올라가는데 테마는 그 자리에 멈춰 있으니, 언젠가 한 번은 작업해야 할 부분이었다.
다른 하나는 서버다. AWS 라이트세일에서 제공하던 비트나미 워드프레스 이미지를 쓰고 있었는데 그쪽도 지원이 종료됐다. 비트나미는 서버 안에 자기만의 디렉터리 구조와 설정 방식을 따로 갖고 있어서, 처음 깔 때는 편한 대신 나중에 손을 대려면 그 방식을 먼저 배워야 하는 물건이다. 지원까지 끊긴 상태로 그 위에 계속 쌓아 올리는 건 시한폭탄에 가깝다.
둘 다 ‘지금 당장 고장 나지는 않는’ 종류의 문제였다. 그래서 몇 년을 미뤘다. 미룰수록 옮기기 어려워진다는 것도 알면서 미뤘다.
노트북 안에 사이트를 하나 더 만들었다
운영 중인 사이트를 직접 뜯을 수는 없어서 먼저 통째로 노트북으로 가져왔다. 윈도우의 WSL 위에 도커로 워드프레스와 데이터베이스를 띄우고 백업을 밀어 넣으니 로컬에서 돌아가는 사본이 하나 생겼다.
로컬 사본이 있으면 테마를 통째로 갈아엎든 플러그인을 전부 꺼 보든 아무 부담이 없다. 망가지면 데이터베이스만 다시 넣으면 그만이니까. 운영 서버를 붙잡고 조마조마하게 고치는 것과는 속도가 다르다.
여기서 클로드 코드가 처음 크게 도움이 됐다. 도커 설정이며 PHP 확장이며 데이터베이스 버전을 맞추는 일은 원래 문서 뒤지고 오류 읽으며 반나절씩 까먹는 구간인데, 오류 메시지를 그대로 붙여 주면 원인과 고칠 지점을 바로 짚어 줬다.
테마를 버리니 플러그인이 따라 떨어졌다
새 테마는 사지 않고 직접 깡통 테마로 만들었다. 블록 테마로 짜서 지금 파일이 21개, 코드는 200KB 남짓이다. 폰트를 빼면 그게 전부다. 내 블로그에 필요한 것만 들어 있으니 당연히 가볍다.
재미있는 건 그다음이었다. 테마 하나를 걷어냈더니 플러그인 여러 개가 같이 떨어져 나갔다. Journey는 Redux Framework라는 설정 도구 위에 만들어져 있었고, 콘텐츠를 꾸미려면 ACF라는 플러그인과 그 확장 두 개가 필요했다. 테마를 버리는 순간 이 네 개가 전부 쓸모없어졌다.
거기에 더해, 예전에는 플러그인으로 해결하던 일들을 테마 안에서 직접 처리하게 됐다. 구글 폰트를 불러오던 플러그인은 본문 서체를 사이트 안에 직접 넣으면서 사라졌고, 불필요한 스크립트를 걷어내 주던 최적화 플러그인 두 개는 애초에 걷어낼 것이 없어지니 필요가 없어졌다. 위젯 관련 플러그인들도 블록 테마로 오면서 자리를 잃었다.
광고 삽입, 프로필 사진, 홈 화면 글 목록처럼 계속 쓸 기능은 플러그인을 찾는 대신 직접 만들었다. 남이 만든 범용 플러그인은 내가 안 쓰는 기능까지 전부 싣고 오는데, 그 안 쓰는 부분도 똑같이 공격 대상이 된다.

카테고리는 평평하게 다시 깔았다
몇 년 쌓인 글이라 카테고리가 중구난방이었다. 하위 카테고리를 만들어 뒀다가 글이 몇 편 안 되는 것도 있었고, 성격이 겹치는 것도 있었다. 그동안 특별한 목적 없이 만든 개인 블로그라서 특별한 정체성이 없었으나 개인 브랜딩 겸 사업 관련 홍보도 할 겸 개편을 하게 되었다.
카테고리 계층을 없애고 9개로 평평하게 다시 깔았다. 사업·시스템 47편, 해외생활·여행 40편, 워드프레스 38편, 몽골 32편처럼 각 카테고리가 실제로 읽을 만한 분량을 갖도록 묶었다. 글이 4편밖에 없는 에세이 같은 것도 남겨 뒀는데, 앞으로 늘릴 자리라고 봤기 때문이다.
이건 AI가 대신해 줄 수 없는 종류의 일이었다. 어떤 글이 어디에 속하는지는 내가 쓴 의도를 아는 사람만 정할 수 있다. 대신 226편을 훑어서 현재 분포를 뽑고, 어느 글이 어느 카테고리에 몇 개씩 몰려 있는지 정리해 주는 일은 클로드 코드가 순식간에 했다.
다시 올릴 때는 비트나미를 버렸다
새 라이트세일 인스턴스는 워드프레스가 미리 깔린 이미지 대신 순수 우분투(Ubuntu)로 만들었다. 그 위에 도커로 로컬과 똑같은 구성을 올리는 방식이다. 다른 개인 프로젝트를 올릴 공간으로도 활용할 겸.
이렇게 하니 로컬에서 검증한 것이 서버에서도 그대로 돈다. PHP 버전, 데이터베이스 버전, 확장 모듈 목록이 전부 설정 파일 한 장에 적혀 있어서, 그 파일을 서버로 가져가면 같은 환경이 다시 만들어진다. 예전처럼 서버에 들어가 하나씩 설치하다 보면 로컬과 미묘하게 달라지는데, 그 미묘한 차이가 꼭 배포 당일에 문제를 일으킨다.

메모리 여유가 어느 정도인지도 실제로 재 보고 정했다. 컨테이너 전체가 350MB, 운영체제와 도커까지 합쳐 690MB를 쓴다는 걸 확인하고 2GB짜리 인스턴스를 골랐다. 나중에 파이썬으로 만든 도구 같은 걸 같이 올릴 여유를 두고 싶었다.
보안은 덤으로 강해졌다
보안은 최초에 그렇게 중요한 목표가 아니었다. 그런데 끝나고 보니 이쪽이 소득이 컸다.
플러그인을 15개 걷어낸 것 자체가 컸다. 플러그인은 하나하나가 남의 코드고, 그 코드는 내 사이트 안에서 내 권한으로 돈다. 업데이트가 끊기는 순간 그대로 구멍이 되는데, 24개를 관리하는 것과 10개를 관리하는 것은 부담이 다르다. 몇 년 방치했던 것들이 있었다는 걸 목록을 뽑아 보고서야 알았다.
나머지도 하나씩 정리됐다.
- 데이터베이스 관리 도구를 서버에서 뺐다. 접속만 하면 최고 권한으로 들어가지는 설정이었다
- 데이터베이스 포트를 닫았다. 예전에는 밖에서 접속할 수 있는 상태였다
- 비밀번호를 설정 파일에서 뺐다. 코드에 적혀 있던 것을 환경변수로 옮겼다
- 웹 서버 계정과 내 접속 계정을 분리했다. 사이트가 뚫려도 내 접속 키까지 읽히지 않는다
- 워드프레스 버전을 숨겼다. 자동 스캐너가 버전을 보고 취약점을 골라 시도한다
- HTTPS 인증서가 자동으로 갱신된다. 만료 챙길 일이 없어졌다
- 데이터베이스 백업이 매일 자동으로 돈다. 14일치를 보관한다
이 목록 중에 내가 먼저 떠올린 건 절반쯤이다. 나머지는 작업하다가 “이건 이렇게 되어 있는데 괜찮으신가” 하고 짚어 준 것들이다. 마지막에는 밖에서 접근 가능한 경로를 전부 찔러 보게 해서, 노출되면 안 되는 파일이 남아 있는지까지 확인했다.
시간이 얼마나 줄었나
예약 작업이 반년 가까이 죽어 있었다. 그걸 찾은 과정이 기억에 남는다.
워드프레스는 방문자가 페이지를 열 때 자기 사이트로 요청을 한 번 더 보내는 방식으로 예약 작업을 돌리는데, 내 구성에서는 그 요청이 실패하고 있었다. 사이트 주소는 8080 포트인데 컨테이너 안의 웹 서버는 80 포트를 듣고 있어서, 안에서 자기 주소로 접속하면 연결이 안 되는 상태였다.
이건 오류를 남기지 않는다. 그냥 조용히 안 돌 뿐이다. 클로드 코드는 컨테이너 안에서 두 포트에 각각 접속해 보고 한쪽만 실패하는 걸 확인한 다음, 워드프레스 코어 파일을 열어서 왜 재시도까지 막히는지를 짚어 냈다. 혼자였으면 “왜 안 돌지” 하고 또 반년 미뤘을 일이다.
크게 줄어든 건 작업 시간이 아니라 이렇게 막혔을 때 헤매는 시간이었다.
고칠 때마다 다시 재는 일도 마찬가지다. 페이지 캐시를 붙이고 나서 광고 노출 집계가 실제의 4분의 1로 잡히고 있는 걸 발견했는데, 같은 글을 세 번 열어 보고 숫자가 어떻게 변하는지 세어 본 덕분이었다. 고친 다음 또 재 보고, 봇 요청은 걸러지는지 확인하고, 관리자 접속은 집계에서 빠지는지까지 하나씩 눌러 봤다. 사람은 서너 번 해 보고 “되네” 하고 넘어가는데, 그러다 놓치는 것이 꼭 하나씩 있다.
어떻게 시켜야 하나
3일 붙어 보고 남은 것들이다.
확인할 수 있는 형태로 시킨다. “고쳐 줘”보다 “고치고 나서 이 숫자가 어떻게 변하는지 보여 줘”가 훨씬 낫다. 광고 집계를 고칠 때 실제로 숫자가 오르는 걸 확인하지 않았다면, 고친 줄 알고 넘어갔을 가능성이 높다.
사용자와 같은 도구로 확인하게 한다. 명령줄로 주소를 찔러 보는 것과 브라우저로 페이지를 여는 것은 다른 확인이다. 브라우저를 자동으로 띄워 화면을 찍게 해 두면 사람이 볼 화면을 그대로 확인할 수 있다.
“무엇으로 확인했나”를 묻는다. 완료했다는 말에 근거를 물어본다. “문법 검사는 통과했지만 눈으로는 확인 못 했습니다” 같은 답이 돌아오면 그건 아직 안 끝난 것이다.
미루던 일을 꺼내게 된다
지원이 끝난 테마도, 지원이 끝난 서버 이미지도 몇 년을 미뤘다. 고장 난 게 아니니 급하지 않았다. 그리고 손대면 며칠은 붙잡고 있어야 한다는 걸 알았다.
정작 달라진 건 작업 속도가 아니었다. 손을 대기로 마음먹는 문턱이 낮아졌다. 며칠이 반나절이 되니 판단 자체가 바뀐다.
이번에 고친 것 중에 원래 계획에 있던 건 테마 교체 하나뿐이다. 나머지는 하다 보니 드러난 것들이었다. 반년 가까이 죽어 있던 예약 작업도, 4분의 1로 잡히던 광고 집계도, 밖에서 훤히 보이던 설정들도 전부 “이왕 보는 김에” 확인하다 나왔다. 미루는 동안 조용히 쌓여 있었다는 뜻이다.
블로그 하나 고친 이야기지만, 사업에서도 같은 자리들이 있을 것이다. 고장 나지 않아서 안 건드리고 있는 것들.






댓글 남기기