OWASP Top 10 개요
OWASP(Open Web Application Security Project)는 웹 보안 위협을 주기적으로 분류하여 발표합니다. 개발자라면 반드시 알아야 할 주요 취약점과 그 방어 방법을 정리합니다.
주요 취약점 목록
| 순위 | 취약점 | 위험도 | 빈도 |
|---|---|---|---|
| A01 | Broken Access Control | 심각 | 매우 높음 |
| A02 | Cryptographic Failures | 심각 | 높음 |
| A03 | Injection | 심각 | 높음 |
| A04 | Insecure Design | 높음 | 중간 |
| A05 | Security Misconfiguration | 높음 | 높음 |
| A07 | XSS (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