본문 바로가기

IT 리뷰/블로그 SEO

워드프레스 REST API 403 Forbidden이 뜰 때 먼저 봐야 할 부분

728x90
반응형

워드프레스 REST API 403 Forbidden 오류 원인과 해결 방법 정리

워드프레스 관리자에서 사이트 건강 상태를 열었는데 REST API가 예상치 못한 결과를 발생했습니다라는 문구가 뜨면 괜히 겁부터 나는 분들이 많습니다. 특히 /wp-json/wp/v2/types/post?context=edit 주소가 함께 보이고 403 Forbidden까지 뜨면 서버가 망가진 것처럼 느껴질 수 있는데, 실제로는 워드프레스 코어 자체보다 보안 설정, 캐시, 방화벽, 로그인 쿠키, nonce, 서버 자기호출 문제 쪽에서 걸리는 경우가 훨씬 많습니다.

워드프레스 REST API 403 Forbidden 오류 원인과 해결 방법 정리

저라면 이 문구를 봤을 때 무작정 워드프레스를 재설치하지 않습니다.

먼저 누가 wp-json 요청을 막고 있는지, 그리고 왜 편집 권한이 필요한 REST 요청만 막히는지부터 확인합니다. 이 부분만 잡아도 블록 편집기 저장 문제, 글 편집 화면 먹통, 플러그인 설정 저장 오류까지 같이 정리되는 경우가 많습니다.

한 줄 요약

이 오류는 대부분 wp-json 전체 장애가 아니라 관리자 권한이 필요한 REST 요청만 차단된 상태입니다. 그래서 공개 주소는 열리는데 context=edit가 붙은 요청만 403이 나는 경우가 많습니다.

403 오류가 뜨는 이유

문구에 포함된 context=edit는 그냥 보기용 조회가 아니라, 편집 화면에서 필요한 정보까지 함께 가져오겠다는 뜻입니다.

그래서 일반 방문자는 괜찮아도 관리자 로그인 상태, 권한, 쿠키, nonce가 어긋나면 여기서 바로 막힐 수 있습니다.

특히 아래처럼 나뉘는 경우가 많습니다.

원인 자주 보이는 증상 체감상 특징
보안 플러그인 Site Health 403, 블록 편집기 저장 불안정 Wordfence, AIOS, Cerber 계열에서 자주 보임
Cloudflare 또는 서버 WAF 관리자 요청만 403, 특정 쿼리 문자열 차단 브라우저에서는 열리는데 관리자 내부 호출이 막히기도 함
.htaccess 차단 규칙 wp-json 관련 주소가 부분적으로 막힘 직접 추가한 보안 규칙 뒤에 자주 생김
도메인, 쿠키, nonce 불일치 로그인했는데도 비로그인처럼 처리 http/https, www 유무가 섞이면 의심
서버 자기호출 문제 REST API와 Loopback이 같이 꼬임 Nginx, hosts, reverse proxy 환경에서 종종 보임

가장 먼저 해볼 확인

먼저 브라우저에서 아래 두 주소를 따로 열어보면 판단이 빨라집니다.

https://내도메인/wp-json/
https://내도메인/wp-json/wp/v2/types/post?context=edit

첫 번째 주소는 열리는데 두 번째만 403이면, 거의 대부분은 권한이 필요한 REST 요청만 막히는 상태입니다. 이 경우 퍼머링크 재저장만으로 끝나는 경우는 드뭅니다.

반대로 /wp-json/ 자체도 안 열리면 rewrite, 웹서버 설정, 보안 규칙까지 범위를 넓혀 봐야 합니다.

보안 플러그인부터 의심하는 이유

 

워드프레스 & WHM 보안 서치콘솔 오류부터 외부 유입 차단까지

검색 엔진 최적화(SEO)와 서버 보안을 동시에 잡는 1%의 설정 디테일 워드프레스 운영 중 구글 서치콘솔에서 "robots.txt가 유효하지 않음"이나 "REST API 403 오류" 메일을 받으셨나요? 혹은 댓글창을 껐

jab-guyver.co.kr

이 문제는 보안 플러그인과 가장 자주 충돌을 일으키는데요 일단 워드프레스 관리자에서 REST API를 내부 호출하는데, 보안 플러그인이 비정상 API 접근으로 오해해서 막아버리면 사이트 건강 상태에서 바로 403이 뜹니다.

저라면 아래 기능을 먼저 잠깐 꺼보고 다시 확인합니다.

  • REST API 차단
  • XML-RPC와 함께 wp-json까지 막는 옵션
  • 브루트포스 방어 중 관리자 요청 차단
  • 국가 차단, User-Agent 차단, 쿼리 문자열 차단
  • 방화벽 학습 모드가 아닌 강경 차단 모드

Wordfence, AIOS, WP Cerber, CleanTalk Security, 서버 보안 모듈과 같이 여러 겹으로 걸려 있으면 한 군데만 풀어도 안 풀릴 수 있습니다. 이럴 때는 플러그인 + Cloudflare + 서버 WAF를 같이 봐야 답이 빨리 나옵니다.

Cloudflare와 ModSecurity도 꼭 확인

브라우저에서는 사이트가 잘 열리는데 워드프레스 관리자 내부 검사만 실패하는 경우, 실제 원인은 워드프레스 바깥에 있는 경우가 많습니다.

Cloudflare WAF나 호스팅사의 ModSecurity가 wp-json, query string, edit 컨텍스트를 공격 패턴으로 잘못 잡는 경우가 있기 때문입니다.

이럴 때는 아래처럼 보는 편이 빠릅니다.

확인 위치 봐야 할 것 판단 기준
Cloudflare WAF 이벤트 wp-json 차단 기록 해당 경로 예외 처리
호스팅 ModSecurity 로그 403 반환 규칙 ID 오탐 룰 비활성화 또는 예외
서버 접근 로그 wp-json 요청과 응답 코드 관리자 요청만 막히는지 확인

.htaccess에서 자주 걸리는 규칙

직접 보안 강화한다고 규칙을 넣었거나, 예전에 받은 차단 코드를 그대로 붙여 넣은 경우 아래 유형이 문제를 만들기 쉽습니다.

# 잘못 걸리기 쉬운 예시
RewriteRule ^wp-json/ - [F,L]

<FilesMatch "wp-json">
Require all denied
</FilesMatch>

RewriteCond %{REQUEST_URI} ^/wp-json [NC]
RewriteRule .* - [F,L]

특히 댓글, xmlrpc, wp-json을 한 번에 막는 식으로 정리해둔 규칙은 나중에 블록 편집기까지 같이 막는 경우가 많습니다.

댓글 스팸 방어와 REST API 차단은 같은 문제가 아닙니다. 저라면 xmlrpc 차단은 따로, wp-json은 필요한 범위는 살리는 쪽으로 분리합니다.

도메인 주소가 조금이라도 다르면 쿠키가 꼬일 수 있습니다

이 부분은 생각보다 많이 놓칩니다. 워드프레스 주소와 사이트 주소가 둘 다 https인지, www가 섞이지 않았는지, 관리자 접속 주소와 실제 공개 주소가 완전히 같은지 확인해 보셔야 합니다.

예를 들어 아래처럼 다르면 문제가 생길 수 있습니다.

siteurl = https://example.com
home    = https://www.example.com

이런 경우 로그인은 된 것처럼 보여도 REST 요청에서는 현재 사용자 인증이 꼬이면서 편집 컨텍스트 요청만 막힐 수 있습니다. 저라면 관리자 일반 설정에서 확인하고, 서버 강제 리다이렉트도 한 방향으로 딱 맞춰 둡니다.

서버 자기호출 문제도 같이 보셔야 합니다

플러그인을 다 꺼도 같고, 테마를 기본 테마로 바꿔도 같고, Cloudflare까지 껐는데도 같은 경우에는 서버가 자기 자신을 올바르게 호출하지 못하는 상태도 의심할 수 있습니다.

특히 Nginx, 리버스 프록시, hosts 설정, 로컬 DNS가 꼬인 환경에서는 Site Health의 내부 검사만 실패하는 경우가 실제로 있습니다.

이런 경우는 대개 REST API만 단독으로 이상한 게 아니라 루프백 요청이나 예약 작업 점검도 같이 경고가 뜨는 경우가 많습니다.

제가 먼저 하는 해결 순서

1. 브라우저에서 /wp-json//wp-json/wp/v2/types/post?context=edit를 각각 확인합니다.

2. 워드프레스 일반 설정에서 워드프레스 주소(URL)사이트 주소(URL)가 정확히 같은지 봅니다.

3. 보안 플러그인과 캐시 플러그인을 잠깐 끄고 다시 확인합니다.

4. Cloudflare WAF, 호스팅 ModSecurity 로그를 확인합니다.

5. .htaccess 또는 Nginx 설정에서 wp-json 차단 규칙을 찾습니다.

6. 코드 스니펫, functions.php에서 REST API를 막는 필터가 있는지 확인합니다.

7. 그래도 안 풀리면 서버 자기호출과 loopback까지 같이 봅니다.

주의
퍼머링크 저장만 눌러보고 끝내는 경우가 많은데, 이번 문제는 그걸로 끝나지 않는 경우가 많습니다. 공개 주소는 열리는데 관리자 권한이 필요한 REST 요청만 막히는 쪽이 더 흔합니다.

서버에서 바로 찾고 싶다면

SSH나 터미널을 쓸 수 있다면 아래처럼 한 번에 찾아보는 편이 빠릅니다. 개인정보가 포함될 수 있으니 실제 경로는 직접 바꿔서 쓰면 됩니다.

cd /path/to/wordpress

wp option get home
wp option get siteurl

grep -RIn "rest_authentication_errors\|rest_pre_dispatch\|rest_endpoints\|wp-json" wp-content .htaccess

wp plugin list
wp cache flush

특히 rest_authentication_errors, rest_pre_dispatch 같은 문자열이 나오면 그 부분은 거의 직접 범인을 가리키는 경우가 많습니다. 코드 스니펫 플러그인 안에 숨어 있는 경우도 적지 않습니다.

블록 편집기 저장까지 같이 이상하면 더 확실합니다

이 오류는 단순 경고로만 끝날 때도 있지만, 아래 증상이 같이 있으면 그냥 넘기면 안 됩니다.

  • 글 저장이 간헐적으로 실패함
  • 블록 편집기 로딩이 느리거나 멈춤
  • 플러그인 설정 저장이 안 됨
  • 예약 발행, 자동 저장, 사용자 권한 관련 기능이 꼬임

이럴 때는 사이트 건강 상태 경고를 단순 표시 문제로 보면 안 됩니다. 실제 편집 환경 전체에 영향을 주고 있는 경우가 많습니다.

이 문제에서 자주 나오는 결론

결국 가장 많이 잡히는 원인은 아래 셋입니다. 제 경험상 이 셋만 제대로 보면 상당수는 정리됩니다.

우선순위 가장 흔한 원인 조치
1 보안 플러그인 또는 WAF 차단 잠시 비활성화 후 원인 범위 좁히기
2 wp-json 차단 규칙 .htaccess 또는 Nginx 규칙 정리
3 쿠키, nonce, 도메인 불일치 siteurl, home, 리다이렉트 방향 통일

워드프레스 공식 문서 확인 버튼

직접 원문을 보고 싶은 분이라면 아래 링크를 함께 확인해 보셔도 좋습니다.

REST API 인증 문서 Post Types 엔드포인트 문서 Nginx 참고 문서

FAQ

Q. REST API 403이 떠도 사이트가 열리면 그냥 둬도 될까요?

A. 겉으로는 사이트가 멀쩡해 보여도 블록 편집기, 자동 저장, 일부 플러그인 설정 저장에 영향을 줄 수 있습니다. 관리자에서 글 저장이 불안정하다면 꼭 잡는 편이 낫습니다.

Q. /wp-json 주소는 열리는데 context=edit만 403이면 뭐가 가장 유력한가요?

A. 보안 플러그인, WAF, 쿠키 또는 nonce 문제일 가능성이 큽니다. 공개 조회가 아니라 편집 권한이 필요한 요청만 막히는 상태로 보는 게 맞습니다.

Q. 퍼머링크 다시 저장하면 해결되나요?

A. wp-json 전체 라우팅 문제라면 도움이 될 수 있지만, 이번처럼 403 Forbidden이면 대개 인증이나 차단 규칙 쪽이라 퍼머링크만으로 끝나지 않는 경우가 많습니다.

Q. Cloudflare를 쓰면 꼭 이 문제가 생기나요?

A. 꼭 그런 건 아니지만, WAF 규칙이나 봇 방어, 쿼리 문자열 검사 때문에 wp-json 요청이 오탐 차단되는 경우가 있습니다. 이벤트 로그를 같이 보는 편이 좋습니다.

Q. 플러그인을 다 껐는데도 같으면 어디를 봐야 하나요?

A. 서버 WAF, Nginx 또는 Apache 규칙, hosts 설정, 리버스 프록시, loopback 문제까지 범위를 넓혀 보셔야 합니다. 이때는 워드프레스 바깥 원인일 가능성이 높습니다.

728x90
반응형
그리드형