Cursor가 자꾸 이런 SQL 쿼리를 생성해서 불안하네요
Cursor keeps generating SQL queries like this and it's making me nervous
핵심 요약
AI가 생성한 SQL 쿼리에 SQL 인젝션 취약점이 포함될 수 있으니 반드시 파라미터화된 쿼리를 사용해야 합니다.
- SQL 인젝션 위험 — AI가 생성한 템플릿 리터럴 방식의 쿼리는 보안 취약점을 유발함.
- 코드 검토 필수 — AI가 작성한 데이터베이스 쿼리에서 백틱 사용 여부를 반드시 확인해야 함.
- 파라미터화 쿼리 권장 — 보안을 위해 템플릿 리터럴 대신 파라미터화된 쿼리 사용이 필수적임.
- 개발 역량 중요 — AI 도구에만 의존하지 말고 숙련된 개발자의 코드 리뷰와 린트 규칙이 병행되어야 함.
AI가 생성한 데이터베이스 코드에서 사람들이 알아야 할 패턴을 발견했습니다. Cursor나 Claude에게 "검색 엔드포인트 추가"나 "이름으로 사용자 필터링"을 요청하면, 다음과 같은 코드를 받을 확률이 높습니다.
const users = await db.query(`SELECT * FROM users WHERE name = '${req.query.name}'`);
이건 교과서적인 SQL 인젝션입니다. 누구나 name 파라미터에 ' OR '1'='1을 전달해서 사용자 테이블 전체를 털어갈 수 있습니다.
답답한 점은 이 코드가 테스트 환경에서는 완벽하게 작동한다는 겁니다. "john"을 검색하면 john의 기록이 잘 나오죠. 무엇을 찾아야 할지 모르면 잘못된 점을 전혀 알 수 없습니다.
저는 AI 세션 이후에 데이터베이스 쿼리 파일에서 백틱 사용 여부를 grep으로 확인하기 시작했습니다.
grep -n "query`|execute`" src/
쿼리 호출 내부에 템플릿 리터럴이 보인다면 그게 바로 위험 신호입니다. 해결책은 항상 파라미터화된 쿼리를 사용하는 것입니다.
db.query('SELECT * FROM users WHERE name = $1', [req.query.name])
AI 도구를 사용해 데이터베이스 관련 기능을 개발 중이라면 리뷰 체크리스트에 추가할 가치가 있습니다.


