본문 바로가기
Etc2025년 9월 12일6분 읽기

OWASP Top 10 2024 — 웹 보안 취약점 완벽 정리

YS
김영삼
조회 130

OWASP Top 10 개요

OWASP(Open Web Application Security Project)는 웹 보안 위협을 주기적으로 분류하여 발표합니다. 개발자라면 반드시 알아야 할 주요 취약점과 그 방어 방법을 정리합니다.

주요 취약점 목록

순위취약점위험도빈도
A01Broken Access Control심각매우 높음
A02Cryptographic Failures심각높음
A03Injection심각높음
A04Insecure Design높음중간
A05Security Misconfiguration높음높음
A07XSS (Cross-Site Scripting)중간매우 높음

A01: 접근 제어 취약점 방어

// BAD: 클라이언트에서만 권한 체크
if (user.role === 'admin') showAdminPanel();

// GOOD: 서버 사이드 미들웨어
function requireRole(...roles) {
  return (req, res, next) => {
    if (!req.user || !roles.includes(req.user.role)) {
      return res.status(403).json({ error: 'Forbidden' });
    }
    next();
  };
}

// GOOD: 리소스 소유자 확인
app.put('/api/posts/:id', auth, async (req, res) => {
  const post = await db.post.findUnique({ where: { id: +req.params.id } });
  if (post.authorId !== req.user.id && req.user.role !== 'admin') {
    return res.status(403).json({ error: 'Forbidden' });
  }
});

A03: SQL Injection 방어

// BAD: 문자열 결합
const query = 'SELECT * FROM users WHERE id = ' + userId;

// GOOD: 파라미터 바인딩
const result = await db.query(
  'SELECT * FROM users WHERE id = $1',
  [userId]
);

// GOOD: ORM 사용 (Prisma)
const user = await prisma.user.findUnique({
  where: { id: parseInt(userId) },
});

// GOOD: 입력값 검증
const schema = z.object({
  id: z.coerce.number().int().positive(),
});
const { id } = schema.parse(req.params);

A07: XSS 방어

// GOOD: DOMPurify로 sanitize
import DOMPurify from 'dompurify';
const clean = DOMPurify.sanitize(userInput, {
  ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p', 'br'],
  ALLOWED_ATTR: ['href'],
});

// CSP 헤더 설정
app.use((req, res, next) => {
  res.setHeader(
    'Content-Security-Policy',
    "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"
  );
  next();
});

보안 헤더 체크리스트

// helmet 미들웨어 (Express/Fastify)
const helmet = require('helmet');
app.use(helmet({
  contentSecurityPolicy: true,
  crossOriginEmbedderPolicy: true,
  crossOriginOpenerPolicy: true,
  crossOriginResourcePolicy: true,
  dnsPrefetchControl: true,
  frameguard: { action: 'deny' },
  hsts: { maxAge: 31536000, includeSubDomains: true },
  noSniff: true,
  referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
  xssFilter: true,
}));
  • 모든 API 엔드포인트에 서버 사이드 권한 검증을 적용해야 합니다
  • 사용자 입력은 항상 서버에서 검증하고, 출력 시 이스케이프해야 합니다
  • 비밀번호는 bcrypt/argon2로 해싱하고, 민감 데이터는 AES-256으로 암호화합니다
  • 의존성 패키지의 취약점을 npm audit으로 정기 점검해야 합니다
  • HTTPS를 반드시 적용하고 HTTP는 리다이렉트 처리합니다

보안은 개발 초기부터 설계에 녹여야 합니다. OWASP Top 10은 최소한의 보안 기준이므로, 프로덕션 서비스라면 모든 항목을 체크리스트로 활용하길 권합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록