크로스 사이트 스크립팅
크로스 사이트 스크립팅(XSS, Cross-Site Scripting)은 공격자가 다른 사용자의 브라우저에서 자신이 작성한 스크립트를 실행시키는 웹 보안 취약점이다. 페이지에 사용자 입력을 그대로 출력할 때 가장 많이 발생하며, 세션 탈취·피싱·키로깅 등 다양한 2차 공격으로 이어진다.
기본 흐름
- 공격자가 게시판, 댓글, URL 파라미터 등에 스크립트가 포함된 입력을 주입한다.
- 서버가 그 입력을 이스케이프 없이 페이지에 출력한다.
- 다른 사용자가 페이지를 열면 그 스크립트가 자신의 브라우저에서 실행된다.
- 공격자는 쿠키·세션·키 입력 등을 탈취하거나 강제로 동작을 수행시킨다.
종류
| 종류 | 특징 |
|---|---|
| Stored XSS | 악성 스크립트가 서버에 저장되어 다른 사용자에게 노출 |
| Reflected XSS | URL 파라미터 등으로 즉시 반사되어 실행 |
| DOM-based XSS | 서버를 거치지 않고 클라이언트 측 JS가 처리하는 과정에서 발생 |
대응 방안
- 출력 인코딩: HTML 컨텍스트에 맞게
<,>,&등을 escape - 입력 검증: 화이트리스트 기반 필터링
- CSP(Content Security Policy): 신뢰된 출처의 스크립트만 실행 허용
- HttpOnly 쿠키: JS에서 세션 쿠키 접근 차단
- 신뢰 가능한 라이브러리 사용: 템플릿 엔진의 자동 escape 활용
실수가 흔한 지점
innerHTML로 사용자 입력을 직접 삽입- URL이나 검색어를
<a href>,<img src>에 그대로 사용 - “안전해 보이는” 마크다운 렌더러도 HTML 통과를 허용하면 위험
관련 노트
- CSRF: 다른 종류의 대표 웹 취약점
- SQL Injection: 입력 검증을 게을리할 때 발생하는 또 다른 공격
- 기밀성 · 무결성: XSS가 위협하는 보안 원칙
- 세션: XSS의 주요 탈취 대상