
웹 서비스 개발 – 웹 서비스 보안 – XSS 필터링과 CSRF 방어
안녕하세요~ 😊 오늘은 웹 보안에서 빼놓을 수 없는 두 가지 대표적인 공격!
바로 **XSS(크로스 사이트 스크립팅)**와 **CSRF(사이트 간 요청 위조)**에 대해
자세히 배우고, 안전하게 방어하는 방법까지 알려드릴게요!
비유하자면,
XSS는 악성 스크립트를 몰래 끼워 넣는 트로이 목마 같고
CSRF는 사용자를 속여서 원치 않는 요청을 보내게 만드는 유령 조종자 같아요 👻
자, 그럼 지금부터 이 두 괴물을 어떻게 물리치는지 알아볼까요?
1. XSS (Cross Site Scripting)란?
✅ 정의
XSS는 공격자가 웹 페이지에 악성 JavaScript 코드를 삽입해서
사용자의 브라우저에서 의도하지 않은 행동을 실행하도록 하는 공격이에요.
🎯 공격 시나리오 예시
<input value="<xss-script>alert('해킹!');</xss-script>">
이 코드가 필터링 없이 브라우저에 노출되면,
사용자의 브라우저에서alert()
가 실행되죠! 🧨
💥 발생 원인
- 사용자 입력을 검증하지 않고 출력
- HTML, JS, CSS, URL 등에 삽입된 문자열 필터링 미흡
2. XSS 공격 유형 3가지
유형 | 설명 |
---|---|
저장형 XSS | 악성 스크립트가 DB에 저장되어 여러 사용자에게 노출 |
반사형 XSS | 악성 코드가 요청 파라미터에 포함, 즉시 응답에 반영 |
DOM 기반 XSS | 자바스크립트가 DOM을 조작하면서 발생하는 클라이언트 측 공격 |
3. XSS 방어 방법
✅ 1. HTML 이스케이핑
사용자 입력을 출력할 때, 특수문자 → 안전한 문자로 변환
문자 | 이스케이프 |
---|---|
< |
< |
> |
> |
" |
" |
' |
' |
/ |
/ |
PHP 예시:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
✅ 2. 콘텐츠 보안 정책 (CSP)
Content-Security-Policy: default-src 'self'; script-src 'self';
외부 JS, inline script 실행을 차단하여 XSS 확산 방지!
✅ 3. JavaScript에서의 주의
document.innerHTML = userInput; // ❌ 위험!
document.textContent = userInput; // ✅ 안전!
DOM 조작 시에도 텍스트 전용 속성을 사용해주세요!
4. CSRF (Cross Site Request Forgery)란?
✅ 정의
CSRF는 사용자의 인증 정보를 도용하여
악의적인 요청을 전송하는 공격이에요.
🎯 공격 시나리오
- 사용자가 A 사이트에 로그인한 상태
- 공격자가 만든 B 사이트에서 다음 요청 자동 실행:
<img src="https://site.com/withdraw?amount=10000">
사용자는 아무런 행동도 하지 않았지만,
쿠키가 자동 전송되면서 요청이 실행돼요! 😱
5. CSRF 방어 방법
✅ 1. CSRF Token 사용
서버가 발급한 난수 토큰을 폼에 포함하여,
서버는 요청 시 해당 토큰의 유효성 검사를 수행합니다.
HTML 예시:
<form method="POST">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
</form>
PHP 예시:
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die("CSRF 공격 의심!");
}
✅ 2. Referer 검증
- 요청의
Referer
헤더가 자기 도메인에서 왔는지 확인 - 완벽하지는 않지만 보조 수단으로 유용해요!
if (strpos($_SERVER['HTTP_REFERER'], "https://mydomain.com") !== 0) {
die("잘못된 접근입니다.");
}
✅ 3. SameSite 쿠키 속성
setcookie("sessionId", "value", [
"samesite" => "Strict",
"secure" => true,
"httponly" => true
]);
- 외부 도메인에서 쿠키를 자동 전송하지 않도록 차단합니다.
Strict
,Lax
,None
중 **Strict
**를 추천해요.
6. XSS & CSRF 실전 예방 체크리스트 ✅
항목 | 체크 여부 |
---|---|
사용자 입력 HTML 이스케이프 처리 | ☑️ |
htmlspecialchars() 또는 JS의 textContent 사용 |
☑️ |
모든 폼 요청에 CSRF 토큰 포함 | ☑️ |
쿠키에 SameSite, Secure, HttpOnly 설정 | ☑️ |
Content-Security-Policy 설정 | ☑️ |
Referer 검증 로직 구현 | ☑️ |
7. 보안 적용 후 효과 🎯
항목 | 적용 전 | 적용 후 |
---|---|---|
XSS 위험 | 높음 | ✅ 감소 |
악성 스크립트 삽입 | 가능 | ✅ 차단 |
CSRF 요청 조작 | 가능 | ✅ 토큰 검증으로 차단 |
세션 탈취 | 가능 | ✅ HttpOnly & Secure 쿠키로 보호 |
8. 보안 설정 시 주의사항 🔎
항목 | 주의할 점 |
---|---|
토큰 누락 | 폼이 많으면 실수로 빠질 수 있음 (자동화 필요) |
토큰 재사용 | 동일 세션 내 재사용은 가능하지만 만료 설정도 고려 |
HTML 이스케이핑 누락 | 게시판, 댓글 시스템 등 실수 빈번 |
쿠키 설정 누락 | SameSite 없으면 CSRF 위험이 증가 |
마무리하며 😊
오늘은 웹 보안의 필수 요소인
**XSS(스크립트 삽입)**와 CSRF(요청 조작) 공격에 대해 알아보고,
그에 맞서는 강력한 방어 전략들을 함께 살펴보았어요!
정리하자면,
🔐 XSS는 “출력 시 이스케이프”
🔐 CSRF는 “입력 시 검증”
이 두 가지를 잘 기억해 주세요!
이제 여러분의 웹 애플리케이션은 훨씬 더 안전해졌답니다 🙌
다음 시간에는 SQL 인젝션 방지법, OAuth 보안 강화 방법도 이어서 소개해드릴게요!
오늘도 안전한 개발 되세요 💻
감사합니다!