Web 개발자를 위한 취약점 종류 및 예방 가이드
이 문서는 웹 개발 시 고려해야 할 대표적인 취약점 종류와 각 취약점의 원인, 식별 방법, 예방(개발·운영 관점) 및 깊이 있는(전문가 수준) 대책을 한 번에 정리한 기술 문서입니다. 기본 개념 → 실무 대책 → 심화/전문가 팁 순으로 구성되어 있습니다.
목차
- 서론
- OWASP/CWE 개요
- 주요 취약점 목록(개요)
- 취약점별 설명과 예방
- 인증·권한(Identity & Access)
- 입력 검증·인젝션(SQL/OS/LDAP 등)
- XSS(크로스사이트 스크립팅)
- CSRF(Cross-Site Request Forgery)
- 보안 구성 오류(Security Misconfiguration)
- 민감정보 보호(암호화·비밀 관리)
- 의존성·서드파티(라이브러리) 취약점
- 파일 업로드 유효성/서버 측 검증
- SSRF(Server-Side Request Forgery)
- 로깅·모니터링 및 사고 대응
- 개발 체크리스트(사전/코드/배포)
- 보안 테스트(정적·동적·SCA·SAST·DAST·RASP)
- 운영·인프라 관점의 심화 대책
- 정책·컴플라이언스 및 문화(보안 SDLC)
- 요약 및 권장 우선순위
1. 서론
웹 애플리케이션은 복잡한 구성(클라이언트, 서버, DB, 서드파티 API, CDN, CI/CD 등)으로 인해 다양한 공격 표면(attack surface)을 갖습니다. 이 문서는 개발자가 바로 적용할 수 있는 실무 대책과, 보안 엔지니어/아키텍트가 적용할 고급 대책을 함께 제시합니다.
2. OWASP/CWE 개요
- OWASP Top 10은 웹 애플리케이션에서 자주 나타나는 위험을 정리한 참조 목록입니다. (개발 우선순위 선정에 유용)
- CWE Top 25는 전세계적으로 흔한 소프트웨어 약점을 정리한 목록으로, 근본 원인 관점에서 취약점을 살펴볼 때 도움이 됩니다.
3. 주요 취약점 목록(개요)
- Broken Access Control (권한/인가 실패)
- Cryptographic Failures (민감정보 처리 실패)
- Injection (SQL/OS/LDAP 등)
- Insecure Design (비안전한 설계)
- Security Misconfiguration (설정 오류)
- Vulnerable & Outdated Components (취약한 라이브러리)
- Identification & Authentication Failures (인증 실패)
- Software/Data Integrity Failures (공급망/무결성)
- Security Logging & Monitoring Failures
- Server-Side Request Forgery (SSRF)
(프로젝트/서비스 별로 우선순위를 정해 방어 계층을 쌓으세요.)
4. 취약점별 설명과 예방
A. 인증·권한(Identification, Authentication, Authorization)
문제: 로그인/세션/토큰 관련 취약으로 인해 권한이 없는 사용자가 민감 기능에 접근.
예방(기본)
- 안전한 비밀번호 저장: Argon2/bcrypt/scrypt 같은 패스워드 해싱 KDF 사용. Salt는 사용자별 고유값 사용.
- 세션 관리: 세션 토큰은 HttpOnly, Secure, SameSite 속성 적용. 세션 타임아웃 설정.
- 다중요소 인증(MFA) 도입.
- 비밀번호 재사용/유출 검사(비밀번호 대입 공격 방지).
심화(전문가)
- 권한 체크는 서버/비즈니스 로직 레벨에서 강제(클라이언트 신뢰 금지).
- 권한 모델은 최소 권한 원칙(least privilege)으로 설계. 권한 검증은 엔드포인트·서비스 레벨에서 표준화.
- 토큰 기반 인증(OAuth2/OpenID Connect) 사용 시 토큰 무효화, 키 롤오버 전략 수립.
B. 입력 검증 및 인젝션(SQL / Command / LDAP 등)
문제: 사용자 입력이 그대로 쿼리/명령으로 실행되어 데이터 유출·조작 발생.
예방(기본)
- Prepared statements(매개변수화된 쿼리) 사용. 절대 문자열 연결로 쿼리 조립 금지.
- ORM 사용 시도하라(하지만 raw query는 주의).
- 입력값 허용 목록(allow-list) 검증 우선. 길이·형식 검사.
- DB 계정의 최소 권한 부여.
심화(전문가)
- DB 레이어에서 쿼리 빌더/ORM과 방어를 병행. 쿼리 로그와 이상 탐지 규칙(예: 비정상 수정·대량 추출 감지).
- SQL 인젝션에 대비한 WAF 규칙(정책) 적용, 그러나 WAF는 보완 수단일 뿐 근본 방어는 코드 내 파라미터화.
C. XSS(크로스사이트 스크립팅)
문제: 악성 스크립트가 사용자 브라우저에서 실행되어 세션 탈취·피싱·클라이언트 측 권한 오용 발생.
예방(기본)
- 출력 시 맥락에 맞는 인코딩(output encoding) 적용(HTML, JavaScript, URL, CSS 각각 다른 인코딩).
- 입력값 필터링에만 의존하지 말고, 프레임워크의 자동 이스케이프 기능 활용.
- 사용자 작성 HTML을 허용할 때는 검증/정제(HTML Sanitization, 예: DOMPurify) 사용.
- CSP(Content-Security-Policy) 헤더로 스크립트 실행 출처 제한.
심화(전문가)
- DOM 기반 XSS 보호: 클라이언트 스크립트에서 사용자 입력을 DOM에 삽입할 때 안전한 API 사용.
- CSP를 엄격하게 구성하고 nonce 또는 hash 기반 스크립트 허용 방식을 병행.
D. CSRF(Cross-Site Request Forgery)
문제: 사용자가 의도하지 않은 요청을 인증된 상태에서 전송하여 상태 변조 발생.
예방
- 상태 변경 요청은 CSRF 토큰(서버 생성, 검증)으로 보호.
- 인증 쿠키는
SameSite=strict 또는 적절한 SameSite 정책 사용.
- 민감한 동작은 추가 인증(비밀번호 확인, OTP) 요구.
E. 보안 구성 오류(Security Misconfiguration)
문제: 디폴트 설정·불필요한 서비스·취약한 HTTP 헤더 등으로 공격 표면 증가.
예방
- 불필요한 서비스 비활성화, 관리 인터페이스 접근 제한.
- 보안 관련 HTTP 헤더 설정: CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy 등.
- 배포 자동화 파이프라인에서 시크릿이 노출되지 않도록 비밀 관리(환경 변수, 시크릿 스토어 사용).
F. 민감정보 보호 및 암호화
문제: 평문 비밀·API 키·개인정보가 유출될 위험.
예방
- 전송 중 TLS 적용(HTTPS 강제), 최신 TLS 버전 사용 및 강력한 암호화 스위트 적용.
- 저장된 민감 정보는 필수 항목만 보관, 가능한 경우 토큰화/암호화.
- 비밀 관리는 Vault/KMS 사용(클라우드 KMS, HashiCorp Vault 등).
G. 의존성·서드파티 취약점
문제: 오픈소스/서드파티 라이브러리의 취약점이 서비스에 전파.
예방
- SCA(Software Composition Analysis) 도구로 취약 라이브러리 식별(예: OWASP Dependency-Check, Snyk 등).
- 정기적 의존성 업데이트, 자동화된 리포트 및 긴급 패치 정책 수립.
- 서드파티 코드의 서명·출처 검증과 최소 권한 원칙 적용.
H. 파일 업로드 취약성
문제: 악성 파일 업로드 후 원격코드실행(RCE), 정보노출 등.
예방
- 확장자 검사뿐만 아니라 파일의 MIMETYPE/매직바이트 검사.
- 업로드된 파일은 실행 권한 제거 및 별도 스토리지/도메인에 저장(서비스 도메인과 분리).
- 파일명 무작위화, 경로 탐색 공격 차단.
I. SSRF (Server-Side Request Forgery)
문제: 서버가 임의의 내부 서비스/메타데이터에 접근하여 민감정보를 노출.
예방
- 외부로 나가는 요청에 대해 allow-list(허용 목록)만 허용.
- 내부 네트워크에 접근할 수 없는 프록시 사용, 요청 목적지 검증.
J. 로깅·모니터링·사고 대응
문제: 취약점이 악용되어도 탐지·대응이 없으면 피해 확대.
예방
- 중요 이벤트(로그인 실패, 권한 변경, 관리자 작업 등)를 위한 구조화된 로깅.
- 로그 중앙화(ELK, SIEM)와 탐지 규칙(이상 징후 탐지) 설정.
- 침해사고 대응(Incident Response) 시나리오·절차 및 정기 모의 훈련.
5. 개발 체크리스트(사전/코드/배포)
- 요구사항 단계에서 보안 요구사항 정의
- 위협 모델링(Threat Modeling) 및 위험 우선순위화
- 정적분석(SAST)과 동적검사(DAST) 통합
- 비밀(Secrets) 자동 검출 및 차단
- 코드 리뷰에서 보안 항목 필수 확인
- CI/CD 파이프라인에 보안 검사(빌드 실패 조건) 통합
6. 보안 테스트: SAST/DAST/SCA 및 펜테스트
- 정적 분석(SAST): 코드 레벨 취약점 사전 식별
- 동적 분석(DAST): 실제 실행 상태의 취약점 탐지
- SCA: 의존성 취약점 탐지
- RASP/EDR: 런타임 방어(제품 선택 시 성능 영향 고려)
- 정기적인 외부 펜테스팅 및 버그바운티 고려
7. 운영·인프라 관점의 심화 대책
- 네트워크 분할(내부 서비스 접근 최소화)
- WAF/IDS/IPS 도입(정책은 자주 점검)
- 자동화된 패치 관리(이미지 빌드 파이프라인에서 취약점 제거)
- 백업 및 안전한 복원 계획
8. 조직/프로세스: 보안 SDLC
- 보안 책임자 지정 및 보안 교육 정기화
- 코드 변경 시 보안 검사 통과 의무화
- 사고 발생 시 커뮤니케이션·법적 대응 절차 정의
9. 요약 및 권장 우선순위
- 인증·인가(권한 검증)와 비밀번호 저장 안전화
- 인젝션 방지(파라미터화된 쿼리)와 입력 검증
- XSS 예방(출력 인코딩 + CSP)
- 의존성 관리 및 패치 자동화
- 로깅/모니터링 및 사고 대응
부록: 빠른 체크리스트 (개발자용)
- 모든 사용자 입력은 신뢰하지 말라(Validate + Encode)
- 비밀번호는 반드시 KDF(Argon2/bcrypt 등)로 저장
- SQL은 PreparedStatement로 실행
- 파일 업로드는 별도 저장소 및 실행 권한 제거
- 중요한 설정은 코드 리포지토리에 직접 커밋 금지
- CSP로 스크립트·리소스 출처 제한
이 문서는 실무에서 바로 적용 가능하도록 예제·체크리스트 중심으로 작성했습니다. 더 상세한 프레임워크별(예: Spring, Express, Django) 구현 코드 예시나 CI/CD 통합 스크립트가 필요하면 이어서 만들어 드리겠습니다.