블로그

API 취약점을 악용한 데이터 유출 사고와 방어 체계

Table of Contents

서론: API 취약점이 ‘데이터 유출’로 이어지는 전형적인 흐름

API 취약점을 악용한 데이터 유출 사고는 보통 “특정 기술이 뚫렸다”로만 요약되지만, 실제로는 이용 흐름과 운영 구조가 겹치면서 발생하는 경우가 많습니다. 사용자는 로그인, 조회, 수정 같은 기능을 자연스럽게 호출할 뿐인데, 그 호출 방식이 외부에서 그대로 재현되면 서비스 내부 데이터가 노출될 수 있습니다. 실제로 모바일 앱과 웹이 같은 백엔드 API를 공유하는 구조에서는, 화면에서 보이지 않는 필드까지 API 응답에 포함되어 있거나 권한 검증이 느슨한 지점이 사고로 직결됩니다. 이 글은 “어떤 취약점이 어떤 방식으로 악용되고, 방어 체계는 무엇을 우선순위로 잡아야 하는지”를 이용자가 실제로 궁금해하는 순서에 맞춰 해석 중심으로 정리합니다.

왜 ‘웹 취약점’보다 API가 더 자주 사고로 이어지나

웹 화면은 버튼과 페이지 단위로 사용 흐름이 제한되는 반면, API는 데이터 단위로 직접 요청·응답이 오갑니다. 공격자는 브라우저가 아니라 스크립트로 수천, 수만 건을 자동화해 호출할 수 있고, 이때 작은 검증 누락이 곧 대량 유출로 바뀝니다. 게다가 API는 “정상 기능의 확장”처럼 보이기 때문에. 모니터링이 부실하면 이상 징후를 늦게 알아차리는 경우도 있습니다. 화면이 멀쩡해 보여도 API 레벨에서 이미 데이터가 빠져나가고 있을 수 있다는 점이 핵심입니다.

사고가 터졌을 때 이용자와 운영자가 가장 먼저 확인하는 것

유출 사고가 알려지면 이용자는 “내 데이터가 포함됐는지, 어떤 항목이 나갔는지, 추가 피해가 가능한지”를 먼저 봅니다. 운영자는 그보다 앞서 “유출 경로가 API인지, 인증·인가 문제인지, 로그로 범위를 산정할 수 있는지”를 확인해야 합니다. 이때 초동 대응이 늦으면 유출 규모가 커지고, 공지와 사실관계가 어긋나 신뢰 문제가 더 크게 번집니다. 이로 인해 기술 조치와 커뮤니케이션이 동시에 움직이는 구조가 필요합니다.

어두운 사이버 배경에 금간 API 아이콘, 서버 데이터가 해커 실루엣으로 화살표로 새는 모습이다

본론 1: API 취약점 악용으로 데이터가 새는 대표 시나리오

API 기반 유출은 흔히 ‘해킹 툴로 뚫었다’기보다, 정상 호출을 비정상적으로 조합해 범위를 넓히는 형태로 발생합니다. 즉, 기능 자체는 정상인데 권한 검증이나 데이터 최소화가 부족한 지점이 문제로 드러납니다. 여기서는 실제 사고 분석에서 자주 등장하는 유형을 중심으로, 어떤 요청이 어떻게 악용되는지 흐름을 잡아보겠습니다. 각 유형은 단독으로도 위험하지만, 여러 개가 겹치면 피해가 급격히 커집니다.

BOLA/IDOR: “내 것만 봐야 하는데 남의 것도 보이는” 문제

BOLA(Broken Object Level Authorization) 또는 IDOR(Insecure Direct Object Reference)는 API 유출 사고에서 가장 자주 언급되는 유형입니다. 실제로 /api/orders/12345 같은 요청에서 숫자만 바꿔도 다른 사용자의 주문 정보가 응답으로 내려오면, 공격자는 연속 조회로 대량 수집을 할 수 있습니다. 화면에서는 ‘내 주문만’ 보이지만, API가 객체 접근 권한을 체크하지 않으면 데이터 경계가 무너집니다. 흔한 원인은 “로그인 여부만 확인하고 소유권(ownership) 검증을 빠뜨린” 설계입니다.

권한 상승: 역할(Role)과 스코프(Scope) 검증이 느슨할 때

관리자 전용 API나 내부 운영 API가 외부와 같은 도메인/게이트웨이 아래에 있고, 권한 검증이 토큰 존재 여부 정도로 끝나면 역할 상승이 생깁니다. 예컨대 일반 사용자 토큰으로 /api/admin/users를 호출했는데 403이 아니라 데이터가 반환되면 즉시 사고로 이어집니다. OAuth 스코프를 쓰더라도 서버가 스코프를 실제로 강제하지 않으면 “형식만 OAuth”가 됩니다, 권한 상승은 유출뿐 아니라 데이터 변조까지 연결되기 때문에 피해 산정이 더 복잡해집니다.

과다한 데이터 노출: 필요 없는 필드가 응답에 포함되는 습관

API 응답에 주민번호 같은 민감정보가 직접 포함되는 경우는 줄었지만, 이메일·전화번호·주소·내부 식별자·리셋 토큰 등 ‘2차 악용 가능한 데이터’가 섞여 나가는 경우는 여전히 많습니다. 개발 편의상 사용자 객체를 통째로 내려주고 프런트에서 필요한 것만 쓰는 방식이 대표적입니다. 외형상 기능은 정상이라 테스트에서 놓치기 쉽고, 공격자는 응답 JSON을 뜯어보며 가치 있는 필드를 찾습니다. “응답 최소화”가 습관이 되지 않으면 작은 누출이 큰 피해로 바뀝니다.

대량 수집(스크래핑)과 레이트 리밋 부재: 기능은 정상인데 규모가 비정상

검색 API, 목록 API, 추천 API는 원래 많은 호출을 전제로 하지만, 보호 장치가 없으면 자동화 수집에 취약해집니다. 공격자는 페이지네이션을 돌리거나 필터를 바꿔가며 가능한 조합을 모두 수집합니다. 이때 레이트 리밋이 없거나 IP 기반만 적용되어 있으면 프록시·봇넷으로 쉽게 우회됩니다. 결과적으로 “취약점이 아니라 운영 허점”처럼 보이지만, 실제 피해는 데이터 유출과 동일한 양상으로 나타납니다.

인증 토큰/키 노출: 클라이언트에 박힌 비밀의 함정

모바일 앱이나 프런트 코드에 API 키가 하드코딩되어 있거나, 로그·에러 메시지에 토큰이 남는 경우가 있습니다. 특히 ‘서버 간 통신용 키’를 클라이언트에 넣어두면, 키가 유출되는 순간부터 누구나 같은 권한으로 API를 호출할 수 있습니다. 또 액세스 토큰이 URL 쿼리스트링에 실리거나 리퍼러로 전파되면, 제3자 로그에 남아 사고가 커지기도 합니다. 비밀은 클라이언트에 두지 않는다는 원칙이 여기서 다시 확인됩니다.

SSRF와 내부 API 노출: 외부에서 내부로 우회하는 경로

이미지 URL 미리보기, 웹훅 테스트, 외부 리소스 가져오기 같은 기능은 서버가 외부 URL에 접근하도록 만듭니다. 검증이 부족하면 SSRF(Server-Side Request Forgery)로 내부망 API(예: 메타데이터 서버, 내부 관리 콘솔)를 호출하게 만들 수 있습니다. 내부 API는 “외부에서 못 들어온다”는 가정으로 인증을 약하게 해둔 경우가 있어, SSRF가 열리면 내부 데이터가 한 번에 노출될 수 있습니다, 이런 사고는 원인 파악이 늦어지는 편이라 초동 로그가 특히 중요합니다.

어두운 기술 배경 위, 해커 실루엣과 노출된 DB기록, 경고 아이콘으로 API 유출을 나타낸 슬라이드이다.

본론 2: 공격자가 실제로 움직이는 방식과, 사고가 커지는 지점

API 공격은 대개 정교한 제로데이보다 관찰과 반복으로 성립하며, 데이터베이스 암호화 방식이 유저 정보 보호에 미치는 영향을 함께 보지 않으면 방어 설계의 핵심을 놓치기 쉽다. 공격자는 앱·웹의 네트워크 트래픽을 관찰해 엔드포인트를 수집하고 파라미터를 변형하며 응답 구조를 비교해 경계가 느슨한 지점을 찾는데, 이 과정은 자동화하기 쉬워 방어 측이 놓치면 단기간에 대량 유출로 확장된다. 그래서 커뮤니티나 서비스 운영 환경에서는 사고가 커지는 지점을 미리 정리하고, 접근 통제·로깅·암호화가 실제 데이터 흐름과 맞물려 작동하는지 점검하는 흐름이 필요하다.

1단계: 엔드포인트 수집과 규칙 찾기

공격자는 개발자도구, 프록시, 앱 디컴파일 등을 통해 API 목록을 모읍니다. 이후 URL 패턴, ID 규칙(연속 숫자, UUID), 페이지네이션 방식 같은 ‘규칙’을 찾고 자동화에 맞게 정리합니다. 이 단계에서 문서화된 공개 API뿐 아니라 숨겨진 내부 API가 노출되는 경우도 있습니다. 운영 측에서는 “문서에 없으니 안전하다”는 가정이 가장 먼저 깨지는 구간입니다.

2단계: 권한 경계 테스트와 응답 비교

다음은 권한이 다른 계정으로 같은 요청을 보내거나, ID만 바꿔서 응답 차이를 봅니다. 401/403이 나와야 할 곳에서 200이 떨어지면 바로 수집 루틴을 돌릴 수 있습니다. 응답이 일부 마스킹되더라도, 내부 식별자나 이메일 일부 같은 단서가 남으면 대조를 통해 복원이 가능할 때가 있습니다. “조금만 보였으니 괜찮다”는 판단이 위험한 이유가 여기에 있습니다.

3단계: 자동화 수집과 은닉(분산 호출)

유출은 보통 한 번의 요청으로 끝나지 않고, 수천~수백만 번의 호출로 누적됩니다. 공격자는 IP를 분산하고, 호출 속도를 사람처럼 조절하며, 시간대를 나눠 모니터링을 피합니다, 레이트 리밋이 계정 단위가 아니라 ip 단위면 우회가 쉬워지고, waf가 패턴 기반이면 정상 호출로 보이는 트래픽을 걸러내기 어렵습니다. 결국 “정상 기능을 정상처럼 호출”하는 공격이 가장 탐지 난도가 높습니다.

4단계: 2차 피해로 연결되는 데이터 조합

유출된 데이터가 단독으로는 치명적이지 않아 보여도, 다른 유출 데이터와 결합되면 피싱·계정탈취로 이어질 수 있습니다. 예를 들어 이메일+전화번호+최근 주문내역 같은 조합은 신뢰도 높은 사칭 메시지를 만드는 데 쓰입니다. 비밀번호가 유출되지 않았다고 안심하기 어려운 이유가 여기에 있습니다. 운영자가 공지에서 “어떤 항목이 포함됐는지”를 명확히 해야 하는 것도 같은 맥락입니다.

본론 3: 방어 체계는 ‘기술 목록’보다 ‘운영 흐름’으로 설계해야 한다

API 보안은 단순히 WAF를 붙이거나 인증을 강화하는 것으로 끝나지 않습니다. 실제 서비스는 기능이 늘어나고, 앱/웹/외부 파트너가 동시에 붙고, 운영 도구가 추가되면서 경계가 계속 바뀝니다, 그래서 방어 체계는 “한 번 구축”이 아니라 “계속 확인하고 조정”하는 흐름으로 설계되어야 합니다. 아래 항목들은 현장에서 우선순위를 잡기 좋은 순서로 정리했습니다.

인가(Authorization)를 표준화: 객체 단위 권한 체크를 습관으로 만들기

BOLA/IDOR를 막는 핵심은 “요청한 사용자가 그 객체를 볼 수 있는가”를 서버에서 매번 확인하는 것입니다. 컨트롤러마다 임기응변으로 체크하면 누락이 생기므로, 정책 엔진이나 공통 미들웨어 형태로 표준화하는 편이 안전합니다. 소유권 검증, 조직/테넌트 경계, 역할 기반 접근 제어를 한 흐름으로 묶어두면 실수 가능성이 줄어듭니다. 테스트 케이스도 “정상 사용자/타 사용자/권한 없는 역할”을 기본 세트로 고정해두는 것이 좋습니다.

응답 최소화와 데이터 분류: ‘내보내도 되는 데이터’부터 정의하기

API 응답은 필요한 필드만 내려주는 방향으로 설계하는 것이 기본입니다. 이를 위해 개인정보/준식별정보/운영정보/보안민감정보 같은 데이터 분류 기준을 먼저 정하고, 각 등급별로 노출 정책을 정리합니다. 개발 단계에서 DTO를 명확히 분리하면 “객체 통째 반환” 같은 위험한 습관을 줄일 수 있습니다. 운영 중에는 스키마 변경 시 자동으로 민감 필드가 응답에 섞이지 않도록 리뷰 체크포인트를 두는 편이 현실적입니다.

레이트 리밋과 봇 대응: IP가 아니라 ‘계정·토큰·행동’ 단위로

대량 수집은 정상 호출과 형태가 비슷해 탐지가 어렵기 때문에, 속도 제한을 정교하게 설계해야 합니다. 흥미로운 점은 iP 기반 제한만으로는 우회가 쉬워 계정/토큰 단위 제한, 엔드포인트별 쿼터, 비정상 페이지네이션 패턴 탐지 같은 조합이 필요합니다. 또한 검색·목록 API는 비즈니스적으로 허용되는 호출량이 존재하므로, 운영팀과 합의된 기준(예: 분당 호출 수, 시간당 다운로드량)을 먼저 잡아야 합니다. 이 기준이 있어야 차단이 과잉 대응이 되지 않습니다.

API 게이트웨이/WAF의 역할: 만능이 아니라 ‘정책 집행 지점’

게이트웨이와 WAF는 인증 강제, 기본적인 입력 검증, 알려진 공격 패턴 차단에 유용합니다. 하지만 IDOR처럼 “정상 요청”을 악용하는 문제는 애플리케이션 인가 로직이 제대로 서야 해결됩니다. 이에 따라 게이트웨이는 관문 역할로 두고, 애플리케이션은 객체 권한 검증을 책임지는 구조가 균형이 맞습니다. 로그 상관관계(요청 ID, 사용자 ID, 토큰 ID)를 게이트웨이에서 일관되게 찍어두면 사고 대응 속도가 빨라집니다.

시크릿 관리: 키를 숨기는 게 아니라 ‘수명과 범위’를 줄이기

API 키와 토큰은 언젠가 노출된다는 가정이 더 실용적입니다. 그래서 키는 최소 권한으로 발급하고, 만료를 짧게 가져가며, 회전(rotate) 절차를 자동화하는 것이 중요합니다. 클라이언트에 들어가는 키는 공개 키 수준으로 취급하고, 서버 간 통신용 비밀은 절대 클라이언트로 내려가지 않게 분리합니다. 로그와 APM에 토큰이 기록되지 않도록 마스킹 규칙을 운영 표준으로 정해두면 뒤늦은 2차 유출도 막을 수 있습니다.

관측 가능성(Observability): “누가 무엇을 얼마나 했는지”를 남기는 설계

사고가 났을 때 가장 곤란한 상황은 “유출이 의심되는데 범위를 특정할 로그가 없는” 경우입니다. 사용자/토큰/엔드포인트/응답 크기/쿼리 조건 같은 핵심 메타데이터를 구조화 로그로 남기고, 보관 기간과 접근 권한을 명확히 해야 합니다. 개인정보가 로그에 섞이지 않도록 주의하면서도, 이상 징후를 탐지할 정도의 단서는 남겨야 합니다. 이 균형이 잡히면 대응이 빨라지고, 공지도 더 정확해집니다.

결론: ‘취약점 하나’가 아니라 ‘흐름 전체’에서 유출을 막는 관점

API 취약점을 악용한 데이터 유출은 대체로 인증의 부재보다 인가 누락, 과다 노출, 대량 호출 통제 실패 같은 운영형 문제에서 시작됩니다. 공격자는 복잡한 기술보다 반복 가능한 규칙을 찾아 자동화하고, 작은 틈이 있으면 규모를 키우는 방식으로 움직입니다. 방어 체계는 WAF 같은 단일 솔루션에 기대기보다, 객체 단위 권한 검증 표준화, 응답 최소화, 레이트 리밋, 시크릿 관리, 관측 가능성까지 이어지는 흐름으로 설계하는 편이 효과적입니다. 결국 중요한 것은 “API를 기능 목록이 아니라 데이터 경계로 본다”는 관점이며, 그 관점이 자리 잡으면 사고 가능성을 현실적으로 낮출 수 있습니다.