본문 바로가기
프로그래밍/개발 팁

🔐 XSS (Cross Site Scripting)의 원리와 방어법

by 다다면체 2025. 6. 17.
728x90
반응형

웹 보안의 가장 대표적인 위협 중 하나인 **XSS(Cross-Site Scripting)**는 공격자가 웹사이트에 악성 스크립트를 삽입하여 사용자의 브라우저에서 실행되도록 유도하는 공격이에요. 😈 이 스크립트는 사용자 세션 쿠키 탈취, 피싱 페이지 유도, 악성 행위 수행 등 다양한 위협을 발생시킬 수 있어 웹 개발 시 반드시 고려해야 할 보안 취약점이죠.


XSS의 핵심 원리 이해하기 🧠

XSS는 웹사이트가 사용자 입력값을 적절하게 검증하거나 필터링하지 않고 그대로 출력할 때 발생해요. 예를 들어, 게시판에 사용자가 입력한 <script> 태그가 포함된 내용이 아무런 처리 없이 웹 페이지에 렌더링될 경우, 해당 페이지를 방문한 다른 사용자의 브라우저에서 이 스크립트가 실행되는 거죠.

공격 흐름 요약:

  1. 공격자, 악성 JavaScript 삽입 😈: 공격자가 웹 페이지에 악성 JavaScript 코드를 삽입해요.
  2. 웹 서버, 필터링 없이 전달 📦: 웹 서버는 삽입된 악성 코드를 필터링하지 않고 클라이언트(사용자 브라우저)에 그대로 전달하죠.
  3. 피해자 브라우저, JS 실행 💻: 피해자의 브라우저가 해당 내용을 HTML로 해석하는 과정에서 악성 JavaScript가 실행돼요.
  4. 피해 발생 💸: 실행된 스크립트를 통해 쿠키 탈취, 계정 탈취, 악성 동작 수행 등 다양한 피해가 발생할 수 있답니다. 😵

실제 코드 예시로 보는 XSS 취약점 🧪

XSS 취약점이 어떻게 발생할 수 있는지 간단한 HTML 코드를 통해 살펴볼까요?

1. 취약한 HTML 예시 (게시판 댓글 등)

<p>댓글: <%= userInput %></p>

사용자가 위 userInput 위치에 다음과 같은 내용을 입력했다고 가정해 봅시다.

<script>
  alert('XSS 공격!');
</script>

➡️ 페이지 렌더링 결과:

<p>댓글: <script>alert('XSS 공격!');</script></p>

결과적으로 사용자의 브라우저에서 alert('XSS 공격!')이라는 경고창이 뜨며, 삽입된 스크립트가 실행돼요. 😱 이는 공격자가 의도한 악성 스크립트가 사용자 브라우저에서 정상적으로 작동할 수 있음을 의미한답니다.


XSS의 주요 유형 📚

XSS 공격은 악성 스크립트가 웹 애플리케이션에 주입되고 실행되는 방식에 따라 크게 세 가지 유형으로 나눌 수 있어요.

Stored XSS 공격자가 삽입한 악성 스크립트가 서버의 데이터베이스에 저장된 후, 다른 사용자에게 전달되어 실행돼요. 💾 게시글/댓글, 프로필
Reflected XSS URL 파라미터나 폼 입력값에 포함된 악성 스크립트가 웹 응답에 그대로 반영되어 실행돼요. 🔄 검색어 파라미터, 오류 메시지
DOM-based XSS 클라이언트 측 JavaScript 코드에서 DOM(Document Object Model)을 조작하는 과정에서 발생해요. 서버를 거치지 않고 브라우저 내에서 취약점이 발생하죠. 🌐 innerHTML, document.write 등 DOM 조작 함수

XSS 방어를 위한 필수 전략 🛡️

"모든 입력은 의심하고, 모든 출력은 조심하라." 이 격언은 XSS를 포함한 웹 보안의 기본 원칙이에요. XSS 방어를 위한 핵심 전략들을 알아보겠습니다. 😎

1. 입력값 검증 (Input Validation / Sanitization) ✅

사용자로부터 입력받는 모든 데이터에 대해 <, >, ', "와 같은 특수문자를 필터링하거나, 허용 목록(Whitelist) 방식으로 안전하다고 판단되는 문자만 허용해야 해요.

// 예: DOMPurify를 사용하여 사용자 입력값 정화
const clean = DOMPurify.sanitize(userInput);

2. 출력 이스케이프 (Output Encoding) 📝

HTML 페이지에 데이터를 출력할 때는 스크립트가 아닌 단순 문자열로 인식되도록 이스케이프(Escape) 처리를 해야 해요. 출력되는 위치에 따라 적절한 이스케이프 방식을 적용해야 하죠.

HTML Body & → &amp;, < → &lt;, > → &gt; 등
HTML Attribute " → &quot;, ' → &#x27; (또는 &apos;) 등
JavaScript \', \", \\ 등으로 이스케이프
URL encodeURIComponent() 사용

3. CSP (Content Security Policy) 설정 🚫

**CSP(Content Security Policy)**는 XSS 공격을 브라우저 차원에서 무력화하는 강력한 보안 메커니즘이에요. HTTP 응답 헤더 또는 <meta> 태그를 통해 스크립트 로딩 정책을 정의하여, 인라인 스크립트나 허용되지 않은 외부 JavaScript URL의 실행을 제한할 수 있답니다.

Content-Security-Policy: default-src 'self'; script-src 'self';

위 정책은 외부 JavaScript 로드와 인라인 JavaScript 실행을 차단하여 XSS 성공률을 현저히 낮춰줘요.

4. HTTPOnly 쿠키 설정 🍪🔒

HTTPOnly 쿠키는 XSS를 통한 세션 탈취를 막기 위한 중요한 안전장치예요. Set-Cookie 헤더에 HttpOnly 속성을 추가하면, 해당 쿠키는 JavaScript 코드에서 접근할 수 없게 된답니다.

Set-Cookie: sessionId=abc123; HttpOnly

이렇게 설정된 쿠키는 document.cookie 등으로 읽을 수 없으므로, 공격자가 XSS를 통해 사용자 세션 쿠키를 탈취하는 것을 방지할 수 있어요.


실전 방어 전략 요약 👨‍💻

XSS 방어는 특정 한두 가지 기술에 의존하기보다는, 개발의 전 과정에서 보안을 고려하는 전방위적 설계가 핵심이에요.

  • 입력 ➡️: 모든 사용자 입력은 **검증(Sanitization)**을 거쳐야 해요.
  • 출력 ➡️: 웹 페이지에 출력되는 모든 데이터는 이스케이프(Escaping) 처리돼야 하죠.
  • 전송 ➡️: **CSP, HSTS(HTTP Strict Transport Security)**와 같은 보안 헤더를 적극 활용하세요.
  • 세션 ➡️: 쿠키에 HttpOnly, Secure 속성을 설정하여 보안을 강화해야 합니다.
  • 프레임워크 활용 🛠️: Spring Security, Django Template Filter 등 웹 프레임워크가 제공하는 보안 기능을 적극적으로 활용하는 것도 잊지 마세요!

XSS는 단순해 보이지만, 방심한 순간 침투하여 사용자와 시스템 모두에 치명적인 영향을 줄 수 있는 대표적인 웹 취약점이에요. 웹 개발자, 백엔드 엔지니어, 프론트엔드 개발자 모두가 함께 협력하여 XSS 방어 체계를 마련하고, **"모든 신뢰는 무너질 수 있다. 사용자가 입력한 그 한 줄이, 시스템 전체를 흔들 수 있다."**는 경각심을 가지고 지속적인 보안 코딩 습관을 들이는 것이 중요하답니다!

이 가이드를 통해 XSS 공격 원리부터 효과적인 방어 방법까지 이해하고, 여러분의 웹 애플리케이션을 더욱 안전하게 지키는 데 도움이 되기를 바랍니다! 💖 궁금한 점이 있다면 언제든지 물어봐 주세요! 😊

728x90
반응형