한눈에 보기: 워드프레스 개발은 기능 구현만큼 보안이 중요합니다. 입력값 정화와 출력 이스케이프, Nonce와 권한 체크, SQL Injection·XSS 방어는 기본 루틴으로 자리잡아야 합니다. 이 글에서는 워드프레스 PHP 개발자가 반드시 알아야 할 보안 핵심기를 정리했습니다.

1. 입력 정화·출력 이스케이프

사용자가 입력한 값은 절대 그대로 저장·출력하면 안 됩니다. 워드프레스는 다양한 정화(sanitize)와 이스케이프(escape) 함수를 제공합니다.

  • 입력 정화 (Sanitize): 데이터베이스에 저장하기 전에 형식을 정리합니다.
    • sanitize_text_field(): 일반 텍스트
    • sanitize_email(): 이메일 주소
    • esc_url_raw(): URL
  • 출력 이스케이프 (Escape): 화면에 표시하기 전에 HTML 특수문자를 변환해 공격을 막습니다.
    • esc_html(): 본문에 출력할 때
    • esc_attr(): 속성 값에 출력할 때
    • esc_url(): 링크 출력 시

예: echo esc_html( sanitize_text_field( $_POST['title'] ) );

핵심 요약: 저장 전에는 sanitize, 출력 전에는 escape라는 흐름을 습관처럼 사용하세요.

2. 인증·권한

보안 사고의 상당수는 권한 체크 누락에서 발생합니다. 관리자만 접근해야 할 기능은 반드시 Nonce와 권한을 확인해야 합니다.

  • Nonce: 요청 위조(CSRF)를 방지하는 일회성 토큰입니다.
    • wp_nonce_field('my_action') → 폼에 숨김 필드 생성
    • wp_verify_nonce($_POST['nonce'], 'my_action') → 서버에서 검증
  • 권한 체크: current_user_can()으로 사용자 권한을 확인합니다.
    • 예: current_user_can('manage_options') → 관리자 전용
    • 예: current_user_can('edit_posts') → 일반 편집 권한

Nonce와 권한은 항상 함께 사용해야 합니다. Nonce는 요청 위조 방지, 권한은 접근 제어를 담당합니다.

핵심 요약: Nonce와 권한 체크를 동시에 걸어야 안전한 보안 루틴이 완성됩니다.

3. 체크리스트

보안은 습관화된 루틴이 필요합니다. 워드프레스 개발자가 기본적으로 지켜야 할 체크리스트는 다음과 같습니다.

  • SQL Injection 방지: $wpdb->prepare() 반드시 사용
  • XSS 방지: 출력 전 esc_*() 적용
  • Nonce 검증: 모든 POST·AJAX 요청에 wp_verify_nonce()
  • 권한 확인: current_user_can()으로 역할 제한
  • 파일 업로드: wp_handle_upload() 사용, 확장자 검증
  • 버전 관리: PHP·워드프레스·플러그인은 항상 최신 버전 유지

핵심 요약: 보안 체크리스트를 개발 초기부터 코드에 포함해야 나중에 보안 취약점으로 이어지지 않습니다.

FAQ

  • Q. Nonce는 로그인하지 않은 사용자도 쓸 수 있나요? 기본적으로 로그인 세션과 연결됩니다. 로그인하지 않은 경우에는 별도 토큰·인증 설계가 필요합니다.
  • Q. sanitize와 escape를 동시에 써야 하나요? 네, 입력 시 sanitize, 출력 시 escape를 각각 적용해야 합니다. 하나만 해서는 불완전합니다.
  • Q. 권한은 롤(role)과 어떻게 연결되나요? 워드프레스는 권한(capability)을 기반으로 합니다. 역할(role)은 권한(capability)의 집합입니다.
  • Q. $wpdb로 직접 쿼리를 쓰면 항상 위험한가요? prepare()를 사용하면 안전합니다. 하지만 가능하다면 WP_Query 같은 추상화 계층을 권장합니다.
  • Q. AJAX 보안에서 가장 흔한 실수는? Nonce 검증을 생략하거나, current_user_can()을 빼먹는 경우가 많습니다.
  • Q. 파일 업로드 보안에서 추가로 필요한 건? 확장자 화이트리스트, 이미지 검증, 업로드 디렉토리 분리 등을 적용해야 합니다.

출처

👉 다음 단계 학습 가이드