보안Medium#216
XSS 공격의 종류와 방어 방법을 설명해주세요.
#보안#XSS#웹보안#CSP
답변 포인트
사용자 입력이 실행되는 경로를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
XSS는 삽입된 스크립트가 사용자 브라우저에서 실행되는 공격입니다. 출력 이스케이프, 안전한 HTML 처리, CSP, 입력 검증으로 방어합니다.
XSS(Cross-Site Scripting)는 공격자가 웹 페이지에 악성 스크립트를 삽입해 다른 사용자의 브라우저에서 실행하게 만드는 공격입니다. 세션 탈취, 피싱, 사용자 대신 요청 보내기, 화면 변조로 이어질 수 있습니다.
종류
Stored XSS
게시글, 댓글, 프로필처럼 서버에 저장된 악성 스크립트가 여러 사용자에게 전달됩니다. 영향 범위가 크기 때문에 가장 위험합니다.
Reflected XSS
검색어, 에러 메시지처럼 요청 파라미터가 응답 HTML에 그대로 반사될 때 발생합니다.
HTML
<!-- 위험: q 값이 이스케이프 없이 삽입됨 -->
<p>검색어: <script>alert(document.cookie)</script></p>DOM-based XSS
서버 응답은 안전해도 클라이언트 JavaScript가 location.hash, innerHTML 등을 잘못 사용해 발생합니다.
JavaScript
// 위험
document.querySelector('#result').innerHTML = location.hash.slice(1);
// 안전한 방향
document.querySelector('#result').textContent = location.hash.slice(1);방어 방법
- HTML, attribute, URL, JavaScript context에 맞게 출력 인코딩을 적용합니다.
- 사용자 입력을 HTML로 렌더링해야 한다면 DOMPurify 같은 검증된 sanitizer를 사용합니다.
- React처럼 기본 이스케이프를 제공하는 프레임워크에서도
dangerouslySetInnerHTML은 엄격히 제한합니다. - 쿠키에는
HttpOnly,Secure,SameSite를 설정합니다. - CSP(Content-Security-Policy)로 inline script 실행을 줄입니다.
면접 답변 포인트
XSS는 입력 검증만으로 막는 것이 아니라 “출력 시점의 context-aware escaping”이 핵심입니다. Stored/Reflected/DOM XSS를 구분하고, CSP와 HttpOnly 쿠키는 피해를 줄이는 보조 방어라고 설명하면 좋습니다.