[66해빗 페이백 챌린지] 22일차

tree·2023년 5월 23일
0

PreparedStatement

  • PreparedStatement를 설명하기 앞서 SQL Injection을 알아보자.

SQL Injection이란?

  • 원래 의도된 SQL문에 악의적인 SQL문을 주입하여 데이터베이스가 비정상적으로 동작하도록 하는 공격 기법.

  • 가장 대표적인 공격 기법이 Error based SQL Injection이다.

    • 논리적 에러를 이용한 SQL Injection

      • 위의 그림처럼 INPUT1에 'OR 1=1 --을 주입해 --뒤에 있는 SQL문을 주석으로 처리하고 WHERE문의 조건을 항상 참이 되도록 만든다.

PreparedStatement를 사용하는 이유

  • PreparedStatement를 사용하면 SQL Injection으로부터 안전하게 DB와 데이터를 주고 받을 수 있다.
  • Statement에 비해 성능상 유리할 수도 있다.

SQL Injection에 안전한 이유

  • 위 그림과 같이 SQL문은 parse, bind, execute, patch의 4가지 과정을 거쳐서 실행된다.
  • Statement 동작 방식
    • Statement를 사용하면 같은 SQL문을 DB에 반복적으로 전달하더라도 매번 parse, bind, execute, patch을 반복적으로 수행하며 SQL문을 실행한다.
      • 만약 악의적인 SQL문이 주입된 SQL문이 DB로 전달된다면?
        • 악의적인 SQL문이 해석되어 원래 의도와는 다르게 DB가 비정상적으로 작동할 것이다.
  • PreparedStatement 동작 방식
    • pre-compile
      • PreparedStatement를 사용하면 SQL문을 DB에 전달 시, 최초 1회만 parse를 수행한 후 parse의 수행 결과인 실행 계획을 캐시해둔다.
    • 다음에 같은 SQL문이 반복적으로 전달되면 캐싱된 실행 계획에 바인딩 파라미터를 바인딩하여 SQL문을 실행한다.
      • 만약 악의적인 SQL문이 바인딩 파라미터로 전달되더라도 SQL문으로 해석되는 것이 아니라 단순히 문자열 데이터로 해석이 되기 때문에 DB가 비정상적으로 동작하는 일은 발생하지 않는다.

성능상 유리한 이유

  • PreparedStatement는 SQL문을 미리 컴파일 해두어 parse 작업을 반복적으로 수행하지 않기 때문에 같은 SQL문이 반복적으로 DB에 전달되는 경우에는 Statement에 비해 더 빠르게 수행될 수도 있다.
  • 하지만 SQL문을 한번만 사용할 경우, 오히려 pre-compile 작업의 오버헤드가 더 크기 때문에 PreparedStatement의 실행 속도가 Statement보다 더 느릴 수도 있다.
  • 또한, DB마다 LogManager, BufferManager, DiskManager 등 각종 요인들로 인해 동작 속도가 다를 수 있기 때문에 PreparedStatement가 항상 더 성능이 좋다고 말할 수는 없다.

SQL Injection > 성능 향상

  • 따라서, PreparedStatement를 사용하는 이유는 성능 향상보다는 SQL Injection으로부터의 방어에 있다고 보는 것이 더 적절하다.

0개의 댓글