매개변수화된 쿼리(parameterized query)
- SQL 인젝션 공격을 방지하는 안전한 방법임
- 데이터베이스 드라이버가 이 값들을 적절히 이스케이프하고 쿼리에 안전하게 삽입함
- 쿼리 생성 = 실제 연결된 MySQL 데이터 베이스에 해당 쿼리가 전송되어 실행됨
const q = "SELECT * FROM users WHERE email = ? OR username = ?";
db.query(q, [req.body.email, req.body.name], (err, data) => {
// ...
});
- 'q'는 SQL 쿼리의 템플릿임
- '?' 문자는 나중에 채워질 파라미터의 위치를 나타냄
- 'db.query' 함수를 호출할 때, 두 번째 인자로 배열'[req.body.email, req.body.name]'을 전달함
- 이 배열의 값들이 순서대로 쿼리의 '?' 위치에 삽입 됨
결과적으로 실행되는 쿼리의 형태
SELECT * FROM users WHERE email = 'user@example.com' OR username = 'BEEN'
- 이렇게 함으로써, 클라이언트가 보낸 데이터를 안전하게 쿼리에 포함시킬 수 있음
용어 정리
이스케이프(Escape)
- 특수 문자나 예약어를 일반 문자열로 처리하도록 변환하는 과정
- SQL에서 특정 문자들(예: 작은따옴표 ')은 쿼리 구문에서 특별한 의미를 가짐
- 이러한 문자들을 그대로 쿼리에 포함시키면 의도치 않은 SQL 구문이 실행될 수 있음
안전한 삽입 과정
- 특수 문자 처리
- 데이터베이스 드라이버는 사용자 입력에 포함된 특수 문자들을 식별함
- 이스케이프 적용
- 식별된 특수 문자들 앞에 이스케이프 문자(보통 백슬래시 $$를 추가하거나, 해당 문자를 안전한 형태로 변환함
- 쿼리 파라미터화
- 이스케이프된 값들을 쿼리의 적절한 위치에 안전하게 삽입합니다. 이 과정에서 값들은 SQL 코드로 해석되지 않고 순수한 데이터로 취급됩니다.