XSS (Cross-Site Scripting) 기초
XSS (사이트 간 스크립팅)는 공격자가 웹 애플리케이션에 악성 클라이언트 측 스크립트(주로 JavaScript)를 주입하여, 그 웹사이트를 이용하는 다른 사용자의 브라우저에서 스크립트가 실행되도록 유도하는 공격 기법입니다.
XSS 공격의 가장 큰 목표는 사용자의 세션 탈취입니다.
1. 작동 원리 (세션 하이재킹)
- 악성 스크립트 삽입: 공격자가 게시판 댓글, 사용자 이름, URL 파라미터 등 입력 필드에 악성 JavaScript 코드를 입력합니다.
- 서버 저장 및 반환: 필터링되지 않은 악성 코드가 서버에 저장되거나(저장형 XSS) 응답에 포함되어 반환됩니다.
- 브라우저 실행: 피해자가 해당 페이지를 방문하면, 서버가 보낸 응답(악성 코드 포함)을 브라우저가 신뢰하고 실행합니다.
- 세션 탈취: 실행된 스크립트가 피해자의 브라우저에 저장된 인증 쿠키(세션 정보)를 읽어 공격자에게 전송합니다.
2. XSS 공격의 주요 유형
| 유형 | 설명 | 위험도 |
|---|---|---|
| 저장형 (Stored XSS) | 악성 스크립트가 서버의 데이터베이스에 영구적으로 저장됩니다. (예: 게시판 댓글). 가장 위험도가 높습니다. | 높음 |
| 반사형 (Reflected XSS) | 악성 스크립트가 URL 파라미터를 통해 주입된 후, 서버 응답에 반사되어 사용자에게 전달 및 실행됩니다. (예: 검색 결과 페이지) | 중간 |
| DOM 기반 (DOM-based XSS) | 스크립트가 서버를 거치지 않고, 사용자 브라우저의 DOM 환경(클라이언트 측 스크립트)에서 동적으로 실행됩니다. | 중간 |
3. XSS 방어 방법 (개발자 관점)
XSS 방어의 핵심은 사용자로부터 받은 모든 입력을 신뢰하지 않는 것입니다.
- 입력 값 검증 (Input Validation): 입력 단계에서 허용되지 않는 문자열(예:
<script>,onerror,javascript:)이 있는지 검사하고 차단합니다. - 출력 인코딩 (Output Encoding): 데이터가 브라우저에 출력될 때, HTML 코드로 해석되지 않고 순수한 텍스트로 보이도록 특수 문자(
<,>)를 HTML 엔티티(e.g.,<,>)로 변환합니다. 가장 기본적인 방어책입니다. - CSP (Content Security Policy): 신뢰할 수 있는 소스에서 온 스크립트만 실행되도록 브라우저에 명시적으로 지시하는 보안 정책을 설정합니다.