OWASP Top 10
반복되는 취약점 목록이고, 공통 뼈대는 하나입니다. 외부에서 온 입력과 요청을 신뢰하지 않는 것입니다.
OWASP Top 10
주요 취약점
| 순위 | 취약점 | 설명 | 방어 |
|---|---|---|---|
| 1 | Injection | SQL/NoSQL 삽입 | PreparedStatement, ORM |
| 2 | 인증 실패 | 약한 비밀번호, 세션 탈취 | MFA, 토큰 관리 |
| 3 | XSS | 악성 스크립트 삽입 | 입력 이스케이프, CSP |
| 4 | CSRF | 위조 요청 | CSRF 토큰, SameSite 쿠키 |
왜 같은 것이 반복되나
목록의 항목은 바뀌어도 원인은 대개 셋 중 하나입니다.
신뢰 경계를 잊는다. 브라우저에서 온 값은 사용자가 바꿀 수 있습니다. 숨긴 필드, 요청 머리말, 쿠키 값이 다 그렇습니다. 화면에서 막은 것은 막은 것이 아니고, 서버가 다시 검사해야 막힌 것입니다.
권한 검사를 화면에 둔다. 버튼을 숨기는 것은 권한 검사가 아닙니다. 주소를 아는 사람은 그대로 부릅니다. 그리고 남의 것을 볼 수 있는지는 요청마다 그 자원의 주인이 맞는지 확인해야 알 수 있습니다. 로그인했는지만 보는 것으로는 부족합니다.
기본값이 위험하다. 관리 화면이 열려 있거나, 오류 메시지가 내부 구조를 보여 주거나, 쓰지 않는 기능이 켜져 있는 것입니다. 새로 만든 것이 아니라 켜 둔 것을 끄지 않은 것이 문제가 됩니다.
무엇을 먼저 막나
| 순서 | 무엇 | 왜 먼저인가 |
|---|---|---|
| 1 | 서버에서 입력 검사 | 대부분의 항목이 여기서 시작한다 |
| 2 | 요청마다 자원 소유 확인 | 남의 것을 보는 사고가 가장 흔하다 |
| 3 | 비밀을 코드와 로그에서 빼기 | 한 번 새면 되돌릴 수 없다 |
의존성 갱신도 여기 들어갑니다. 우리가 쓴 코드가 아니라 가져다 쓴 것에서 나는 문제가 많고, 그것은 새로 짜서 막는 것이 아니라 버전을 올려서 막습니다.
실무 포인트
- SQL Injection: PreparedStatement는 기본, ORM 사용이 가장 안전
- XSS: 사용자 입력을 그대로 HTML에 렌더링하지 않기
- HTTPS 필수: 모든 통신 암호화
- Spring Security, Helmet.js 등 프레임워크 보안 기능 활용
- Q.OWASP Top 10 중 가장 중요한 3가지는?
- Q.SQL Injection을 어떻게 방지하나요?
- Q.XSS와 CSRF 차이를 설명해주세요