티스토리 뷰

반응형

✅ SQL Injection 공격이란 무엇이고 어떻게 방지할 수 있나?

**SQL Injection(SQL 삽입)**은 가장 오래되었지만 여전히 실무에서 자주 발생하는 웹 보안 취약점 중 하나입니다.
이 공격은 사용자가 입력한 데이터를 통해 쿼리 구조를 조작함으로써, 데이터 탈취, 변경, 삭제 등을 유도합니다.

이번 글에서는 SQL Injection의 작동 방식, 실제 피해 사례, 방어 전략을 예시와 함께 정리합니다.


📌 1. SQL Injection이란?

SQL Injection은 웹 애플리케이션에서 사용자 입력이 SQL 쿼리문에 그대로 삽입되어
공격자가 악의적인 SQL을 삽입함으로써 DB를 조작하는 공격입니다.


📌 2. 간단한 예시

// 취약한 코드 (Express + MySQL 예시)
const userId = req.query.id;
const query = `SELECT * FROM users WHERE id = '${userId}'`;

만약 req.query.id가 다음과 같다면?

1' OR '1'='1

결과적으로 실행되는 쿼리는:

SELECT * FROM users WHERE id = '1' OR '1'='1';

→ 모든 사용자 정보를 가져오게 되는 심각한 보안 위협 발생.


📌 3. 실제 발생 가능한 피해

  • 비인가 사용자 정보 조회 (개인정보 유출)
  • 관리자 권한 탈취
  • 테이블 삭제 (DROP TABLE users;)
  • 서비스 전체 중단
  • 내부 서버 구조 노출

📌 4. 방지 방법

✅ 1) Prepared Statement (쿼리 파라미터 바인딩)

const userId = req.query.id;
const [rows] = await db.query('SELECT * FROM users WHERE id = ?', [userId]);

→ 입력값은 SQL 코드가 아닌 데이터로만 처리


✅ 2) ORM 사용

ORM은 내부적으로 SQL Injection 방어를 위한 파라미터 바인딩을 적용합니다.

const user = await prisma.user.findUnique({
  where: { id: Number(req.query.id) }
});

✅ 3) 입력값 검증

  • 사용자 입력 값에 대해 타입, 길이, 포맷 제한
  • 정규식 또는 class-validator 적용
@IsInt()
@Min(1)
userId: number;

✅ 4) 최소 권한 원칙 적용 (DB 계정)

  • DB 계정을 읽기 전용으로 분리
  • 관리자 계정으로 운영 DB에 직접 접근 금지

✅ 5) 보안 툴/프레임워크 사용

  • 웹방화벽(WAF)
  • OWASP ZAP, Burp Suite 등 동적 보안 테스트 도구 활용
  • ESLint 플러그인, 정적 분석도구 활용

📌 5. 실무 경험 예시

반응형

🧪 문제

  • 초창기 Express + MySQL 기반 서비스에서 사용자 검색 API에 SQL Injection 취약점 발견
  • 보안 점검 도구로 실제 공격 가능한 상태 확인됨

✅ 해결

  • mysql2 라이브러리의 prepared statement로 전체 쿼리 교체
  • Prisma로 전환 후 ORM 레벨에서 SQL Injection 자동 방어
  • 모든 API 입력값을 class-validator로 검증
  • 관리자 DB 계정 권한 분리

→ 보안 인증 통과, 재점검에서도 취약점 사라짐


📌 6. 면접에서 이렇게 설명하세요

SQL Injection은 입력값이 쿼리문에 직접 포함되어 공격자가 SQL 로직을 조작하는 공격입니다.
실무에서는 ORM을 사용하거나 Prepared Statement를 활용해 이를 방어하고,
입력값 검증과 최소 권한 원칙으로 다중 방어 전략을 적용하여 안전한 API를 구축했습니다.



SQLInjection,웹보안,PreparedStatement,ORM보안,Prisma보안,입력값검증,보안취약점,OWASPTop10,백엔드보안,면접질문


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함
반응형