SQL Injection
우선 SQL Injection이 무엇인지 간단하게 알아보자.
SQL Injection은 해석 그대로 SQL 쿼리를 삽입하는 공격 방법이다.
이 공격 방법을 예로 설명하자면 로그인을 할 때 틀린 비밀번호를 이용해 인증하여 인가 권한을 받을 수 있을 것이다.

4년 주기로 웹 애플리케이션 보안 취약점 Top 10을 OWASP에서 올려주는데 이전 2017년보다 2021년에 Injection 공격이 낮아지기는 하였으나 꾸준히 올라오는 위험한 취약점이다.
SQL Injection 대응방안
SQL Injection을 대응하는 방법에는 크게 2가지로 분류할 수 있다.
첫 번째로는 Stored Procedure나 Prepared Statement를 사용하는 것이고, 두 번째로는 특정 문자를 필터링해주는 것이다.
Prepared Statement를 사용한 SQL Injection 방어 원리
Prepared Statement는 DB에서 미리 준비된 구문을 통해 실행계획까지 다 세워놓고 파라미터만 입력받아 실행하는 것이다.
SELECT * FROM users WHERE username={username}
예를 들어 이런 쿼리문이 있다고 하면 DB는 미리 이 쿼리에 대한 실행계획을 만들고 파라미터인 username
를 기다리고 있는 것이다.
그래서 공격자가 SQL Injection을 하기 위해서 1' or '1'='1 과 같은 입력을 하면 그저 String 값이 1' or '1'='1 인 username을 찾을 뿐이다.
Spring은 어떻게 SQL Injection을 막을까?
Spring은 뭔가 대응이 되어 있을 것 같다는 생각이 들었다.
그래서 알아보니 JDBC는 Prepared Statement 방식을 사용하고 있다고 한다.
그러기 때문에 JDBC를 근간으로 두고 있는 모든 기술들은 SQL Injection에 대한 기본적인 방어는 되어 있다고 보면 된다.
그러면 남은 대응방안 중 하나인 특정 문자 필터링이다.
/*, –, ‘, “, ?, #, (, ), ;, @, =, *, +, union, select, drop, update, from, where, join, substr, user_tables, user_table_columns, information_schema, sysobject, table_schema, declare, dual,…
이러한 문자들을 검증하고 필터링해준다면 대부분의 SQL Injection은 방어할 수 있을 것이다.
'Language > Java' 카테고리의 다른 글
queryDSL 사용방법 (0) | 2024.03.14 |
---|---|
JPA에 대해 깊이 알아보자 (0) | 2024.03.07 |
Service 인터페이스와 구현체 분리 (0) | 2024.03.06 |
@Component, @Bean, @Autowired가 뭘까? (0) | 2024.03.05 |
@NoArgsConstructor (access = AccessLevel.PROTECTED) 사용 이유 (0) | 2024.03.04 |