본문으로 건너뛰기

API 보안 테스팅: 실전 가이드

현대 애플리케이션은 서비스 간 통신에 API를 크게 의존하기 때문에, API 보안 테스팅은 보안 연구자와 침투 테스터에게 핵심 스킬이 되었다. 이 가이드는 REST 및 GraphQL API에서 취약점을 찾는 핵심 기법과 도구를 다룬다.

API 아키텍처 이해하기

테스팅에 뛰어들기 전에 API가 어떻게 동작하는지 이해해야 한다. 대부분의 현대 웹 애플리케이션은 JSON 페이로드를 사용하는 RESTful API를 쓰지만, GraphQL도 점점 인기를 얻고 있다. API는 일반적으로 전통적인 세션 쿠키 대신 토큰(JWT, OAuth2)으로 사용자를 인증한다.

API 테스팅의 첫 단계는 공격 표면 매핑이다. Burp Suite, OWASP ZAP, Postman 같은 도구로 API 트래픽을 가로채고 분석할 수 있다. 다음에 주목하라:

  • 인증 메커니즘
  • 인가 확인
  • 입력 유효성 검사
  • 레이트 리미팅
  • 에러 메시지

자주 나오는 API 취약점

BOLA (객체 수준 인가 취약점) 는 가장 흔한 API 취약점이다. API가 특정 객체에 접근할 권한이 있는지 검증하지 못할 때 발생한다. 예를 들어 /api/user/123/profile/api/user/124/profile로 바꾸면 다른 사용자의 데이터가 노출될 수 있다.

Mass Assignment 취약점은 API가 의도한 것보다 더 많은 파라미터를 받아들일 때 발생한다. 공격자가 프로필 업데이트 요청에 "isAdmin": true를 추가해서 상승된 권한을 얻을 수 있다.

과도한 데이터 노출은 API가 필요 이상의 정보를 반환할 때 발생한다. 사용자 프로필 엔드포인트가 필터링되어야 할 내부 ID, 이메일 주소, 기타 민감한 데이터를 누출할 수 있다.

테스팅 방법론

수동 정찰로 시작하라. 브라우저의 네트워크 탭이나 프록시로 API 요청을 캡처한다. 모든 엔드포인트, 파라미터, 응답 형식을 문서화하라. URL 패턴, 인증 헤더, 데이터 구조에서 패턴을 찾아라.

인증 테스팅을 수행하라. 자격 증명 없이, 만료된 토큰으로, 다른 사용자의 토큰으로 엔드포인트에 접근을 시도해보라. API가 토큰 서명과 만료 시간을 제대로 검증하는지 테스트하라.

인가 테스팅은 수평적, 수직적 권한 상승에 집중한다. 사용자 A가 사용자 B의 리소스에 접근할 수 있나? 일반 사용자가 관리자 엔드포인트에 접근할 수 있나? 사용자 ID, 객체 참조, 역할 파라미터를 체계적으로 수정해보라.

입력 유효성 검사 테스팅은 예상치 못한 데이터 타입, SQL 인젝션 페이로드, XSS 벡터, 명령 인젝션 시도로 파라미터를 퍼징한다. 개발자들이 합법적인 클라이언트만 호출한다고 가정하기 때문에 API는 종종 웹 인터페이스보다 약한 입력 유효성 검사를 가진다.

필수 도구

Burp Suite는 API 테스팅의 황금 표준이다. Repeater 탭으로 요청을 수정하고 재전송할 수 있고, Intruder는 파라미터 퍼징을 자동화한다. 대부분의 테스팅에는 Community Edition으로 충분하다.

Postman은 체계적인 API 테스트 스위트를 구축하는 데 훌륭하다. 요청 저장, 테스트 컬렉션 생성, 보안 검사 자동화가 가능하다. Collection Runner로 여러 시나리오를 자동으로 테스트할 수 있다.

ffufwfuzz는 숨겨진 엔드포인트와 파라미터 발견에 완벽한 커맨드라인 퍼징 도구다. 대규모 테스팅에서 GUI 도구보다 빠르다.

JWT_Tool은 JSON Web Token을 특화적으로 타깃팅하여 약한 서명 알고리즘, 키 혼동 공격, 서명 우회 취약점을 테스트한다.

고급 기법

레이트 리미팅 우회는 API를 제대로 테스트하는 데 중요하다. 많은 API가 IP 주소 로테이션, 헤더 수정, 레이스 컨디션 악용으로 우회할 수 있는 결함 있는 레이트 리미팅을 구현한다.

GraphQL 인트로스펙션은 프로덕션에서 비활성화되지 않으면 전체 API 스키마를 드러낼 수 있다. 인트로스펙션 쿼리로 사용 가능한 모든 쿼리, 뮤테이션, 타입을 매핑한 뒤 각각을 체계적으로 테스트하라.

API 버전 테스팅은 종종 취약점을 드러낸다. 더 약한 보안 제어가 있을 수 있는 이전 API 버전(v1, v2)이 아직 접근 가능한지 확인하라. /api/v2/users에서 수정된 취약점이 /api/v1/users에 여전히 있는 경우도 있다.

자동화와 보고

Python의 requests 라이브러리나 Burp Suite 확장을 사용해 재사용 가능한 테스트 스크립트를 구축하라. 자동화로 할 수 있는 것들:

  • 여러 사용자에 걸쳐 인가 테스트
  • 파라미터 체계적 퍼징
  • 패치 후 수정 사항 검증
  • 회귀 테스팅

API 취약점을 보고할 때는 정확한 HTTP 요청과 응답을 포함한 명확한 재현 단계를 제공하라. 비즈니스 임팩트를 포함하라 — 특히 위험이 개발자에게 즉각적으로 명확하지 않을 수 있는 인가 문제의 경우.

마치며

API 보안 테스팅은 체계적인 접근과 창의적인 사고의 조합이 필요하다. 인증과 인가 테스팅의 기초를 마스터하고, 레이트 리미팅 우회나 Mass Assignment 익스플로잇 같은 고급 기법으로 확장하라.

핵심은 끈기다 — API는 철저한 테스팅 후에야 나타나는 미묘한 취약점을 가지고 있는 경우가 많다. 모든 것을 문서화하고, 반복 작업을 자동화하고, 항상 각 엔드포인트 뒤의 비즈니스 로직을 생각하라.

HackerOne, Bugcrowd 같은 버그 바운티 프로그램에서 안전하고 합법적으로 이 스킬들을 연습하자.