동적 컬럼 조회 API의 SQL Injection 방어 (MSSQL)

들어가며 특정 테이블에서 조회할 컬럼을 클라이언트가 골라 넘기는 API가 있다고 하자. 대략 이런 모양이다. SELECT ${col} FROM member WHERE status = #{status} ${col} 자리에 "name"이 들어오면 이름을, "email"이 들어오면 이메일을 조회하는 식이다. 정렬 컬럼이나 검색 대상 컬럼을 유연하게 바꿔야 할 때 흔히 나오는 패턴이다. MyBatis를 쓰면 파라미터 바인딩으로 SQL Injection이 자연스럽게 막힌다고 생각하기 쉽다. 하지만 이 쿼리는 값 조건인 status만 #{}로 바인딩하고, 정작 컬럼 자리는 ${}를 쓰고 있다. 바로 이 차이가 SQL Injection의 위험 지점이다. ...

2026년 7월 21일 PM01:20 · PolarBear