Back End/보안

[보안] Spring 에서 SQL Injection 방어 그리고 원리 (feat. Prepared Statement, JPA, MyBatis)

DevPing9_ 2023. 2. 13. 21:19

 

서문


회사 서비스에 AWS WAF 를 전역적으로 설정하면서 소량의 보안지식을 쌓을 수 있었다.

그러다 문득 Spring Application 은 SQL Injection 을 제대로 방어하고 있을까? 라는 궁금증이 생겨났다.

Spring 에서 XSS 필터는 따로 적용하는 것을 보았으나 SQLI 필터를 적용한 케이스를 보지 못하여 더욱 궁금하였다.

 

서칭 결과, Prepared Statement 를 사용하면 SQLI 를 막을 수 있다고 한다.

 

JDBC 에서 Prepared Statement 를 직접 사용해본 적이 있어 JDBC 스펙인 줄 알고, 구현을 해봤자 String 을 치환할 뿐 아닌가? 라는 생각에 도무지 어떻게 SQL Injection 을 막는다는 것인지 이해가 되지 않았다.

 


Prepared Statement 를 사용한 SQL Injection 방어 원리


그래서 더 서칭해본 결과 Prepared Statement 는 DB 스펙이라고 한다.

 

즉, DB 수준에서 미리 준비된 구문을 설정하고, 실행계획까지 다 세워놓는다.

그리고 파라미터만 입력받아 실행하는 것이다. 

 

즉, String 을 Java 단에서 들고 있다가 단순히 치환하는 것이 아니라 DB 에 미리 실행계획을 생성해두고 파라미터 값만 받는다는 말이다.

 

예시를 들어 아래와 같은 쿼리문이 있다고 하자.

select * from adminTable where login_id = {loginId}

 

DB 는 미리 실행계획을 만들고 {loginId} 라는 파라미터만 기다리고 있다.

DB 는 들어올 Input 값을 String 값으로 기대하고 있다.

 

그리하여 유저가 1' or '1'='1 과 같은 입력을 하면 그저 String 값이 1' or '1'='1 인 유저를 찾을 뿐이다.

 

이해가 되지 않으시면 SQL Injection 대표예제와 원리를 참조하시길 바란다.

 

그리고 Prepared Statement 는 DB 입장에서 미리 실행계획을 짜놓은 상태에서 대기하기 때문에 효율도 좋다.

 

JPA 에서 IN 절을 사용할 때 Prepared Statement 의 효율 높이기도 한번 읽어보시면 좋다.

 


그럼 내 어플리케이션은 SQL Injection 을 막고 있을까?


SQL Injection 의 종류는 많다.

 

하지만 대표적인 공격인 String 치환 공격의 경우는 JDBC 를 근본으로 만들어진 기술이라면 Prepared Statement 를 사용하여 이미 막고 있을 것이다.

 

Java 진영에서 흔히 볼 수 있는 JPA 와 MyBatis 를 예로 들겠다.

 


JPA 는 Prepared Statment 를 사용하고 있을까?


Default 동작으로 사용하고 있다.

정확히는 JPA 의 ORM 인 Hibernate 가 사용하고 있다.

 

심지어 Native Query 에서도 Prepared Statement 를 사용하고 있다고 한다.

사용하는 코드부분을 찾아서 멋있게 첨부하고 싶었지만 시간대비 효율이 떨어지니 생략한다.

 

공식 깃허브(https://github.com/hibernate) 에 들어가서 Prepared Statement 를 검색하면 무수한 코드가 나온다.

 

 

떼잉.. 찝찝해서 찾아보았다.

org.hibernate.loader.Loader 를 참조하시라

 

 


MyBatis 는 Prepared Statement 를 사용하고 있을까?


사용할 때도 있고 사용하지 않을 때도 있다.

쿼리문에 ${} 를 사용한다면 Statement, #{} 를 사용한다면 Prepared Statement 를 사용한다고 한다.

 

따라서 ${} 를 사용하고 있다면 SQL Injection 에 유의해야한다.

 

 


Reference


 

How to prevent SQL Injection vulnerabilities: How Prepared Statements Work

Read the full post here: https://blog.hackedu.com/how-to-prevent-sql-injection-vulnerabilities-how-prepared-statements-w

jaredablon-31568.medium.com

 

728x90