XSS는 웹 애플리케이션에서 사용자 입력값을 제대로 검증하지 않아 악성 스크립트가 삽입되고 실행되는 취약점을 말합니다. 공격자가 이를 악용해 사용자 브라우저에서 악성 코드가 실행되도록 하여 개인 정보 탈취, 세션 하이재킹, 악성 사이트로 리다이렉트 등을 수행할 수 있습니다.
Stored XSS (저장형 XSS)
Reflected XSS (반사형 XSS)
DOM-based XSS
Stored XSS
공격자가 게시판 댓글로 악성 스크립트를 삽입:
<script>alert('XSS 공격!');</script>
다른 사용자가 댓글 페이지를 조회할 때 브라우저가 스크립트를 실행.
Reflected XSS
URL에 악성 스크립트를 포함:
http://example.com/search?q=<script>alert('XSS!');</script>
서버가 q 파라미터 값을 그대로 응답에 포함하면 스크립트가 실행.
DOM-based XSS
var userInput = location.search.split('=')[1];
document.body.innerHTML = `<p>${userInput}</p>`;http://example.com/?name=<script>alert('XSS');</script>입력값 검증
출력값 인코딩
< → <, > → >).// Java 예제: Apache Commons Text 사용
String safeOutput = StringEscapeUtils.escapeHtml4(userInput);
HTTP 응답 헤더 설정
라이브러리 사용
DOM 조작 시 조심
var safeElement = document.createElement('div');
safeElement.textContent = userInput; // 안전하게 텍스트로 처리
document.body.appendChild(safeElement);라이브러리와 프레임워크의 보안 기능 활용
@Controller
public class ExampleController {
@PostMapping("/submit")
public String submit(@RequestParam("userInput") String userInput, Model model) {
// XSS 방지를 위해 HTML 엔티티 인코딩
String safeInput = StringEscapeUtils.escapeHtml4(userInput);
model.addAttribute("userInput", safeInput);
return "result";
}
}
result.html (Thymeleaf 템플릿):
<p>사용자 입력: [[${userInput}]]</p>
XSS는 사용자 입력값을 제대로 검증하지 않거나 적절히 처리하지 않을 때 발생하는 주요 취약점입니다. 올바른 검증, 출력값 인코딩, CSP 적용 등 방어 전략을 통해 XSS 공격을 방지할 수 있습니다.
추가 학습 자료