본문 바로가기
system_fundamentals/security_cryptography

SQL Injection

by 죄니안죄니 2026. 5. 19.
반응형
 
 
SQL InjectionSQL InjectionSQL Injection
 

SQL Injection(SQL injection)은 한 줄로 말하면:

사용자 입력값을 이용해서,
개발자가 의도하지 않은 SQL을 실행시키는 공격
 

이다.


가장 핵심 원인

거의 항상 이것 때문.

문자열로 SQL을 직접 이어붙임
 

위험한 코드 예시

Java 기준:

 
String sql =
  "SELECT * FROM users WHERE id = '" + id + "'";
 

사용자가 정상 입력

id = hoon
 

이면:

 
SELECT * FROM users WHERE id = 'hoon'
 

정상.


그런데 공격자가 입력

' OR 1=1 --
 

하면?


최종 SQL

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

결과

OR 1=1
 

은 항상 참.

즉:

전체 사용자 조회
 

가능.


여기서 -- 의미

SQL 주석(comment).

즉 뒤 코드 무시.


핵심 문제

DB가:

입력값과 SQL 코드를 구분 못함
 

이다.


실제 가능한 공격

엄청 다양.


1. 로그인 우회

예:

 
SELECT *
FROM users
WHERE id='admin'
AND pw=''
OR 1=1
 

2. 데이터 조회

회원정보 탈취
 

3. 데이터 삭제

 
DELETE FROM users
 

삽입 가능성.


4. 관리자 권한 변경

 
UPDATE users
SET role='ADMIN'
 

5. DB 서버 장악

심하면:

  • 파일 읽기
  • 시스템 명령 실행

까지 가능.


왜 위험하냐?

웹앱이:

DB 권한을 대신 가지고 있음
 

때문.

즉 앱을 속이면 DB 조작 가능.


해결 핵심 — Prepared Statement

실무에서 가장 중요.


안전한 코드

 
String sql =
  "SELECT * FROM users WHERE id = ?";

PreparedStatement ps =
    conn.prepareStatement(sql);

ps.setString(1, id);
 

왜 안전?

DB가:

SQL 구조
 

데이터 값
 

을 분리 처리.


즉 공격 입력이 와도

그냥 문자열 데이터
 

로 취급.

SQL 코드가 안 됨.


ORM도 결국 PreparedStatement 사용

예:

  • Hibernate
  • JPA
  • MyBatis #{}

등.


MyBatis 중요 포인트

엄청 실무 중요.


안전

 
WHERE id = #{id}
 

PreparedStatement 사용.


위험

 
WHERE id = ${id}
 

문자열 치환.

즉 SQL Injection 가능.


${} vs #{}

문법의미
#{} 안전(바인딩)
${} 위험(문자열 치환)

그런데 ORDER BY는?

실무에서 자주 헷갈림.


이런 코드

 
ORDER BY ${column}
 

Injection 가능.


그래서 화이트리스트 사용

예:

 
if (!allowedColumns.contains(column)) {
    throw new IllegalArgumentException();
}
 

입력값 검증도 중요

하지만:

검증만 믿으면 안 됨
 

핵심 방어는 반드시

PreparedStatement
 

이다.


실무 추가 방어

1. 최소 권한 DB 계정

앱 DB 계정에:

DROP 권한
 

같은 거 최소화.


2. 에러 메시지 숨김

SQL 에러 노출 금지.


3. WAF

예:

  • Cloudflare WAF

등.


Blind SQL Injection

중요한 고급 공격.


에러 안 보여도

참/거짓 반응 차이
 

로 데이터 추출 가능.


예:

 
AND SUBSTRING(password,1,1)='a'
 

시간 기반 공격도 존재

예:

 
SLEEP(5)
 

같은 함수.


그래서 SQL Injection은 아직도 위험

OWASP Foundation Top10 단골.


실무 핵심 원칙

절대 SQL 문자열 직접 조립하지 말 것


무조건

  • PreparedStatement
  • ORM 바인딩
  • #{}

사용.


핵심 한 줄

SQL Injection은:

사용자 입력값이 SQL 코드로 해석되면서,
개발자가 의도하지 않은 데이터 조회·수정·삭제가 가능해지는 공격
 

이며,

가장 중요한 방어는:

PreparedStatement를 사용해
SQL 구조와 입력 데이터를 분리하는 것
 

이다.

반응형

'system_fundamentals > security_cryptography' 카테고리의 다른 글

SameSite Cookie  (0) 2026.05.19
CSP  (0) 2026.05.19
CSRF  (0) 2026.05.19
XSS  (0) 2026.05.19
쿠키 보안 옵션  (0) 2026.05.18

댓글