You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Spring Data JPA를 활용한 안전한 쿼리@RepositorypublicinterfaceUserRepositoryextendsJpaRepository<User, Long> {
OptionalfindByUsernameAndPassword(Stringusername, Stringpassword);
}
@Query("SELECT u FROM User u WHERE u.username = :username")
UserfindByUsername(@Param("username") Stringusername);
PreparedStatement는 입력값을 쿼리 구조에 영향을 주지 않는 파라미터로 처리하기 때문에, SQL Injection을 원천적으로 차단합니다. 또한 JPA는 내부적으로 이 구조를 자동화하여 제공하므로 보안과 유지보수 모두에 효과적입니다.
3. JPA에서도 SQL Injection이 가능한 경우
문자열 연결을 직접 하는 경우
// ❌ 취약@Query("SELECT u FROM User u WHERE u.username = '" + username + "'")
Native Query에서 문자열 연결
// ❌ 취약@Query(value = "SELECT * FROM users WHERE username = '" + username + "'", nativeQuery = true)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
1. 취약한 코드 사례 – 인증 우회 가능한 SQL
아래 코드는 JDBC를 이용하여 사용자의 입력값을 직접 SQL 문자열에 삽입하는 방식으로 작성되었습니다. 이 방식은 매우 흔하며, 입력값에 따라 쿼리 구조가 변경되므로 SQL Injection에 매우 취약합니다.
위 코드에서 사용자가 username 입력에 ' OR '1'='1 과 같은 값을 입력하면 쿼리의 WHERE 조건이 항상 true가 되어 인증이 우회됩니다. 이로 인해 모든 계정에 접근이 가능하며, 심각한 보안사고로 이어질 수 있습니다.
2. 안전한 코드 설계 – PreparedStatement & JPA
SQL Injection을 막기 위해 가장 효과적인 방법은 쿼리 구조를 고정하고 사용자 입력을 파라미터 바인딩으로 처리하는 것입니다. JDBC에서는 PreparedStatement, Spring Boot에서는 JPA 또는 QueryDSL을 활용
PreparedStatement는 입력값을 쿼리 구조에 영향을 주지 않는 파라미터로 처리하기 때문에, SQL Injection을 원천적으로 차단합니다. 또한 JPA는 내부적으로 이 구조를 자동화하여 제공하므로 보안과 유지보수 모두에 효과적입니다.
3. JPA에서도 SQL Injection이 가능한 경우
문자열 연결을 직접 하는 경우
Native Query에서 문자열 연결
Beta Was this translation helpful? Give feedback.
All reactions