XSS란 무엇인가?
공격자가 웹 페이지에 악성 스크립트(주로 자바스크립트)를 주입해서 피해자(브라우저)에서 실행되도록 하는 취약점이다. 이 스크립트는 공격자가 의도한 동작(세션 탈취, 페이지 변조, 피싱, 키로깅 등)을 수행할 수 있다. 중요한 점은 스크립트가 피해자 브라우저에서 해당 웹사이트의 출처(origin) 로 실행된다. 그래서 쿠키·로컬스토리지·DOM 접근 권한을 가진다(단, HttpOnly로 설정된 쿠키는 JS에서 읽을 수 없다).
공격 종류 및 방법
1. Stored (Persistent) XSS

말 그대로 지속적으로 피해를 입히는 XSS 공격이다. 위의 그림을 보면, 해커는 웹 애플리케이션에서 XSS 취약점이 있는 곳을 파악하고, 악성스크립트를 삽입한다. 삽입된 스크립트는 데이터베이스에 저장이 되고, 저장된 악성스크립트가 있는 게시글 등을 열람한 사용자들은 악성스크립트가 작동하면서 쿠키를 탈취당한다던가, 혹은 다른 사이트로 리다이렉션 되는 공격을 받게 된다.
데이터베이스에 저장이 되어 지속적으로 공격한다고 하여 Persistent XSS 라고 부르며, 데이터베이스에 저장이 되므로 Stored XSS 공격이라고 부르기도 합니다. 한번의 공격으로 악성스크립트를 삽입하여 수많은 피해를 입힐 수 있다는 점이 특징이다.
2. Reflected XSS

사용자에게 입력 받은 값을 서버에서 되돌려 주는 곳에서 발생한다. 예를 들어 사용자에게 입력 받은 검색어를 그대로 보여주는 곳이나 사용자가 입력한 값을 에러 메세지에 포함하여 보여주는 곳에 악성스크립트가 삽입되면, 서버가 사용자의 입력 값을 포함해 응답해 줄 때 스크립트가 실행된다.
보통 Reflected XSS 는 공격자가 악의적인 스크립트와 함께 URL을 사용자에게 누르도록 유도하고, URL을 누른 사용자는 악의적인 스크립트가 실행되면서 공격을 당하게 된다.
3. DOM-based XSS

DOM based XSS 는 악의적인 스크립트가 포함 된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에 발생하는 공격이다. 악의적인 스크립트로 인해서 클라이언트 측 코드가 원래 의도와는 다르게 실행된다. DOM based XSS 공격은 다른 XSS 공격과는 다르게 서버 측에서 탐지가 어렵다. 위의 그림을 보면 해커는 http://www.some.site/page.html URL 과 함께 # 이라는 특수문자를 사용하고 있다. 이 특수문자는 # 이후의 값은 서버로 전송되지 않는 기능을 가지고 있다.
대응방안
1. 출력(encoding) 우선 — 입력 검증보다 출력 인코딩이 더 중요.
- HTML 바디 문맥 → HTML 이스케이프 (< → < 등)
- 속성(context) → attribute 인코딩
- JS 문자열로 삽입 → JS 문자열 인코딩
- URL에 삽입 → URL 인코딩
(컨텍스트별로 다른 인코딩 필요)
2. 최소 허용(whitelisting) 입력 검증
- 가능한 경우 허용되는 값 패턴만 받기(예: 이메일, 숫자, enum 등).
3. 안전한 API 사용
- DOM에 텍스트를 넣을 때 textContent, createTextNode 사용
- HTML을 넣어야 할 때는 DOMPurify 같은 검증된 라이브러리로 정화
4. Content Security Policy (CSP)
- Content-Security-Policy 헤더로 스크립트 출처 제한, inline 스크립트 차단/nonce 사용.
- 예: Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-abc123'; object-src 'none';
(CSP은 보조 방어층—버그가 있어도 피해를 줄여줌)\
5. 쿠키 보안 설정
- HttpOnly, Secure, SameSite 설정으로 JS에서 쿠키 접근을 어렵게 하여 세션 탈취 위험 감소
6. 서버 템플릿/프레임워크 기능 활용
- 템플릿 엔진의 자동 이스케이프 기능을 켜두고, raw 출력 기능은 최소화.
- 프레임워크 기본 출력(예: React, Vue)이 자동 이스케이프 하므로 안전한 사용 권장.
7. 위험한 함수 사용 금지
- eval, new Function, document.write 등은 사용 금지 또는 대체.
8. 라이브러리·서드파티 스크립트 관리
- 서드파티 스크립트는 신뢰된 출처만 사용, Subresource Integrity(SRI) 적용 고려.
'개념 정리' 카테고리의 다른 글
| 콜백함수, Promise, Async/await / Ajax, Fetch, Axios (0) | 2025.09.09 |
|---|---|
| useMemo, useCallback (0) | 2025.09.08 |
| 전역 상태 관리에 대해서(Recoil, Zustand, React Query) 이어서 (1) | 2025.05.23 |
| 전역 상태 관리에 대해서(Context API, Redux) (0) | 2025.05.23 |
| React Query에 대해서 (1) | 2025.05.21 |