보안Medium#218
SQL Injection을 예방하는 가장 기본적인 방법은 무엇인가요?
#보안#SQLInjection#Database#입력검증
답변 포인트
입력값과 SQL 문법의 분리를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
SQL Injection은 입력이 SQL 문법으로 해석되는 공격입니다. 문자열 결합 대신 Prepared Statement와 파라미터 바인딩을 사용해야 합니다.
SQL Injection을 예방하는 가장 기본적이고 중요한 방법은 사용자 입력을 SQL 문자열에 직접 이어 붙이지 않고, prepared statement와 parameter binding을 사용하는 것입니다.
취약한 코드
JavaScript
// 위험
const sql = `SELECT * FROM users WHERE email = '${email}' AND password = '${pw}'`;입력값이 ' OR '1'='1 같은 문자열이면 SQL 구조가 바뀔 수 있습니다.
안전한 코드
JavaScript
const sql = 'SELECT * FROM users WHERE email = ? AND password_hash = ?';
const rows = await db.query(sql, [email, passwordHash]);파라미터 바인딩을 사용하면 입력은 SQL 코드가 아니라 값으로 처리됩니다.
ORM을 써도 주의할 점
ORM의 일반 메서드는 안전한 경우가 많지만 raw query, 동적 정렬, 동적 테이블명은 여전히 위험합니다.
Java
// 정렬 컬럼은 바인딩할 수 없으므로 allowlist 필요
Set<String> allowed = Set.of("created_at", "name");
if (!allowed.contains(sort)) throw new IllegalArgumentException();보조 방어
- DB 계정 권한을 최소화합니다.
- 에러 메시지에 SQL 구조를 노출하지 않습니다.
- 입력 길이와 형식을 검증합니다.
- WAF는 보조 수단일 뿐 근본 해결책이 아닙니다.
면접 답변 포인트
SQL Injection 방어의 핵심은 prepared statement/parameter binding입니다. 추가로 동적 식별자는 allowlist로 제한하고, 최소 권한과 에러 노출 방지를 함께 적용한다고 설명하면 좋습니다.