워드프레스 REST API: 완전히 끄지 않고 로그아웃 상태만 막는 이유

워드프레스 REST API는 로그인하지 않은 방문자에게도 wp-json 주소로 사이트의 사용자명을 노출합니다. 완전히 끄면 블록 편집기 저장이 실패하는 경우가 있어, 로그아웃 상태의 요청만 막고 401 응답으로 확인하는 방법을 정리했습니다.
1️⃣ 워드프레스 REST API란: wp-json 주소와 하는 일
워드프레스 REST API는 글·페이지·사용자 같은 사이트 데이터를 JSON 형식으로 주고받는 워드프레스 기본 기능이며, 사이트 주소 뒤의 /wp-json/ 아래에서 응답합니다.
주소는 /wp-json/ 아래에 [wp/v2/posts]·[wp/v2/pages]·[wp/v2/users]처럼 데이터 종류별로 나뉘며, 이 주소 하나하나를 엔드포인트라고 부릅니다. 블록 편집기도 글을 저장할 때 이 주소로 요청을 보내게 됩니다.
https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users2️⃣ wp-json으로 드러나는 사용자명
[wp/v2/users] 엔드포인트는 글을 발행한 사용자마다 표시 이름과 slug 값을 응답하며, slug에는 기본적으로 로그인 아이디가 그대로 들어갑니다. 테스트 사이트인 https://testpilotweb.com/의 관리자 계정 역시 slug와 로그인 아이디가 같았습니다.
로그인 아이디가 드러나면 공격자는 비밀번호만 알아내면 로그인할 수 있으며, 테스트 사이트의 워드프레스 로그인 화면에도 2026년 10월 7일 하루 2,570회의 무차별 대입 시도가 기록됐습니다.
이 주소를 막아도 작성자 페이지 주소(/author/아이디/)에는 같은 아이디가 그대로 남습니다.
3️⃣ 완전히 끄면 깨지는 것
WP REST API를 모두 끄면 블록 편집기의 글 저장부터 실패하며, 워드프레스 최적화 플러그인 중 하나인 Perfmatters도 이 때문에 끄는 범위를 [관리자가 아닌 경우 비활성화]와 [로그아웃 시 비활성화] 두 단계로 나눠 두고 있습니다. 작성자나 기여자 계정이 있는 사이트라면 [관리자가 아닌 경우 비활성화]도 그 계정의 글 저장을 막게 됩니다.
로그아웃 상태만 막은 사이트에서도, claude.ai에 MCP 커넥터를 연결하자 인증을 마친 뒤 도구가 0개로 표시됐습니다. 서버 기록에는 MCP 요청이 모두 401로 남았으며, Perfmatters가 MCP의 토큰 확인보다 먼저 요청을 차단한 것이 원인이었습니다.
| [REST API 비활성화] 값 | 로그아웃 방문자의 users 주소 | 관리자가 아닌 계정의 글 저장 | 맞는 경우 |
|---|---|---|---|
| 기본값 (활성화됨) | 사용자명 노출 | 저장됨 | — |
| 관리자가 아닌 경우 비활성화 | 401 | 저장 실패 | 작성자·기여자 계정이 없는 사이트 |
| 로그아웃 시 비활성화 | 401 | 저장됨 | 작성자 계정이 있는 사이트, MCP 등 토큰 연결은 예외 경로 추가 |
4️⃣ 로그아웃 상태만 막는 설정(Perfmatters)
워드프레스 관리자 화면의 [설정] → [Perfmatters] → [일반]에서 [코어] 항목의 [REST API 비활성화]를 [로그아웃 시 비활성화]로 바꾸고 [변경 사항 저장]을 누릅니다.


Perfmatters 지원 언어: 영어(기본), 한국어, 독일어, 프랑스어, 이탈리아어, 네덜란드어, 포르투갈어(브라질), 러시아어, 우크라이나어, 터키어, 불가리아어, 헝가리어, 인도네시아어, 페르시아어, 중국어(간체)

로그인하지 않은 시크릿 창에서 /wp-json/wp/v2/users를 열면 [죄송합니다. REST API 요청을 할 수 있는 권한이 없습니다.] 메시지와 함께 401 응답이 돌아오며, 로그인한 상태의 블록 편집기는 그대로 글을 저장하게 됩니다.
[
{
"id": 1,
"name": "User A",
"slug": "user_a",
"link": "https://example.com/author/user_a/"
}
]
{
"code": "rest_authentication_error",
"message": "죄송합니다. REST API 요청을 할 수 있는 권한이 없습니다.",
"data": { "status": 401 }
}
5️⃣ 막은 경로에 예외 두기
막아 둔 상태에서 특정 경로만 열어야 할 때는 Perfmatters의 [perfmatters_rest_api_exceptions] 필터에 그 경로를 추가합니다. claude.ai MCP 커넥터의 도구 0개 문제는 Perfmatters [코드] 메뉴에 PHP 스니펫을 만들어, MCP 경로 하나만 예외로 두어 해결했습니다.
add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
$exceptions[] = '/mcp/mcp-oauth-server';
return $exceptions;
});예외를 둔 뒤에도 토큰이 없는 요청은 MCP가 직접 [MCP authentication required.] 메시지와 401 응답으로 차단하며, /wp-json/wp/v2/users는 계속 Perfmatters의 401 응답을 반환하게 됩니다.
[MCP authentication required.]
같은 [코어] 항목의 [REST API 링크 제거]는 페이지 머리말과 응답 헤더에서 api.w.org 링크만 지우는 설정이며, WP REST API 자체는 그대로 응답합니다.
🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.