SQL 인젝션

기술노트

🛡️ SQL 인젝션 (SQL Injection)

SQL 인젝션은 공격자가 웹 애플리케이션의 입력 값(예: 로그인 폼, 검색창)에 악의적인 SQL 쿼리를 삽입(Injection)하여, 데이터베이스를 비정상적으로 조작하는 대표적인 웹 해킹 공격 기법입니다. OWASP(오픈 웹 애플리케이션 보안 프로젝트)에서 항상 최상위권에 위치하는 매우 심각한 보안 취약점입니다.


⚙️ 공격 원리

개발자가 사용자의 입력을 받아 SQL 쿼리를 만들 때, 그 입력을 제대로 검증하거나 처리하지 않으면 SQL 인젝션 공격에 취약해집니다.

예를 들어, 아래와 같이 사용자의 아이디와 비밀번호로 로그인 쿼리를 만든다고 가정해 봅시다. `String query = "SELECT * FROM users WHERE id = '" + userId + "' AND password = '" + userPassword + "'";`

이때, 공격자가 `userId`에 `' OR '1'='1` 이라는 값을 입력하면, 최종 쿼리는 아래와 같이 변조됩니다. `SELECT * FROM users WHERE id = OR '1'='1' AND password = ...`

`WHERE` 절이 `id = ` 또는 `TRUE` 가 되어, 항상 참(True)이 되므로 인증을 우회하고 로그인에 성공하게 됩니다.


🛡️ 방어 방법

  • 준비된 구문 (Prepared Statement) 사용 : 사용자의 입력 값이 들어갈 자리를 `?` 와 같은 플레이스홀더로 두고, 실제 값은 나중에 바인딩하는 방식입니다. 이 방식은 사용자의 입력이 SQL 쿼리 문법이 아닌 '순수한 데이터'로만 취급되도록 하여, SQL 인젝션 공격을 근본적으로 방지합니다. **가장 중요하고 효과적인 방어책입니다.**
  • 입력 값 검증 (Input Validation) : 사용자의 입력에 특수문자(`'`, `--`, `;` 등)가 포함되어 있는지 확인하고, 허용된 형식의 값만 처리하도록 검증합니다.
  • 최소 권한 원칙 : 데이터베이스 사용자가 꼭 필요한 권한만 갖도록 제한하여, 공격이 성공하더라도 피해를 최소화합니다.

💡 정보처리기사 핵심 Point

  • 사용자의 모든 입력은 신뢰할 수 없다는 원칙을 항상 기억해야 합니다.
  • 동적으로 SQL 쿼리를 문자열 조합으로 만드는 것은 매우 위험합니다. 반드시 준비된 구문(Prepared Statement)이나 ORM을 사용하여 데이터베이스에 접근해야 합니다.
  • 정보처리기사 시험에서는 SQL 인젝션의 공격 원리, 방어 방법(특히 Prepared Statement)을 묻는 문제가 자주 출제됩니다.