
목차
ㄴ 왜 ‘인증했는데’ 사고가 나는가?
ㄴ 인증(Authentication)과 인가(Authorization)는 다르다
ㄴ API Gateway만으로 충분하지 않은 이유
ㄴ 실무에서 자주 발생하는 치명적 설계 실수
ㄴ AI 시대, API 남용 공격은 더 빨라진다
ㄴ 기업이 지금 점검해야 할 5가지
ㄴ 결론: API 보안은 장비가 아니라 설계의 문제다
API 보안 사고의 공통점은 하나다.
공격자는 로그인에 실패하지 않았다는 점이다.
계정을 확보한 뒤 정상적으로 인증을 통과한다.
문제는 그 이후에 발생한다.
예를 들어 사용자가 자신의 정보를 조회하는 API가 있다고 하자.
GET /api/users/1001
Authorization: Bearer {정상토큰}
정상 응답
{
"user_id": 1001,
"name": "홍길동"
}
여기까지는 문제없다.
공격자가 URL의 숫자만 바꾼다.
GET /api/users/1002
Authorization: Bearer {정상토큰}
{
"user_id": 1002,
"name": "이몽룡"
}
이 시스템은 인증은 했지만,
해당 데이터에 접근할 권한은 검증하지 않은 것이다.
많은 기업은 이렇게 생각한다.
하지만 이것은 입장권 확인에 불과하다.
API 보안의 핵심 질문은 이것이다.
“이 사용자가 이 데이터에 접근해도 되는가?”
이 질문이 코드에서 빠지는 순간,
인증은 의미를 잃는다.
API 시대의 보안은
“로그인을 막는 것”이 아니라
**“로그인 이후를 통제하는 것”**에 달려 있다.
API 보안 사고의 상당수는 기술 부족이 아니라
개념 혼동에서 시작된다.
많은 시스템이 이렇게 설계된다.
로그인 성공 → 접근 허용
하지만 인증과 인가는 전혀 다른 단계다.
예를 들어 사용자가 로그인하면 서버는 토큰을 발급한다.
POST /login
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
즉,
까지만 보장한다.
이제 사용자가 다음 요청을 보낸다.
GET /api/orders/5001
Authorization: Bearer {정상토큰}
인가 검증이 포함된 정상 로직은 이런 구조다.
if token.isValid() and isOwner(token.user_id, order_id):
return order
else:
return 403 Forbidden
그 순간 데이터 유출이 발생한다.
많은 조직이 “Gateway에서 인증 처리 중”이라고 말한다.
Gateway는 토큰 유효성은 확인할 수 있다.
그러나 다음은 알 수 없다.
이 판단은 애플리케이션 내부 로직의 책임이다.
API 환경에서는
“로그인했으니까 괜찮다”는 사고방식이 가장 위험하다.
많은 기업이 API Gateway를 도입한 뒤 이렇게 생각한다.
“이제 API 보안은 정리됐다.”
토큰 검증도 하고,
HTTPS도 적용했고,
접근 통제도 걸어두었다.
그러나 Gateway는 입구를 지키는 장치일 뿐이다.
API Gateway는 다음을 수행한다.
예를 들어,
GET /api/users/1001
Authorization: Bearer {정상토큰}
정상이면 내부 서비스로 전달한다.
여기까지는 안전해 보인다.
Gateway는 다음 질문에 답할 수 없다.
즉, Gateway는 “문을 열어줄지”는 판단하지만,
“어떤 방까지 들어갈 수 있는지”는 판단하지 못한다.
공격자가 정상 토큰을 가진 상태에서 요청을 보낸다.
GET /api/users/1002
Authorization: Bearer {정상토큰}
왜냐하면 토큰은 정상이고, 접근 경로도 허용 범위이기 때문이다.
문제는 내부 애플리케이션이
1002번 사용자가 요청자 본인인지 확인하지 않을 경우다.
이 경우 Gateway는 아무 역할을 하지 못한다.
현대 시스템은 단일 서버가 아니라
여러 내부 API가 서로 호출하는 구조다.
이 과정에서 내부 호출은
“신뢰된 요청”으로 처리되는 경우가 많다.
하나의 서비스가 침해되면
연쇄적으로 다른 서비스까지 접근 가능해진다.
Gateway는 내부 서비스 간 권한 위임까지 통제하지 못한다.
API 보안은 장비로 완성되지 않는다.
설계와 코드에서 완성된다.
API 사고는 대부분 고급 해킹 기법 때문이 아니다.
설계 단계에서 놓친 기본 검증이 원인인 경우가 많다.
다음은 실제 현장에서 반복적으로 발견되는 유형들이다.
가장 흔한 실수다.
GET /api/accounts/3001
Authorization: Bearer {정상토큰}
if token.isValid():
return getAccount(account_id)
계좌 소유자 검증 없이 데이터가 반환된다.
이 한 줄의 차이가 대량 개인정보 유출로 이어진다.
관리 편의를 이유로 하나의 토큰에 여러 권한을 부여하는 경우가 많다.
예를 들어 일반 사용자 토큰이 다음과 같은 API도 호출 가능하다면,
GET /api/admin/users
Authorization: Bearer {일반사용자토큰}
권한 분리가 제대로 이루어지지 않은 구조다.
권한은 “역할(Role)”이 아니라
“행위(Action)” 기준으로 최소화해야 한다.
많은 기업이 내부망 API에 대해 별도의 인가 검증을 하지 않는다.
GET http://internal-service/api/user-list
그러나 내부 계정 탈취나 SSRF 취약점이 존재하면
이 API는 그대로 공격 통로가 된다.
내부 API도 외부와 동일한 기준으로 보호해야 한다.
OAuth 기반 시스템에서 자주 발생한다.
{
"scope": "read write admin"
}
토큰에 다양한 scope가 포함되어 있지만
실제 API에서는 이를 확인하지 않는 경우가 많다.
if token.isValid():
processRequest()
권한 분리는 의미를 잃는다.
정상 사용자라도 자동화 도구를 사용하면
짧은 시간에 수천 건의 요청을 보낼 수 있다.
GET /api/users/1001
GET /api/users/1002
GET /api/users/1003
...
합법적인 요청으로 위장한 대량 수집이 가능해진다.
실무에서 발생하는 API 사고의 특징은 단순하다.
이 모든 문제는
장비가 아니라 설계와 코드에서 발생한다.
API 보안은 복잡해서 사고가 나는 것이 아니다.
기본 검증을 생략했기 때문에 사고가 난다.
과거 API 침해는 사람이 직접 테스트하고,
엔드포인트를 하나씩 분석하는 방식이 일반적이었다.
지금은 다르다.
AI와 자동화 도구의 결합으로
API 탐색·변조·수집이 훨씬 빠르고 정교해졌다.
AI 기반 스캐닝 도구는 다음을 자동으로 수행한다.
예를 들어, /api/users/{id} 형태가 발견되면
자동으로 ID 범위를 추정하고 반복 호출한다.
GET /api/users/1001
GET /api/users/1002
GET /api/users/1003
...
공격자가 정상 계정 하나만 확보해도
AI는 다음을 자동화할 수 있다.
이제 공격은 “가능한가”의 문제가 아니라
“얼마나 빠른가”의 문제로 바뀌고 있다.
LLM은 단순한 코드 생성 도구가 아니다.
API 문서를 입력하면 다음과 같은 전략을 제안할 수 있다.
즉, 전문 지식이 부족한 공격자도
AI를 통해 고급 테스트를 수행할 수 있다.
AI 기반 공격은 전통적인 “비정상 트래픽”과 다르다.
모든 것이 정상처럼 보이지만
행위의 목적이 비정상이다.
이런 유형은 단순 WAF나 Gateway 정책으로는 탐지하기 어렵다.
API 보안은 이제
“막을 수 있는가”가 아니라
“얼마나 빠르게 악용될 수 있는가”를 기준으로 설계해야 한다.
API 보안은 복잡한 기술 문제가 아니다.
대부분은 기본 점검 항목을 놓쳤기 때문에 사고가 난다.
지금 바로 확인해야 할 핵심 5가지는 다음과 같다.
모든 주요 API에 대해 다음 질문을 던져야 한다.
테스트 예시:
GET /api/users/1002
Authorization: Bearer {1001번 사용자 토큰}
HTTP/1.1 403 Forbidden
권한은 “편의성”이 아니라 “제한” 중심으로 설계해야 한다.
내부라는 이유로 면제되는 API는 없어야 한다.
정상 로그인 이후의 비정상 행위를 식별해야 한다.
로그는 저장만 하는 것이 아니라
행위 분석의 기반이 되어야 한다.
API 보안 점검의 출발점은 다음이다.
이 다섯 가지만 점검해도
대부분의 API 기반 사고는 사전에 차단할 수 있다.
많은 기업이 API 사고 이후 가장 먼저 하는 일은
보안 장비를 추가 도입하는 것이다.
물론 필요하다.
하지만 사고의 원인은 대부분 장비 부족이 아니다.
문제는 설계 단계에서 빠진 한 가지 질문이다.
“이 사용자가 이 데이터에 접근해도 되는가?”
API는 데이터 중심 구조다.
그리고 데이터 접근 권한은 네트워크 장비가 아니라
애플리케이션 로직 안에서 결정된다.
API 사고의 대부분은
인증 우회가 아니라 정상 로그인 이후에 발생한다.
그럼에도 데이터가 유출된다면
그 원인은 인가 설계에 있다.
과거 보안은
“외부 침입을 막는 것”이 중심이었다.
지금은 다르다.
API 보안의 핵심은
누가 들어오는지를 확인하는 것이 아니라
어디까지 허용할 것인가를 통제하는 것이다.
API 보안은 장비 경쟁이 아니다.
권한을 얼마나 정교하게 설계했는가의 문제다.
그리고 그 설계는
코드 한 줄에서 결정된다.
| [빗썸] 가진 비트코인보다 더 많은 60조원을 지급했다… 거래소가 비트코인을 만들어낼 수 있나 (0) | 2026.02.08 |
|---|---|
| QR코드 찍었을 뿐인데… 요즘 급증하는 ‘QR 사기’의 정체 (0) | 2026.01.18 |
| 개인정보보호 중심 설계(Privacy by Design), 시스템을 처음부터 어떻게 설계하라는 의미일까 (0) | 2026.01.16 |
| 미휴대폰 개통 ‘안면인증 의무화’…사진은 전송되나? 저장되나? (0) | 2025.12.24 |
| React 서버 컴포넌트 원격코드 실행 취약점(CVE-2025-55182) (0) | 2025.12.07 |