OWASP TOP 10
OWASP Top 10: 알아두면 좋은 웹 보안 기본
OWASP(Open Web Application Security Project)라는 곳에서 발표하는 "OWASP Top 10"은 웹 개발자라면 꼭 알아둬야 할 보안 취약점 10가지입니다.
잘 이해하고 개발하면, 웹 서비스가 해킹당할 확률을 훨씬 낮출 수 있습니다.
1. Broken Access Control (잘못된 접근 제어)
사용자가 권한이 없는 페이지나 데이터를 볼 수 있는 경우입니다.
예를 들면, 일반 사용자가 관리자 페이지에 들어갈 수 있다면 큰 문제겠죠
예시 코드 (문제 있는 접근 제어)
@RequestMapping("/admin")
public String adminPage(HttpServletRequest request) {
// 권한 체크를 안 하고 그냥 관리자 페이지를 보여줌
return "admin-page";
}
수정된 코드
@RequestMapping("/admin")
public String adminPage(HttpServletRequest request) {
if (!request.isUserInRole("ADMIN")) {
throw new AccessDeniedException("접근 권한이 없습니다.");
}
return "admin-page";
}
2. Cryptographic Failures (암호화 문제)
민감한 데이터를 암호화하지 않거나, 엉터리 암호화 방식을 쓰는 경우입니다. HTTPS를 안 쓰는 것도 여기에 포함되고요.
예시 코드 (문제 있는 비밀번호 저장)
String password = "userPassword";
String hashedPassword = Base64.getEncoder().encodeToString(password.getBytes());
수정된 코드
import org.springframework.security.crypto.bcrypt.BCrypt;
String password = "userPassword";
String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt());
3. Injection (인젝션 공격)
SQL 같은 명령어가 악의적인 입력에 의해 조작되는 경우입니다.
SQL Injection운 가장 흔한 취약점입니다. 예를 들어, 로그인 입력창에 악성 코드를 넣으면 문제가 생길 수 있습니다.
예시 코드 (SQL Injection 취약)
String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
수정된 코드 (PreparedStatement 사용)
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
4. Insecure Design (설계 단계부터 문제)
보안 요구사항을 아예 설계에 반영하지 않으면 이런 문제가 발생합니다. 처음부터 보안을 고려해서 개발해야 합니다.
5. Security Misconfiguration (보안 설정 실수)
기본 설정을 그대로 쓰거나, 중요 보안 패치를 안 하면 이 항목에 걸릴 수 있습니다.
항상 기본 설정을 확인하고 변경하거나 중요한 보안 패치는 바로 적용해야 합니다.
6. Vulnerable and Outdated Components (취약하거나 오래된 구성 요소)
사용하고 있는 라이브러리나 프레임워크가 오래돼서 취약점이 있다면, 빨리 업데이트해야 합니다.
이때 오래된 형식은 최신 버전과 호환되는지 꼭 확인 소스를 수정해야 합니다.
무턱대고 업데이트를 한다면 잘 실행되던 서비스가 멈추는 중대한 오류가 발생할 수 있습니다.
7. Identification and Authentication Failures (인증 문제)
로그인 시스템이 허술하거나, 세션 관리가 엉망일 경우 발생합니다.
예를 들어, 비밀번호 없이도 로그인되는 상황이 생길 수도 있죠.
8. Software and Data Integrity Failures (무결성 문제)
코드나 데이터가 변조되었는지 확인을 안 하거나, 믿을 수 없는 소스에서 데이터를 가져오는 경우입니다.
중요한 파일은 무결성 체크를 꼭 해야 합니다.
9. Security Logging and Monitoring Failures (보안 로깅 및 모니터링 부족)
보안 이벤트를 기록하지 않거나, 이상 징후를 모니터링하지 않으면 문제를 빨리 발견할 수 없습니다.
로그저장은 필수 입니다. 용량이 크다면 주기적으로 아카이빙(압축)하여 별도 폴더로 이동해야 합니다.
tomcat 같은 was 설정에서 로그 용량별 날짜별 시간대별로 분할 할 수 있습니다.
로그는 정발 소중한 블랙박스 같은 존재 입니다.
10. Server-Side Request Forgery (SSRF)
서버가 사용자가 입력한 값을 신뢰하고 외부 요청을 보낼 때 문제가 생길 수 있습니다.
예를 들어, 악성 URL을 서버가 대신 호출하게 만들 수 있죠
예시 코드 (문제 있는 SSRF)
URL url = new URL("http://example.com?target=" + userInput);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
수정된 코드
if (userInput.startsWith("http://") || userInput.startsWith("https://")) {
throw new IllegalArgumentException("외부 요청이 허용되지 않습니다.");
}
OWASP Top 10은 꼭 알아둬야 할 보안 팁입니다.
개발시 항상 숙지하고, 보안을 생각한다면 서비스가 안정적으로 구동될 것 입니다.
화이팅