🔒 보안

OWASP

Open Web Application Security Project

웹 애플리케이션 보안을 위한 글로벌 비영리 커뮤니티입니다. OWASP Top 10을 통해 가장 치명적인 웹 취약점을 정의하고, ZAP, Dependency-Check 등 무료 오픈소스 보안 도구와 가이드라인을 제공합니다. 개발자, 보안 전문가, 조직이 안전한 소프트웨어를 개발하도록 지원합니다.

📖 상세 설명

OWASP(Open Web Application Security Project)는 2001년 Mark Curphey가 설립한 비영리 재단으로, 소프트웨어 보안 향상을 목표로 합니다. 전 세계 수만 명의 보안 전문가, 개발자, 연구자가 참여하는 커뮤니티 주도 프로젝트로, 모든 자료와 도구를 무료로 공개합니다. OWASP의 핵심 철학은 "보안은 모든 사람의 책임"이며, 기업 규모나 예산에 관계없이 누구나 안전한 소프트웨어를 만들 수 있도록 지원합니다.

OWASP Top 10은 가장 널리 알려진 프로젝트로, 웹 애플리케이션에서 가장 치명적인 10대 취약점을 정리합니다. 2021년 버전 기준으로 Broken Access Control(접근 제어 취약점), Cryptographic Failures(암호화 실패), Injection(인젝션), Insecure Design(안전하지 않은 설계) 등이 포함됩니다. 이 목록은 3~4년마다 업데이트되며, 실제 취약점 데이터와 보안 전문가 설문을 기반으로 작성됩니다. 많은 조직이 OWASP Top 10을 보안 요구사항 기준으로 채택하고 있습니다.

OWASP는 Top 10 외에도 다양한 프로젝트를 운영합니다. OWASP ZAP(Zed Attack Proxy)는 가장 인기 있는 무료 웹 취약점 스캐너로, 자동화된 보안 테스트를 지원합니다. OWASP Dependency-Check는 프로젝트의 의존성에서 알려진 취약점을 탐지합니다. OWASP ASVS(Application Security Verification Standard)는 애플리케이션 보안 검증 표준을 제공하고, OWASP SAMM(Software Assurance Maturity Model)은 조직의 보안 성숙도를 평가하는 프레임워크입니다.

현대 소프트웨어 개발에서 OWASP는 필수적인 참조 자료입니다. DevSecOps 파이프라인에 OWASP ZAP을 통합하여 자동화된 보안 테스트를 수행하고, OWASP Dependency-Check로 취약한 라이브러리를 탐지합니다. PCI-DSS, HIPAA 등 규정 준수 감사에서도 OWASP Top 10 대응이 요구되는 경우가 많습니다. AI/ML 시스템의 보안을 위한 OWASP AI Security 프로젝트도 새롭게 주목받고 있습니다.

💻 코드 예제

# OWASP ZAP (Zed Attack Proxy) - 웹 취약점 자동 스캔
# Docker를 사용한 ZAP 스캔 예제

# 1. 기본 스캔 (Baseline Scan) - 빠른 수동적 스캔
docker run -t owasp/zap2docker-stable zap-baseline.py \
    -t https://example.com \
    -r zap-report.html

# 2. 전체 스캔 (Full Scan) - 능동적 취약점 테스트 포함
docker run -t owasp/zap2docker-stable zap-full-scan.py \
    -t https://example.com \
    -r full-report.html \
    -a  # AJAX Spider 포함

# 3. API 스캔 - OpenAPI/Swagger 스펙 기반
docker run -t owasp/zap2docker-stable zap-api-scan.py \
    -t https://api.example.com/openapi.json \
    -f openapi \
    -r api-report.html

# 4. CI/CD 통합 예제 (GitHub Actions)
# .github/workflows/security.yml
# name: OWASP ZAP Security Scan
# on: [push]
# jobs:
#   zap_scan:
#     runs-on: ubuntu-latest
#     steps:
#       - name: ZAP Scan
#         uses: zaproxy/action-baseline@v0.7.0
#         with:
#           target: 'https://staging.example.com'
#           fail_action: true
#           rules_file_name: '.zap/rules.tsv'

# 5. ZAP Python API 활용 예제
# pip install python-owasp-zap-v2.4
from zapv2 import ZAPv2

zap = ZAPv2(proxies={'http': 'http://127.0.0.1:8080'})

# Spider로 사이트 크롤링
zap.spider.scan('https://example.com')
while int(zap.spider.status()) < 100:
    time.sleep(2)

# 능동적 스캔 시작
zap.ascan.scan('https://example.com')
while int(zap.ascan.status()) < 100:
    time.sleep(5)

# 결과 확인
alerts = zap.core.alerts()
for alert in alerts:
    print(f"[{alert['risk']}] {alert['name']}: {alert['url']}")
# OWASP Dependency-Check - 의존성 취약점 검사
# 알려진 취약점(CVE)이 있는 라이브러리 탐지

# 1. CLI 설치 및 실행
# macOS
brew install dependency-check

# 프로젝트 스캔
dependency-check --project "MyProject" \
    --scan /path/to/project \
    --format HTML \
    --out dependency-check-report.html

# 2. Maven 플러그인 (pom.xml)
# <plugin>
#     <groupId>org.owasp</groupId>
#     <artifactId>dependency-check-maven</artifactId>
#     <version>8.4.0</version>
#     <executions>
#         <execution>
#             <goals>
#                 <goal>check</goal>
#             </goals>
#         </execution>
#     </executions>
#     <configuration>
#         <failBuildOnCVSS>7</failBuildOnCVSS>
#     </configuration>
# </plugin>
mvn dependency-check:check

# 3. Gradle 플러그인 (build.gradle)
# plugins {
#     id "org.owasp.dependencycheck" version "8.4.0"
# }
# dependencyCheck {
#     failBuildOnCVSS = 7
#     suppressionFile = "dependency-check-suppressions.xml"
# }
./gradlew dependencyCheckAnalyze

# 4. npm/yarn 프로젝트 (Node.js)
# npm audit 대안으로 더 정확한 검사
dependency-check --project "NodeApp" \
    --scan ./node_modules \
    --scan ./package-lock.json \
    --enableExperimental

# 5. GitHub Actions 통합
# - name: OWASP Dependency Check
#   uses: dependency-check/Dependency-Check_Action@main
#   with:
#     project: 'MyProject'
#     path: '.'
#     format: 'HTML'
#     args: '--failOnCVSS 7'
// OWASP Top 10 취약점 예방 코드 예제 (Node.js/Express)

const express = require('express');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const { body, validationResult } = require('express-validator');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

const app = express();

// A03:2021 - Injection 방지
// 1. 파라미터화된 쿼리 사용 (SQL Injection 방지)
const { Pool } = require('pg');
const pool = new Pool();

// 잘못된 예 (취약)
// const query = `SELECT * FROM users WHERE id = ${userId}`;

// 올바른 예 (안전)
async function getUserById(userId) {
    const result = await pool.query(
        'SELECT * FROM users WHERE id = $1',  // 파라미터화
        [userId]
    );
    return result.rows[0];
}

// A02:2021 - Cryptographic Failures 방지
// 2. 안전한 비밀번호 해싱
async function hashPassword(password) {
    const saltRounds = 12;  // 최소 10 이상 권장
    return await bcrypt.hash(password, saltRounds);
}

async function verifyPassword(password, hash) {
    return await bcrypt.compare(password, hash);
}

// A01:2021 - Broken Access Control 방지
// 3. 역할 기반 접근 제어
function authorize(requiredRole) {
    return (req, res, next) => {
        const userRole = req.user?.role;
        if (!userRole || !hasPermission(userRole, requiredRole)) {
            return res.status(403).json({ error: 'Forbidden' });
        }
        next();
    };
}

// A07:2021 - XSS 방지
// 4. Helmet으로 보안 헤더 설정
app.use(helmet({
    contentSecurityPolicy: {
        directives: {
            defaultSrc: ["'self'"],
            scriptSrc: ["'self'"],  // 인라인 스크립트 차단
            styleSrc: ["'self'", "'unsafe-inline'"],
            imgSrc: ["'self'", "data:", "https:"],
        },
    },
    xssFilter: true,
}));

// A04:2021 - Insecure Design 방지
// 5. Rate Limiting (무차별 대입 공격 방지)
const loginLimiter = rateLimit({
    windowMs: 15 * 60 * 1000,  // 15분
    max: 5,  // 최대 5번 시도
    message: { error: 'Too many login attempts. Try again later.' },
    standardHeaders: true,
});

app.post('/login', loginLimiter, async (req, res) => {
    // 로그인 로직
});

// A03:2021 - Injection 방지 (입력 검증)
// 6. express-validator로 입력 검증
app.post('/users',
    [
        body('email').isEmail().normalizeEmail(),
        body('username').isAlphanumeric().isLength({ min: 3, max: 20 }),
        body('password').isStrongPassword({
            minLength: 12,
            minLowercase: 1,
            minUppercase: 1,
            minNumbers: 1,
            minSymbols: 1
        }),
    ],
    (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() });
        }
        // 사용자 생성 로직
    }
);

// A08:2021 - SSRF 방지
// 7. URL 화이트리스트 검증
const allowedHosts = ['api.trusted.com', 'cdn.trusted.com'];

function isAllowedUrl(url) {
    try {
        const parsed = new URL(url);
        return allowedHosts.includes(parsed.hostname);
    } catch {
        return false;
    }
}

app.post('/fetch-url', (req, res) => {
    if (!isAllowedUrl(req.body.url)) {
        return res.status(400).json({ error: 'URL not allowed' });
    }
    // URL 페치 로직
});

🗣️ 실무에서 이렇게 말하세요

💬 보안 감사 준비 회의에서
"이번 보안 감사에서 OWASP Top 10 대응 현황을 물어볼 겁니다. OWASP ZAP으로 스테이징 환경 전체 스캔을 돌리고, Dependency-Check로 모든 서비스의 취약한 의존성을 점검합시다. A01 Broken Access Control과 A03 Injection은 특히 꼼꼼히 확인해야 합니다."
💬 코드 리뷰에서
"이 부분 OWASP A03 Injection 취약점이에요. 사용자 입력을 직접 SQL 쿼리에 넣으면 안 됩니다. 파라미터화된 쿼리를 사용하거나 ORM의 안전한 메서드를 쓰세요. OWASP Cheat Sheet에 언어별 안전한 코딩 가이드가 있으니 참고하시면 됩니다."
💬 DevSecOps 파이프라인 구축에서
"CI/CD에 OWASP 도구들을 통합합시다. PR 단계에서 Dependency-Check로 취약한 라이브러리를 차단하고, 스테이징 배포 후 ZAP API 스캔을 자동으로 돌립니다. CVSS 7 이상이면 배포 차단하는 게이트를 만들어서 고위험 취약점이 프로덕션에 나가지 않도록 하죠."

⚠️ 주의사항 & 베스트 프랙티스

OWASP Top 10만 확인하면 충분하다는 착각

Top 10은 가장 흔한 취약점 10개일 뿐, 모든 보안 위협을 다루지 않습니다. OWASP ASVS(Application Security Verification Standard)로 더 포괄적인 보안 검증을 수행하세요. Top 10은 시작점이지 종착점이 아닙니다.

자동화 도구 결과를 맹신

OWASP ZAP이나 Dependency-Check는 알려진 취약점 패턴만 탐지합니다. 비즈니스 로직 취약점, 제로데이, 복잡한 인증 우회 등은 수동 침투 테스트가 필요합니다. 자동화 도구는 보조 수단이지 완벽한 해결책이 아닙니다.

False Positive 무시 또는 과민 반응

취약점 스캔 결과에는 오탐(False Positive)이 포함됩니다. 모든 경고를 무시하거나 반대로 모든 경고에 과민 반응하면 안 됩니다. 각 취약점을 수동으로 검증하고, 억제 규칙(suppression)을 적절히 관리하세요.

OWASP 베스트 프랙티스

개발 단계부터 OWASP Secure Coding Practices를 적용하세요. CI/CD에 ZAP과 Dependency-Check를 통합하여 지속적 보안 검사를 수행합니다. 정기적으로 OWASP Top 10 업데이트를 확인하고 팀 교육을 진행하세요. OWASP SAMM으로 조직의 보안 성숙도를 측정하고 개선 계획을 수립하는 것도 좋습니다.

🔗 관련 용어

📚 더 배우기