워드프레스 관리자 페이지에서 [플러그인 추가] > “더 많은 상세”를 클릭했을 때, 아무 내용도 안 뜨거나 “연결이 거부되었습니다” 라는 오류 메시지를 본 적 있으신가요?
결론부터 말하자면, Nginx 보안 헤더 설정이 문제 였습니다. 그리고 해결 과정중에 워드프레스 내부 AJAX 요청 차단 문제도 있어서 같이 해결했습니다. 이 글에서는 해당 문제의 원인과 해결 방법을 공유합니다.

문제 증상
플러그인 > 새로 추가 > 상세보기
클릭 시 화면이 비어 있거나- “aaaaaaa.com에서 연결을 거부했습니다” 와 같은 오류가 iframe 창에 표시됨
- 실제로 플러그인은 설치되고 활성화되지만, 팝업 상세 설명은 확인할 수 없음
원인이 될 수 있는 사항들
X-Frame-Options: DENY
보안 헤더가 설정되어 있어,
워드프레스 내부 iframe이 자기 자신(example.com) 을 로딩하지 못함
워드프레스는 상세보기 팝업을 띄울 때 iframe으로 내부 URL을 호출함:https://example.com/wp-admin/plugin-install.php?tab=plugin-information&plugin=YOAST...
→ 이 요청이 서버에서 차단됨 (보안 헤더)- 일부 서버에서는
admin-ajax.php
또는wp-json
엔드포인트가 차단되어,
플러그인 데이터 불러오기 자체가 실패하는 경우도 있음
해결 방법
1. X-Frame-Options
헤더 수정
Nginx 설정(default
, sites-enabled
등)에 아래와 같이 수정합니다:
# 기존: iframe 완전 차단
add_header X-Frame-Options DENY;
# 수정: 동일 도메인 내 iframe 허용
add_header X-Frame-Options "SAMEORIGIN";
SAMEORIGIN
은 워드프레스가 자기 자신을 iframe에 띄우는 것은 허용
이후 Nginx 재시작:
sudo nginx -t
sudo systemctl reload nginx
2. admin-ajax.php
경로 확인
혹시라도 “curl -I https://도메인/wp-admin/admin-ajax.php
” 요청이 400 또는 403이라면,
Nginx 셋팅에서 별도로 예외 처리를 추가해줍니다 (/etc/nginx/site-available/default):
location = /wp-admin/admin-ajax.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
3. LiteSpeed Cache, 보안 플러그인 확인
LiteSpeed Cache
,Wordfence
,iThemes Security
같은 플러그인이 loopback 요청을 차단할 수 있음- 일시적으로 해당 플러그인을 비활성화 후 다시 시도
확인 방법
수정 후 브라우저에서 개발자 도구 (F12) > 네트워크 탭을 열고 다시 “상세보기”를 클릭하면,
iframe 요청이 정상적으로 전송되고 200 OK
응답을 받는 것을 확인할 수 있습니다.
최종 결과
- 워드프레스 플러그인 상세정보 팝업 정상 표시
- admin-ajax.php 정상 작동 확인
- iframe 차단 해제 → 보안은 유지하면서도 기능 정상화
추가 내용
X-Frame-Options
설정의 중요성
X-Frame-Options
이 없는 경우 다른 사이트에 내 사이트를 iframe으로 넣을 수 있음
이 때, 위험성 클랙재킹
클릭재킹이란?
<!-- 공격자의 악성 사이트 -->
<iframe src="https://aaaaaaa.com/wp-admin" style="opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 999;"></iframe>
<button style="position: absolute; top: 100px; left: 100px;">클릭하세요!</button>
공격자가 자신의 사이트에 내 사이트를 iframe 으로 넣어 어떤 동작을 유도 할 수 있음. 게시글 삭제, 플러그인 끄기, “결제하기” 버튼 클릭 유도, “공유” / “팔로우” 버튼 악용 등을 할 수 있음.
예: 공격자가 iframe으로 호출할 수 있는 주소
URL | 목적 | 결과 |
---|---|---|
https://example.com/wp-admin/plugins.php?action=deactivate&plugin=litespeed-cache/litespeed-cache.php&_wpnonce=XXXX | 특정 플러그인 비활성화 | 웹사이트 기능 중단 가능 |
https://example.com/wp-admin/post.php?post=123&action=delete&_wpnonce=XXXX | 게시글 삭제 | 중요한 콘텐츠 손실 |
https://example.com/wp-admin/options-general.php?option_name=siteurl&value=http://evil.com | 사이트 설정 변경 | 트래픽 탈취 또는 피싱 |
https://example.com/wp-admin/user-new.php | 새로운 관리자 계정 생성 | 공격자 계정 침투 |
위 주소들은 모두 이미 로그인된 관리자의 쿠키를 공유해서 실행됩니다.
즉, 브라우저가 로그인 세션을 유지하고 있기 때문에 클릭만 하면 실제 조작이 됩니다.
반드시 X-Frame-Options: SAMEORIGIN
또는 DENY
를 설정해야 합니다.
현실적인 공격 시나리오 예시
1. 공격자는 WordPress 사이트들을 사전에 수집해둠
- 크롤링 또는 공개된 목록으로 WordPress 사이트 수천 개 확보
- URL 패턴 (
/wp-login.php
,/wp-admin/
,/wp-json/
) 등으로 식별
2. 방문자 IP를 기준으로 호스트 추적
공격자가 iframe이 삽입된 피싱 사이트에서 다음을 수행:
fetch("https://api.ipify.org?format=json")
.then(res => res.json())
.then(data => {
let visitorIP = data.ip;
// 공격자가 저장한 리스트에서 이 IP의 접속 이력이나 관련 도메인 확인
if (knownWPAdmins.includes(visitorIP)) {
document.getElementById("trap").src = "https://target-wp-site.com/wp-admin/plugin-install.php";
}
});
👉 여기에선 공격자가 이미 이 IP가 운영 중인 WordPress 사이트를 알고 있다는 전제가 필요합니다.
3. Referrer, 쿠키, User-Agent, Open Graph 등을 통해 식별 강화
- 방문자가 이전에 어떤 사이트를 방문했는지 (
document.referrer
)를 통해 유추 - 브라우저 세션에서 특정 도메인에 로그인한 상태인지 쿠키 여부로 탐지 시도
4. iframe src는 정적으로 안 넣고, 자바스크립트로 동적으로 삽입
// 공격 대상 사이트를 미리 선정
let targets = ["https://site1.com/wp-admin", "https://site2.com/wp-admin"];
document.getElementById("trap").src = targets[Math.floor(Math.random() * targets.length)];
또는:
// 공격자가 DNS 조회 또는 사용자 IP로 판단
let guessedTarget = "https://ssssss.com/wp-admin/plugin-install.php";
document.getElementById("trap").src = guessedTarget;
마무리
이번 문제는 겉보기엔 단순한 워드프레스 문제처럼 보였지만,
실제로는 서버 보안 설정(X-Frame-Options) 과 AJAX 요청 허용 여부가 핵심 원인이었습니다.
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;
이런 옵션은 보안에 꼭 도움이 되기 때문에 설정을 하는 것이 좋습니다. 꼭 확인 후 설정해보세요.
특히 Nginx 서버에서 워드프레스를 운영 중이신 분들은 iframe 관련 헤더 위 처럼 설정해보세요.
1 thought on “워드프레스에서 플러그인 “상세 보기”가 안 뜨는 문제 해결 방법 (iframe + AJAX 이슈)”