워드프레스 보안 설정: 해킹 막는 필수 체크 10가지
워드프레스가 뚫리는 흔한 경로와 로그인·플러그인·파일권한·헤더까지 필수 보안 설정.
전 세계 웹사이트의 40% 이상이 워드프레스로 돌아가다 보니, 공격자 입장에서 워드프레스는 가장 효율이 좋은 표적입니다. 특정 사이트를 노리는 게 아니라, 알려진 취약점 하나를 스캐너에 넣고 인터넷 전체를 훑으면서 “걸리는 사이트”를 자동으로 감염시키는 방식입니다. 즉 내 사이트가 작아서 안전하다는 논리는 성립하지 않습니다 — 봇은 사이트 규모를 보지 않고 취약점 유무만 봅니다.
다행히 실제 침해 사례의 대부분은 몇 가지 뻔한 경로로 일어나기 때문에, 기본 설정 10가지만 제대로 해 두면 자동화된 공격의 90% 이상을 걸러낼 수 있습니다. 이 가이드는 워드프레스가 실제로 뚫리는 경로부터, 로그인·플러그인·파일 권한·서버 헤더까지 필수 점검 10가지를 순서대로 정리하고, 이미 해킹당했을 때의 복구 순서까지 다룹니다.
워드프레스는 실제로 어떻게 뚫리는가
보안 업체들의 침해 통계를 종합하면 워드프레스 해킹의 경로는 놀랄 만큼 반복적입니다. 순서대로 보면:
- 1위: 오래된 플러그인·테마의 알려진 취약점. 압도적 1위입니다. 취약점이 공개되면 수 시간 안에 자동 스캐너가 돌기 시작하는데, 업데이트를 미룬 사이트가 그대로 걸립니다. 워드프레스 코어 자체보다 플러그인이 뚫리는 경우가 훨씬 많습니다.
- 2위:
wp-login.php에 대한 크리덴셜 스터핑. 다른 사이트에서 유출된 아이디·비밀번호 조합을 자동으로 대입하는 공격입니다. 비밀번호를 재사용했거나 아이디가admin이면 사실상 시간문제입니다. - 3위: 널드(nulled) 테마·플러그인. 유료 테마를 무료로 풀어놓은 파일에는 백도어가 심겨 있는 경우가 흔합니다. 설치하는 순간 스스로 문을 열어주는 셈입니다. 출처 불명 zip은 절대 올리지 마세요.
- 4위: 공유 호스팅 이웃 감염. 같은 서버의 다른 계정이 뚫리면, 서버 격리가 허술한 호스팅에서는 내 사이트까지 번질 수 있습니다. 계정 간 격리가 되는 호스팅을 쓰고 파일 권한을 엄격하게 두는 이유입니다.
공통점은 전부 자동화라는 점입니다. 사람이 내 사이트를 들여다보는 게 아니라 봇이 취약점 패턴을 긁는 것이므로, 기본기만 갖춰도 표적에서 빠집니다.
필수 체크 10가지 — 무엇을, 왜, 어떻게
아래 표가 이 가이드의 핵심입니다. 위에서부터 순서대로 처리하면 되고, 대부분 30분 안에 끝납니다.
| # | 점검 항목 | 왜 필요한가 | 어떻게 하나 |
|---|---|---|---|
| 1 | 코어·플러그인·테마 업데이트 | 침해 원인 1위가 미패치 취약점 | 마이너 자동 업데이트 켜기, 플러그인은 주 1회 점검 후 즉시 적용 |
| 2 | 안 쓰는 플러그인·테마 삭제 | 비활성 상태여도 파일이 있으면 공격면 | 비활성화가 아니라 삭제. 기본 테마 1개만 남기기 |
| 3 | 관리자 계정 강화 | admin 아이디 + 재사용 비밀번호 = 크리덴셜 스터핑 먹잇감 | 아이디 변경(새 관리자 생성 후 기존 삭제), 20자 이상 고유 비밀번호 |
| 4 | 2단계 인증(2FA) | 비밀번호가 유출돼도 로그인 차단 | TOTP 앱 방식 2FA 플러그인, 최소한 관리자 계정 전원 적용 |
| 5 | 로그인 시도 제한 | 무차별 대입을 몇 회 만에 차단 | 실패 5회 잠금류 플러그인 또는 서버 레벨(fail2ban) 설정 |
| 6 | xmlrpc.php 비활성화 | 한 요청에 수백 개 비밀번호를 대입하는 증폭 공격 통로 | Jetpack 등 사용처가 없으면 서버에서 접근 차단 |
| 7 | 파일 편집기 차단 | 관리자 계정 탈취 시 대시보드에서 바로 웹셸 설치 가능 | wp-config.php에 DISALLOW_FILE_EDIT 추가 |
| 8 | 파일 권한 정리 | 과한 권한(777)은 이웃 계정·다른 프로세스의 침투 통로 | 파일 644, 폴더 755, wp-config.php는 600~640 |
| 9 | 매일 외부 백업 | 백업은 최후의 보안 수단 — 서버 안 백업은 함께 감염됨 | DB+파일을 매일 서버 밖(S3·타 서버)으로, 복원 테스트 필수 |
| 10 | 보안 헤더 적용 | 클릭재킹·XSS·MIME 스니핑 등 브라우저 레벨 방어 | nginx/Apache에서 HSTS·X-Frame-Options 등 추가 후 검사 |
3번 비밀번호는 “복잡해 보이는 8자”가 아니라 길고 고유한 것이 핵심입니다. 사이트에 회원이 여럿이라면 어떤 길이·구성 규칙을 강제할지부터 정해야 하는데, 비밀번호 정책 생성기로 조직에 맞는 정책 문안을 만들어 그대로 적용하면 됩니다. 10번 보안 헤더는 워드프레스 플러그인보다 서버(nginx/Apache) 레벨에서 넣는 것이 정석이고, 적용 후에는 보안 헤더 검사기로 실제 응답에 빠진 헤더가 없는지 확인하세요.
wp-config.php 강화 — 세 줄이면 됩니다
wp-config.php는 DB 접속 정보와 인증 키가 모두 들어 있는 가장 민감한 파일입니다. 필수 수정은 세 가지입니다.
- 파일 편집기 차단:
define('DISALLOW_FILE_EDIT', true);한 줄로 대시보드의 테마·플러그인 편집기를 없앱니다. 관리자 세션이 탈취돼도 공격자가 클릭 몇 번으로 PHP 웹셸을 심는 경로가 막힙니다. - 인증 솔트(salt) 관리:
AUTH_KEY부터NONCE_SALT까지 8개 키는 로그인 쿠키를 서명하는 값입니다. 설치 시 기본값이거나 다른 사이트와 복사해 쓴 값이면 교체하고,침해가 의심될 때는 반드시 새로 생성하세요 — 솔트를 바꾸면 훔친 쿠키를 포함한 모든 세션이 즉시 무효화됩니다. 공식api.wordpress.org/secret-key/1.1/salt/생성기를 쓰면 됩니다. - 파일 권한:
wp-config.php는 웹서버 사용자만 읽으면 되므로600(또는 그룹 읽기가 필요하면640)으로 좁힙니다. 공유 호스팅에서 이웃 계정이 읽어가는 사고를 막는 최소한의 장치입니다.
실전 예제: 이미 해킹당했다면 — 복구 순서
이미 스팸 페이지가 생성되거나 리다이렉트가 걸린 상태라면 순서가 중요합니다. 청소보다 문 잠그기가 먼저입니다 — 순서를 바꾸면 청소하는 동안 공격자가 다시 들어옵니다.
- 세션·자격 증명 전부 무효화:
wp-config.php의 솔트 8개를 새로 생성해 모든 로그인 쿠키를 끊고, 모든 관리자 비밀번호·DB 비밀번호·FTP/SFTP·호스팅 패널 비밀번호를 교체합니다. - 모르는 관리자 계정 삭제: 사용자 목록에서 직접 만들지 않은 관리자 계정을 찾아 제거합니다. 공격자가 재진입용으로 만들어 두는 단골 수법입니다.
- 악성 파일 스캔·웹셸 제거: 최근 수정된 PHP 파일(
find . -name "*.php" -mtime -14),wp-content/uploads안의 PHP 파일,eval(base64_decode(...))패턴을 찾습니다. 업로드 폴더에 PHP가 있다는 것 자체가 이상 신호입니다. - 코어·플러그인·테마 전체 업데이트/재설치: 코어는 공식 zip으로 덮어쓰고, 플러그인·테마는 저장소에서 새로 받습니다. 침입 통로였던 취약점을 닫는 단계입니다.
- 필요 시 깨끗한 백업으로 복원: 감염 시점 이전의 외부 백업이 있다면 복원이 가장 확실합니다. 9번 체크(매일 외부 백업)를 해 뒀다면 이 단계가 몇 분이면 끝납니다.
- 재발 방지 점검: 위 10가지 체크를 처음부터 다시 적용하고, 구글 서치콘솔에서 보안 문제 경고가 있으면 검토 요청을 보냅니다.
정기 점검 루틴 만들기
보안은 한 번 설정하고 끝나는 게 아니라 루틴입니다. 주 1회 업데이트 점검, 월 1회 사용자·플러그인 목록 정리, 분기 1회 백업 복원 테스트 정도면 개인·소규모 사이트에는 충분합니다. 지금 내 사이트가 10가지 중 몇 개를 통과하는지는 워드프레스 보안 체크리스트로 항목별로 점검하면서 진행 상황을 관리할 수 있고, 서버 응답에 실제로 적용된 헤더는 보안 헤더 검사기가 즉시 확인해 줍니다.
자주 묻는 질문
보안 플러그인 하나만 설치하면 충분한가요?
xmlrpc.php를 꺼도 되는지 어떻게 확인하나요?
해킹당한 뒤 비밀번호만 바꾸면 되나요?
wp-config.php 권한은 왜 600으로 낮추나요?
백업은 서버 안에 두면 안 되나요?
이 가이드와 함께 쓰면 좋은 도구
관련 가이드
- 필수 보안 헤더 설정 가이드(CSP·HSTS·X-Frame-Options)꼭 설정해야 할 보안 헤더와 각 헤더의 역할·권장 값·흔한 실수.
- SSL 인증서 오류(NET::ERR_CERT…) 원인과 해결브라우저 SSL 오류와 authorized=false의 흔한 원인 5가지와 각각의 해결 방법.