웹 서비스 보안 점검 가이드 - OWASP Top 10:2025 ep.00

배포를 마친 서비스는 조용하지 않습니다. 공개된 지 몇 시간 만에 전 세계의 스캐너가 /admin, /.env, /wp-login.php를 두드립니다. 이건 누군가 당신을 노려서가 아닙니다. 그냥 인터넷의 기본값입니다.


이 시리즈를 쓰는 이유

웹 서비스를 오픈하거나 기존 서비스에 변경을 배포할 때, 개발자 대부분은 비슷한 질문을 마주합니다. “뭘 점검해야 하지?” 그리고 그 질문에 대한 답은 대체로 두 방향으로 갈립니다.

한쪽 끝에는 보안 전문가의 시선이 있습니다. OWASP, CWE, CVE, STRIDE, DAST, SAST, SBOM 같은 약어들이 쏟아지고, 한 카테고리를 제대로 이해하려면 주말을 통째로 써야 합니다. 중요한 내용이지만 바쁜 실무자가 소화하기 어렵습니다.

다른 쪽 끝에는 “HTTPS 쓰고, 비밀번호 해시하고, SQL Injection 막으세요” 같은 체크리스트가 있습니다. 틀린 말은 아닌데, 실제로 어떻게 확인하는지가 빠져 있습니다. 막상 배포 전날이 되면 뭘 해야 할지 모호합니다.

이 시리즈는 그 중간을 노립니다. 보안을 전담하지 않는 중고급 개발자가 배포 직전과 운영 중에 실제로 돌려볼 수 있는 수준의 점검 방법을, 각 항목이 왜 중요한지에 대한 맥락과 함께 정리합니다.


OWASP Top 10이란, 그리고 왜 2025년판을 이야기하는가

OWASP(Open Worldwide Application Security Project) 는 웹 애플리케이션 보안에 대한 표준·도구·문서를 공개하는 비영리 프로젝트입니다. 그중 Top 10은 가장 널리 인용되는 문서로, 수십만 개 애플리케이션의 취약점 데이터를 기반으로 가장 자주 발견되는 보안 리스크 카테고리 10가지를 선정합니다.

오해하기 쉬운 부분부터 짚자면, Top 10은 “가장 위험한 취약점 Top 10”이 아닙니다. 등수는 심각도가 아니라 발견 빈도와 영향의 조합입니다. 다시 말해 “많은 서비스가 실제로 여기서 실수를 하고 있고, 그 실수가 비싸게 청구됩니다” 라는 리스트입니다.

OWASP Top 10은 대략 3~4년 주기로 갱신됩니다. 2025년 11월에 발표된 새 버전은 단순 순위 교체가 아니라 보안의 무게중심이 이동했다는 신호입니다.

OWASP Top 10 2021년판과 2025년판 비교

2025년판의 핵심 변화

Security Misconfiguration이 5위에서 2위로 급상승. 요즘 애플리케이션은 점점 더 많은 동작이 코드가 아니라 설정으로 결정됩니다. 클라우드 리소스 권한, 컨테이너 옵션, 기능 플래그, IaC 템플릿. 설정 한 줄의 실수가 S3 버킷 전체 공개로 이어지는 시대입니다.

Software Supply Chain Failures가 신규 3위. 2021년의 “Vulnerable and Outdated Components”를 확장한 카테고리로, 내가 쓴 코드뿐 아니라 끌어다 쓴 모든 것 — 의존성, 빌드 시스템, CI/CD, 배포 인프라 — 을 공격 경로로 봅니다. SolarWinds, event-stream, XZ Utils 백도어 같은 사건들이 이 방향 전환의 배경입니다.

Mishandling of Exceptional Conditions가 신규 10위. “예상치 못한 상황에서 애플리케이션이 안전하지 않게 반응하는” 문제. 스캐너가 거의 못 잡는 영역이고, 커뮤니티 설문에서 절반이 “가장 우려되는 리스크”로 꼽았습니다.

SSRF가 Broken Access Control로 흡수. 독립 카테고리였던 서버 사이드 요청 위조가, 본질적으로는 접근 제어 문제라는 판단입니다. 마이크로서비스·클라우드 환경에서 “사용자 권한”과 “서비스 권한”의 경계가 흐려지는 흐름을 반영합니다.

전체 리스트

순위카테고리변화
A01Broken Access Control (깨진 접근 제어)유지, SSRF 흡수
A02Security Misconfiguration (보안 설정 오류)↑ 5위에서 2위로
A03Software Supply Chain Failures (소프트웨어 공급망 실패)신규·확장
A04Cryptographic Failures (암호화 실패)↓ 2위에서 4위로
A05Injection (인젝션)↓ 3위에서 5위로
A06Insecure Design (보안이 부재한 설계)↓ 4위에서 6위로
A07Authentication Failures (인증 실패)유지
A08Software or Data Integrity Failures (무결성 실패)유지
A09Security Logging & Alerting Failures (로깅·알림 실패)유지
A10Mishandling of Exceptional Conditions (예외 상황 처리 실패)신규

한눈에 보이는 패턴이 있습니다. 코드 버그에서 운영 전반으로. 2021년까지가 “개발자가 코드에서 주의할 것” 중심이었다면, 2025년판은 설계·설정·공급망·운영까지 SDLC 전반을 다룹니다.

보안의 무게중심이 코드에서 운영 전반으로 이동


공격은 이미 진행 중입니다

시리즈 본편으로 들어가기 전에, 한 가지만 짚고 가겠습니다. 보안을 “사고가 나면 대응하는 것”으로 생각하는 개발자가 여전히 많습니다. 실제로는 사고가 나고서야 알게 되는 것이 문제입니다.

배포 직후 자동 스캐너가 공격 표면을 스캔하는 모습

공개 서버에 아무 서비스든 띄워보고 액세스 로그를 30분만 지켜보면 알게 됩니다. 한국 IP가 아닌 어딘가에서 자동화된 스캐너들이 끊임없이 요청을 보냅니다. /admin, /.git/config, /.env, /wp-admin, /phpmyadmin, /actuator/env, /api/v1/users. 이건 누가 당신을 노리는 게 아니라, 인터넷 전체를 기계가 훑고 있는 겁니다.

취약점이 공개되고 CVE 번호가 붙으면, 스캐너들이 그 취약점을 검사하는 모듈을 추가하는 데 걸리는 시간은 며칠 단위입니다. 당신이 Dependabot PR을 일주일 미루면, 그 일주일은 공격자의 기회 윈도우가 됩니다. 업계 평균으로 침해 사실을 인지하는 데까지 200일 이상이 걸린다는 IBM의 연례 보고서가 말하는 건, 그동안 공격자들은 조용히 자기 일을 한다는 뜻입니다.

이 시리즈의 기본 태도는 여기서 출발합니다. 사고를 기다리지 말고 미리 돌아볼 것. 그리고 완벽하려 하지 말고 자주 적용할 수 있는 것부터 할 것.


시리즈 구성

시리즈는 OWASP Top 10:2025의 10개 카테고리를 5편에 나눠 다룹니다. 관련이 깊은 항목끼리 묶어 흐름을 만들었습니다.

OWASP Top 10 2025 시리즈 로드맵

ep.01 - 인증과 인가의 경계 (A01 + A07)

“너 누구야”와 “너 이거 해도 돼”의 구분. IDOR, 권한 상승, 세션 관리, JWT의 함정, MFA 적용 기준. OWASP 데이터 기준 1위와 7위이지만 실제 사고의 대부분이 여기서 시작합니다.

ep.02 - 데이터 보호의 기본기 (A02 + A04)

보안 설정 오류와 암호화 실패. HTTPS, TLS, 보안 헤더, 비밀번호 저장, 키 관리, 클라우드 설정. 2025년판에서 각각 2위와 4위로, 설정 실수 하나가 전체를 뒤집는 범주입니다.

ep.03 - 신뢰 경계의 관리 (A05 + A08)

인젝션과 무결성 실패. 사용자 입력을 코드로 해석하게 두지 않기, 역직렬화의 위험, CDN 스크립트와 SRI, CI/CD 파이프라인 보호. “신뢰할 수 있는 것”과 “신뢰할 수 없는 것”의 경계 관리가 주제입니다.

ep.04 - 코드 밖의 리스크 (A03 + A06)

공급망과 설계. 의존성 관리, SBOM, Dependabot, Threat Modeling, 비즈니스 로직 악용. 스캐너로는 잡히지 않는 영역이고, 배포 직전이 아니라 설계 단계에서 봐야 하는 주제입니다.

ep.05 - 운영의 관측과 탄력성 (A09 + A10)

보안 로깅·알림 실패와 예외 상황 처리 실패. 뭘 로그로 남겨야 하는지, 알림은 어떻게 설정해야 실제로 작동하는지, 시스템이 안전하게 실패한다는 것이 무엇인지. “터졌을 때 빨리 알고 안전하게 멈추기” 가 주제입니다.

각 편은 해당 카테고리에 대해 개념 → 실제 시나리오 → 확인 방법(명령어 포함) → 체크리스트 → 더 파고들 포인트 의 구조를 따릅니다.


바로 쓸 수 있는 스모크 테스트

본편을 기다리지 않고 지금 바로 할 수 있는 점검들을 묶어봤습니다. 배포 직전 30분에서 1시간이면 돌아가는 조합이고, 여기서 나오는 치명적 이슈만 잡아도 실제 사고의 대부분을 막을 수 있습니다.

배포 직전 30분 스모크 테스트 6단계

1. 시크릿 유출 확인

Git 히스토리에 API 키·비밀번호·토큰이 남아 있는지 검사합니다. 이미 커밋된 시크릿은 삭제보다 회전이 우선입니다. GitHub는 캐시되고 포크에도 남아서 실질적 삭제가 어렵습니다.

# gitleaks 설치 후 전체 히스토리 스캔
# --redact: 검출된 시크릿을 콘솔에 그대로 뿌리지 않고 마스킹
brew install gitleaks
gitleaks detect --source . --verbose --redact

2. 전송 보안 점검

HTTPS 설정이 현대 기준에 맞는지 확인합니다. SSL Labs는 외부 공개 서버에만 접근 가능하고, 내부망·스테이징은 testssl.sh를 씁니다.

# 외부 공개 도메인은 브라우저에서:
# https://www.ssllabs.com/ssltest/analyze.html?d=example.com

# 내부·스테이징은 Docker로:
docker run --rm -ti drwetter/testssl.sh https://staging.example.com

A 등급이 아니면 어디가 부족한지 리포트에 나옵니다.

3. 보안 헤더 점검

HTTP 응답 헤더가 현대 기준을 충족하는지 확인합니다.

# 필수 헤더 한 번에 확인
curl -sI https://example.com | grep -iE 'strict-transport|content-security|x-content|x-frame|referrer|permissions'

또는 브라우저에서 securityheaders.com으로 A 등급 이상인지 확인.

4. 의존성 취약점 스캔

프로젝트에 포함된 패키지 중 알려진 취약점이 있는지 확인합니다.

# Node.js (--production: devDependencies 제외)
npm audit --production

# Python
pip install pip-audit
pip-audit

Critical·High는 배포 전에 해결, Medium 이하는 이슈 티켓으로 관리합니다.

5. IDOR 수동 테스트

자동화 스캐너가 가장 못 잡는 취약점입니다. 두 사용자 계정을 만들어 서로의 리소스에 접근해봅니다.

# User A로 리소스 생성 후 ID 확보 (예: 주문번호 1042)
# User B 토큰으로 User A의 리소스 호출 시도
curl -i https://api.example.com/orders/1042 \
  -H "Authorization: Bearer <USER_B_TOKEN>"

# 기대 응답: 403 Forbidden 또는 404 Not Found
# 200 OK가 떨어지면 IDOR 취약점

6. 자동 스캐너 실행

OWASP ZAP의 베이스라인 스캔. 5~10분이면 끝납니다.

# ZAP 공식 Docker 이미지로 baseline 스캔
# 결과는 HTML 리포트로 출력
docker run -t ghcr.io/zaproxy/zaproxy zap-baseline.py \
  -t https://staging.example.com \
  -r zap-report.html

High·Critical이 나오면 해결 후 재배포.


이 시리즈가 다루지 않는 것

솔직하게 범위를 좁히겠습니다.

법무·컴플라이언스 영역은 일부 언급은 하지만 메인 주제가 아닙니다. 개인정보보호법, ISMS-P, 전자금융감독규정 같은 것들은 법무·보안 담당자와의 협업이 필요한 별도 트랙입니다.

모바일 앱 보안은 별도 주제로 분리합니다. 번들 추출, 인증서 피닝, 루팅 탐지 같은 것들은 OWASP Mobile Top 10이 따로 있습니다.

AI·LLM 특화 취약점도 별도입니다. Prompt Injection, Insecure Output Handling 등은 OWASP LLM Top 10을 참고하시는 게 낫습니다.

침투 테스트 수행이 아니라 개발자 관점의 점검입니다. 공격자처럼 사고하는 건 경계하면서, 방어자의 체크리스트를 만듭니다.


시리즈의 활용 방법

이 시리즈는 두 가지 방식으로 쓸 수 있게 썼습니다.

순차 학습은 처음부터 끝까지 읽으며 OWASP Top 10:2025 전반을 이해하는 용도입니다. 각 편이 30분 안에 읽히도록 분량을 조절했습니다. 참조 체크리스트는 배포 전 또는 정기 점검 시 해당 편만 펴고 명령어를 복사해 돌려보는 용도입니다. 각 편 말미의 체크리스트 섹션은 실제 업무에 바로 쓸 수 있게 작성했습니다.

완독을 목표로 하지 마시고, 지금 가장 걱정되는 영역부터 펴보시는 것을 권합니다. 그리고 한 번에 다 적용하려 하지 마시고, 한 번에 하나씩 팀의 프로세스에 추가하시기 바랍니다. 꾸준히 돌릴 수 있는 한 가지가, 한 번 돌리고 마는 열 가지보다 낫습니다.


참고 자료


전체 목차


다음 편 예고

ep.01 - 인증과 인가의 경계

OWASP Top 10의 1위와 7위는 공교롭게도 같은 뿌리에서 나옵니다. “너 누구야”를 제대로 확인했는데 “너 이거 해도 돼”를 빼먹는 실수. 다음 편에서는 IDOR, 권한 상승, 세션 관리, JWT 구현의 함정을 실제 확인 방법과 함께 정리합니다.