친절한 우리 고모

친절한 고모의 친절한 이야기

  • 2025. 4. 27.

    by. 친절한 고모

    목차

      🔐 워드프레스 REST API는 기본적으로 "오픈"되어 있다?

      REST API는 워드프레스의 데이터를 외부 앱이나 JavaScript에서 접근할 수 있게 해줍니다.
      하지만 기본 설정에서는 공개된 정보(예: 포스트 목록)는 누구나 접근 가능합니다.

      문제는, 수정/삭제/작성 등의 민감한 요청은 인증 없이는 막아야 한다는 점이죠.

       

      🔐 워드프레스 REST API는 기본적으로 "오픈"되어 있다?


      ✅ 인증이 필요한 상황

      요청 유형인증 필요 여부
      GET /wp/v2/posts ❌ (기본 공개)
      POST /wp/v2/posts ✅ 로그인 사용자만
      PUT /wp/v2/users/me ✅ 현재 사용자만
      커스텀 API /wp-json/my/v1/data ⛔ 기본 비인증 → 직접 권한 체크 필수

      🔑 인증 방식 1: Nonce 인증 (워드프레스 로그인 사용자용)

      💡 개념 정리

      • Nonce는 워드프레스 내부 요청에서 CSRF 방지용 토큰
      • 프론트엔드 JavaScript → 백엔드 API 통신 시 사용

      ✅ 사용 흐름 요약

      txt
      복사편집
      1. wp_localize_script → nonce 전달 2. fetch/ajax → nonce 포함 요청 3. PHP → check_ajax_referer or wp_verify_nonce 로 검증

      ✅ 코드 예시

      functions.php

      php
      복사편집
      function my_enqueue_scripts() { wp_enqueue_script('my-script', get_template_directory_uri().'/main.js', array(), null, true); wp_localize_script('my-script', 'my_api', array( 'nonce' => wp_create_nonce('wp_rest'), 'rest_url' => rest_url('my/v1/secure-data') )); } add_action('wp_enqueue_scripts', 'my_enqueue_scripts');

      JavaScript (fetch 예시)

      js
      복사편집
      fetch(my_api.rest_url, { method: 'GET', headers: { 'X-WP-Nonce': my_api.nonce } }) .then(res => res.json()) .then(data => console.log(data));

      PHP – 커스텀 엔드포인트 등록

      php
      복사편집
      add_action('rest_api_init', function () { register_rest_route('my/v1', '/secure-data', array( 'methods' => 'GET', 'callback' => 'my_secure_data', 'permission_callback' => function () { return current_user_can('edit_posts'); } )); }); function my_secure_data() { return ['message' => '로그인된 사용자만 볼 수 있어요']; }

      🛡 인증 방식 2: JWT 인증 (토큰 기반 API 보안)

      ✅ 서버 간 통신 / 앱 통신 / 헤드리스 프론트엔드에 적합
      ✅ 로그인 없이도 토큰 발급 → 저장 → 재사용 가능


      🔧 플러그인 설치 (추천)

      1. JWT Authentication for WP REST API
      2. 또는 직접 구현 (토큰 서명, 만료, 파싱 필요)

      wp-config.php 설정

      php
      복사편집
      define('JWT_AUTH_SECRET_KEY', '🔐 여기에 강력한 시크릿 키 입력'); define('JWT_AUTH_CORS_ENABLE', true); // CORS 허용

      ✅ 토큰 발급 요청 예시 (POST)

      bash
      복사편집
      POST /wp-json/jwt-auth/v1/token { "username": "admin", "password": "yourpassword" }

      ➡ 응답:

      json
      복사편집
      { "token": "eyJ0eXAiOiJKV1QiLCJhbGciOi...", "user_email": "admin@example.com" }

      ✅ 토큰으로 인증 요청

      bash
      복사편집
      GET /wp-json/my/v1/protected Authorization: Bearer eyJ0eXAiOiJKV1QiLC...

      → REST API 내에서는 워드프레스 로그인과 동일한 권한으로 인식


      🧩 커스텀 REST API + JWT 권한 체크 예시

      php
      복사편집
      add_action('rest_api_init', function () { register_rest_route('my/v1', '/protected', array( 'methods' => 'GET', 'callback' => 'my_protected_data', 'permission_callback' => function () { return current_user_can('edit_pages'); } )); }); function my_protected_data() { return ['status' => 'ok', 'data' => '비공개 콘텐츠']; }

      📌 permission_callback은 반드시 사용자 권한 체크 필수!


      ✅ REST API 보안 체크리스트

      항목완료 여부
      permission_callback 모든 엔드포인트에 지정 ✅ / ❌
      Nonce 사용 시 CSRF 방어 완료 ✅ / ❌
      JWT 사용 시 헤더 구성 및 만료 체크 적용 ✅ / ❌
      사용자 권한 검사 (current_user_can) 수행 ✅ / ❌
      민감 데이터 응답 시 인증 요구 처리 ✅ / ❌