24.11.11 TIL JDBC, SQL Injection, XSS

신성훈·2024년 11월 11일
0

TIL

목록 보기
75/162

1. JDBC (Java Database Connectivity)

JDBC는 Java에서 데이터베이스와 연결해 데이터를 주고받을 수 있게 해주는 API입니다. 즉, Java 애플리케이션에서 MySQL이나 PostgreSQL 같은 데이터베이스에 접근해서 데이터를 읽거나 쓸 수 있는 방법을 제공합니다. 데이터베이스와 연결할 때 JDBC 드라이버를 사용하는데, 이 드라이버는 데이터베이스마다 다릅니다.

JDBC 기본 구현 과정

  1. 드라이버 설정: Maven pom.xml에 의존성 추가
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>
  1. 간단한 코드 예시
public class UserRepository {
    private static final String URL = "jdbc:mysql://localhost:3306/myapp";
    
    public User findById(Long userId) {
        String sql = "SELECT * FROM users WHERE id = ?";
        
        try (Connection conn = DriverManager.getConnection(URL, "user", "password");
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            
            pstmt.setLong(1, userId);
            ResultSet rs = pstmt.executeQuery();
            
            if (rs.next()) {
                return new User(
                    rs.getLong("id"),
                    rs.getString("username"),
                    rs.getString("email")
                );
            }
        } catch (SQLException e) {
            log.error("데이터베이스 조회 중 오류 발생", e);
        }
        return null;
    }
}

2. SQL Injection

SQL Injection은 웹 애플리케이션 보안 취약점 중 하나로, 공격자가 SQL 문을 조작해 데이터베이스에 불법적으로 접근할 수 있는 방법입니다. 예를 들어, 로그인 페이지에서 사용자가 입력한 ID와 비밀번호를 SQL 쿼리에 직접 삽입하는 경우, 공격자가 SQL 문을 조작해서 관리자 권한을 얻거나 데이터베이스 정보를 탈취할 수 있습니다.

1. SQL Injection 예시

아래처럼 SQL 쿼리를 작성할 때 문자열 연결로 사용자의 입력을 바로 포함시키면 공격에 취약해집니다:

// 안전하지 않은 방식
String search = request.getParameter("keyword");
String sql = "SELECT * FROM board WHERE title LIKE '%" + search + "%'";

2. SQL Injection 방지 방법

SQL Injection을 방지하기 위해 PreparedStatement를 사용하는 것이 좋습니다. PreparedStatement는 SQL 쿼리와 데이터를 분리해서 실행하므로, 외부 입력에 대한 SQL 조작을 막을 수 있습니다.

// PreparedStatement 사용
String sql = "SELECT * FROM board WHERE title LIKE ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "%" + search + "%");

3. XSS (Cross-Site Scripting)

XSS는 공격자가 웹 페이지에 악성 스크립트를 삽입하는 보안 취약점입니다. 공격자가 의도적으로 스크립트를 삽입하면 사용자가 해당 페이지에 접속할 때 브라우저가 스크립트를 실행하게 되어, 사용자의 세션이나 개인정보가 유출될 수 있습니다.

1. XSS 예시

// 위험한 방식
@GetMapping("/comment/{id}")
@ResponseBody
public String getComment(@PathVariable Long id) {
    Comment comment = commentService.findById(id);
    return comment.getContent(); // 사용자 입력을 그대로 반환
}

2. XSS 방지 방법

XSS를 방지하려면 사용자가 입력한 데이터에서 HTML 태그나 스크립트를 필터링하거나 이스케이프 처리해야 합니다. 서버 측에서 입력값을 검증하고, HTML 요소로 변환할 때 특정 태그나 스크립트를 제거하는 것이 중요합니다.

// HTML 이스케이프 처리
@GetMapping("/comment/{id}")
@ResponseBody
public String getComment(@PathVariable Long id) {
    Comment comment = commentService.findById(id);
    return HtmlUtils.htmlEscape(comment.getContent());
}

마무리

JDBC는 자바로 데이터베이스와 연결하는 기본적인 방법을 제공하고, SQL Injection과 XSS는 웹 개발에서 꼭 주의해야 할 보안 문제입니다. 개발하면서 보안을 항상 염두에 두고 작성해야겠다고 느꼈습니다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글