웹 서비스 개발 – 웹 서비스 보안 – 4 – API 보안 및 인증 방법

웹 서비스 개발 - 웹 서비스 보안 - 4 - API 보안 및 인증 방법
웹 서비스 개발 – 웹 서비스 보안 – 4 – API 보안 및 인증 방법

웹 서비스 개발 – 웹 서비스 보안 – 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 이스케이핑

사용자 입력을 출력할 때, 특수문자 → 안전한 문자로 변환

문자 이스케이프
< &lt;
> &gt;
" &quot;
' &#x27;
/ &#x2F;

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는 사용자의 인증 정보를 도용하여
악의적인 요청을 전송하는 공격이에요.

🎯 공격 시나리오

  1. 사용자가 A 사이트에 로그인한 상태
  2. 공격자가 만든 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 보안 강화 방법도 이어서 소개해드릴게요!

오늘도 안전한 개발 되세요 💻
감사합니다!

답글 남기기