CS

CS 스터디 (DB) 17 - SQL Injection 과 방어할 수 있는 방법에 대해 설명해주세요.

gentle-tiger 2025. 5. 20. 11:38

SQL Injection이란? 

SQL Injection은 웹 애플리케이션에서 DB Query에 사용될 사용자 입력값을 유효성 검증을 하지 않아, 개발자가 의도하지 않은 동적 쿼리 (Dynamic Query)를 생성하여 DB 정보를 열람하거나 조작할 수 있는 공격 기법입니다. 

SELECT *
FROM user u
WHERE u.name = '홍길동' and u.password = '1234';
SELECT *
FROM user u
WHERE u.name = '123' OR 1=1 -- and u.password = '1234';

- 이름 입력칸에 홍길동 대신 '123' OR 1=1을 넣으면 비밀번호 감중 없이 로그인을 성공할 수 있게 됩니다. 

 

 

PreparedStatement

- PreparedStatement는 SQL과 파라미터를 명확히 분리하여 쿼리를 사전에 컴파일하고, 이후 입력값을 변수로 안전하게 바인딩하기 떄문에, 입력값 내부에 포함된 SQL 구문이 실제 쿼리로 해석되지 않습니다. 

- Spring Hibernate 같은 ORM 프레임워크도 내부적으로 PreparedStatement를 기반으로 동작하므로 기본적인 SQL Injection 방어가 가능합니다. 

 

String sql = "SELECT * FROM user u WHERE u.name = ? AND u.password = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, password);

 

 

SQL Injection과 XSS의 차이점

<script>alert(1)</script> // 단순 문자로 인식하기 위해 아래처럼 바꿉니다. //
&lt;script&gt;alert(1)&lt;/script&gt;
보안 위협 처리 위치 방어 방법
SQL Injection 백엔드(DB 접근 시점) PreparedStatement
XSS 프론트/뷰 렌더링 시점 HTML 이스케이프, 템플릿 엔진

- XSS(Cross-Site Scripting)는 클라이언트 측에서 HTML 렌더링 시 악성 스크립트가 실행되는 공격으로, 프론트엔드 또는 뷰 템플릿 단계에서 HTML 이스케이프 등을 통해 방어합니다.

- SQL Injection은 서버 측에서 DB 쿼리를 처리하는 시점에 발생하며, 쿼리 파라미터 분리나 PreparedStatement로 방어할 수 있습니다.

 

 

결론

SQL Injection은 사용자의 입력값이 쿼리에 직접 삽입되어 실행되면서, 악의적인 SQL 코드가 실행되는 보안 취약점으로, 주로 유효성 검증 없이 동적 쿼리를 구성할 때 발생합니다. 이를 방지하기 위해서는 쿼리와 파라미터를 분리하여 처리하는 PreparedStatement를 사용하는 것이 가장 효과적이며, Spring Hibernate 같은 ORM 프레임워크는 이를 기본적으로 지원하므로 구조적으로 안전한 편입니다. 이와 달리 XSS는 클라이언트 측에서 발생하는 공격으로, HTML 이스케이프나 템플릿 엔진을 통해 렌더링 시 방어하는 것이 중요합니다. 따라서 두 공격은 발생 지점과 대응 방법이 다르며, 각 단계에 맞는 보안 전략이 필요합니다.