SQL 인젝션이란 무엇일까요? (What is SQL Injection?)
SQL 인젝션은 웹 애플리케이션의 보안 취약점 중 하나로, 공격자가 웹사이트의 입력 폼(로그인, 검색 등)을 통해 악의적인 SQL 코드(데이터베이스를 조작하는 언어)를 삽입하여 데이터베이스를 비정상적으로 조작하는 공격 기법입니다. 이는 마치 자물쇠를 따는 도구가 아니라, 자물쇠의 구조를 이용해 잘못된 키를 넣어 문을 열거나 파괴하는 것에 비유할 수 있습니다.

어떻게 작동할까요? (How Does It Work?)
일반적인 웹 애플리케이션은 사용자가 입력한 정보를 바탕으로 데이터베이스에 쿼리(질의)를 보냅니다. 예를 들어, 로그인 시 ID와 비밀번호를 입력하면, 해당 정보가 데이터베이스에 저장된 값과 일치하는지 확인하는 SQL 쿼리가 실행됩니다.
정상적인 로그인 과정:
SELECT * FROM users WHERE username = '사용자ID' AND password = '사용자비밀번호';
SQL 인젝션 공격자는 이 '사용자ID' 또는 '사용자비밀번호'를 입력하는 공간에 일반적인 정보 대신, 데이터베이스를 조작할 수 있는 특수한 SQL 구문을 삽입합니다.
SQL 인젝션 공격 과정:
공격자가 비밀번호 입력란에 ' OR '1'='1 과 같은 문자열을 입력하면, SQL 쿼리는 다음과 같이 변경됩니다.
SELECT * FROM users WHERE username = '사용자ID' AND password = '' OR '1'='1';
여기서 '1'='1'은 항상 참(True)이므로, 이 쿼리는 '사용자ID'에 상관없이 항상 참으로 평가되어 로그인이 성공하게 됩니다. 이는 마치 문을 잠그지 않은 것과 같습니다.

SQL 인젝션의 종류 (Types of SQL Injection)
SQL 인젝션은 다양한 방식으로 발생할 수 있으며, 공격 목표에 따라 여러 종류로 나뉩니다.
- 에러 기반 SQL 인젝션 (Error-based SQL Injection): 데이터베이스 오류 메시지를 통해 데이터베이스 구조나 데이터를 알아내는 방식입니다.
- UNION 기반 SQL 인젝션 (UNION-based SQL Injection): UNION 연산자를 사용하여 다른 테이블의 데이터를 현재 쿼리의 결과와 함께 반환하여 데이터를 추출하는 방식입니다.
- 블라인드 SQL 인젝션 (Blind SQL Injection): 데이터베이스 오류 메시지를 직접 얻을 수 없을 때, 쿼리의 참/거짓 결과에 따라 웹페이지의 응답 시간이나 내용 변화를 이용하여 데이터를 추측하는 방식입니다.
- 시간 기반 블라인드 (Time-based Blind SQL Injection): 쿼리의 결과에 따라 웹페이지의 로딩 시간을 지연시켜 데이터를 추측합니다.
- 불리언 기반 블라인드 (Boolean-based Blind SQL Injection): 쿼리의 결과에 따라 웹페이지의 내용이 달라지는 것을 이용하여 데이터를 추측합니다.
SQL 인젝션으로 인한 피해 (Consequences of SQL Injection)
SQL 인젝션은 다음과 같은 심각한 보안 피해를 초래할 수 있습니다.
- 데이터 유출 (Data Leakage): 사용자 정보(ID, 비밀번호, 개인 정보), 금융 정보 등 민감한 데이터가 외부에 노출될 수 있습니다.
- 데이터 변조 및 삭제 (Data Manipulation & Deletion): 데이터베이스의 내용을 임의로 변경하거나 삭제하여 웹사이트의 기능을 마비시키거나 심각한 혼란을 야기할 수 있습니다.
- 권한 상승 (Privilege Escalation): 일반 사용자 권한으로 관리자 권한을 획득하여 시스템을 완전히 제어할 수 있게 됩니다.
- 악성 코드 삽입 (Malware Injection): 데이터베이스를 통해 서버에 악성 코드를 삽입하여 시스템 전체를 감염시킬 수 있습니다.

SQL 인젝션 방어 방법 (How to Prevent SQL Injection)
SQL 인젝션은 웹 애플리케이션 개발 단계에서부터 철저한 보안 대책을 마련해야 합니다.
- 준비된 구문 (Prepared Statements) 또는 매개변수화된 쿼리 (Parameterized Queries) 사용: 사용자 입력 값을 SQL 쿼리에 직접 삽입하지 않고, 플레이스홀더를 사용한 후 값을 바인딩하는 방식입니다. 이는 가장 효과적인 방어 방법 중 하나입니다.
- 입력 값 유효성 검사 (Input Validation): 사용자 입력 값이 예상된 형식과 범위 내에 있는지 철저히 검사하여 악의적인 문자열이 삽입되는 것을 막습니다. (예: 숫자만 허용하는 필드에는 숫자만 입력되도록 제한)
- 최소 권한 원칙 (Principle of Least Privilege): 데이터베이스 계정에 필요한 최소한의 권한만 부여하여, 설령 공격자가 데이터베이스에 접근하더라도 피해를 최소화합니다.
- 오류 메시지 숨기기 (Hide Error Messages): 사용자에게 데이터베이스 오류 메시지를 직접 노출하지 않고, 일반적인 오류 페이지를 표시하여 공격자가 데이터베이스 정보를 얻는 것을 방지합니다.
- 저장 프로시저(Stored Procedure): 저장 프로시저는 데이터베이스에 처음 저장될 때, 미리 SQL 구문이 분석되고 컴파일되어 실행 계획이 세워집니다. 즉, '어떻게 작동할지' 그 구조가 이미 정해져 있습니다. 웹 애플리케이션에서 저장 프로시저를 호출할 때 전달하는 사용자 입력값은 SQL 코드가 아닌 순수한 데이터(값)로만 취급됩니다. OR '1'='1' 같은 공격 코드가 입력되어도, 이는 실행될 명령어로 해석되는 것이 아니라 단순히 '문자열 데이터'로 간주됩니다. 공격자가 입력값으로 SQL 구문을 삽입하더라도, 이미 데이터베이스에 저장된 프로시저의 구조 자체를 변경할 수 없습니다. 따라서 공격자의 악의적인 코드는 원래의 쿼리 로직에 영향을 주지 못하고 무력화됩니다.

'보안' 카테고리의 다른 글
| IPSec (0) | 2025.09.20 |
|---|---|
| 크로스 사이트 요청 위조 (Cross-Site Request Forgery, CSRF) (0) | 2025.09.03 |
| 크로스사이트 스크립팅 - Cross Site Scripting(XSS) (0) | 2025.09.02 |
| Pharming (1) | 2025.09.02 |
| SSL/TLS (Secure Sockets Layer/Transport Layer Security) (2) | 2025.09.02 |