JDBC는 Java에서 데이터베이스와 연결해 데이터를 주고받을 수 있게 해주는 API입니다. 즉, Java 애플리케이션에서 MySQL이나 PostgreSQL 같은 데이터베이스에 접근해서 데이터를 읽거나 쓸 수 있는 방법을 제공합니다. 데이터베이스와 연결할 때 JDBC 드라이버를 사용하는데, 이 드라이버는 데이터베이스마다 다릅니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
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;
}
}
SQL Injection은 웹 애플리케이션 보안 취약점 중 하나로, 공격자가 SQL 문을 조작해 데이터베이스에 불법적으로 접근할 수 있는 방법입니다. 예를 들어, 로그인 페이지에서 사용자가 입력한 ID와 비밀번호를 SQL 쿼리에 직접 삽입하는 경우, 공격자가 SQL 문을 조작해서 관리자 권한을 얻거나 데이터베이스 정보를 탈취할 수 있습니다.
아래처럼 SQL 쿼리를 작성할 때 문자열 연결로 사용자의 입력을 바로 포함시키면 공격에 취약해집니다:
// 안전하지 않은 방식
String search = request.getParameter("keyword");
String sql = "SELECT * FROM board WHERE title LIKE '%" + search + "%'";
SQL Injection을 방지하기 위해 PreparedStatement를 사용하는 것이 좋습니다. PreparedStatement는 SQL 쿼리와 데이터를 분리해서 실행하므로, 외부 입력에 대한 SQL 조작을 막을 수 있습니다.
// PreparedStatement 사용
String sql = "SELECT * FROM board WHERE title LIKE ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "%" + search + "%");
XSS는 공격자가 웹 페이지에 악성 스크립트를 삽입하는 보안 취약점입니다. 공격자가 의도적으로 스크립트를 삽입하면 사용자가 해당 페이지에 접속할 때 브라우저가 스크립트를 실행하게 되어, 사용자의 세션이나 개인정보가 유출될 수 있습니다.
// 위험한 방식
@GetMapping("/comment/{id}")
@ResponseBody
public String getComment(@PathVariable Long id) {
Comment comment = commentService.findById(id);
return comment.getContent(); // 사용자 입력을 그대로 반환
}
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는 웹 개발에서 꼭 주의해야 할 보안 문제입니다. 개발하면서 보안을 항상 염두에 두고 작성해야겠다고 느꼈습니다.