CS/데이터베이스

SQL Injection과 안티패턴

Choony 2025. 1. 8. 22:54
이번 글에서는 SQL Injection 공격과 SQL 안티패턴에 대해서 알아보겠습니다.

SQL Injection

SQL Injection은 공격자가 SQL 쿼리에 악의적인 데이터를 삽입하여 데이터베이스를 조작하거나 정보를 탈취하는 공격기법입니다. 

 

다음과 같은 쿼리를 볼 수 있습니다.

-- 입력값으로 "1 OR 1=1"를 전달
SELECT * FROM users WHERE id = '1 OR 1=1';

해당 쿼리는 항상 참으로 연산되기 때문에 users 테이블의 모든 데이터가 공격자에게 보여지게 됩니다.

 

이러한 공격을 예방할 수 있는 예방방법이 존재하는데요. 알아보겠습니다.


SQL 안티패턴

1. SELECT *

해당 패턴의 문제점은 다음과 같습니다.

  • 불필요한 데이터를 모두 가져오기 때문에 네트워크와 메모리의 낭비로 이어질 수 있다.
  • 테이블 구조가 변경되면 코드가 예기치않게 동작할 수 있다.
  • 인덱스를 제대로 활용하지 못해 성능 저하로 이어진다.
SELECT * FROM users;

 

해당 안티패턴의 해결책은 다음과 같습니다.

  • 필요한 컬럼만 명시적으로 지정
SELECT id, name, email FROM users;

2. 반복적인 INSERT

해당 패턴의 문제점은 다음과 같습니다.

  • 대량 데이터 삽입 시 많은 쿼리를 반복적으로 수행하여 성능 저하로 이어집니다

 

해당 패턴의 해결책은 다음과 같습니다.

  • 다중 행 삽입 사용
INSERT INTO users (id, name) 
VALUES 
  (1, 'Alice'), 
  (2, 'Bob'), 
  (3, 'Charlie');

3. NULL 남발

해당 패턴의 문제점은 다음과 같습니다.

  • NULL 값이 많아지면 쿼리 조건 작성이 복잡해지고, 데이터 무결성이 저하될 가능성이 높습니다.

 

해당 패턴의 해결책은 다음과 같습니다.

  • NULL 대신 기본값(Default Value) 설정

4. 인덱스 남발

해당 패턴의 문제점은 다음과 같습니다.

  • 인덱스는 SELECT 성능을 향상하지만, INSERT, UPDATE, DELETE 성능을 저하시킵니다.
  • 너무 많은 인덱스는 저장소와 메모리를 낭비합니다.

 

해당 패턴의 해결책은 다음과 같습니다.

  • 쿼리 패턴에 맞는 최소한의 인덱스만 생성

5. 종료하지 않는 트랜잭션

해당 패턴의 문제점은 다음과 같습니다.

  • 트랜잭션이 종료되지 않으면 데이터베이스 잠금(Locking)이 발생하고, 다른 쿼리의 실행을 방해합니다.

 

해당 패턴의 해결책은 다음과 같습니다.

  • 트랜잭션은 필요한 경우에만 사용하고, 작업 완료 후 반드시 COMMIT 또는 ROLLBACK