AI, 빅데이터, 클라우드 & 파이프라인

오늘의 정리 - 웹 서비스 요청 및 결과 검증

modubiz.org 2026. 7. 7. 23:51
반응형

웹 서비스 요청 및 결과 검증

1. Reflected XSS (반사형 XSS)
 - 공격자가 만든 악성 스크립트가 포함된 링크를 사용자가 클릭해야만 공격이 발생하는 '일회성' 공격입니다.

#동작 원리

 - 공격자가 악성 스크립트가 담긴 URL(예: .../search?q=<script>alert('Hacked')</script>)을 만듭니다.
 - 이 링크를 이메일이나 게시판을 통해 피해자에게 보냅니다.
 - 피해자가 링크를 클릭하면, 서버는 입력값을 그대로 브라우저에 '반사(Reflect)'하여 보여줍니다.
 - 피해자의 브라우저에서 스크립트가 즉시 실행됩니다.
 - 특징: 스크립트가 서버 DB에 저장되지 않습니다. 클릭 유도가 필수입니다.

 

<div>검색 결과: <%= request.getParameter("query") %></div>
<div>검색 결과: <c:out value="${param.query}" /></div>

 

2. Stored XSS (저장형 XSS)
 - 악성 스크립트가 서버의 데이터베이스(DB)에 저장되어, 해당 페이지를 보는 모든 사용자에게 피해를 주는 가장 위험한 공격입니다.

# 동작 원리

 - 공격자가 게시판 글쓰기나 댓글란에 악성 스크립트를 작성하여 서버에 게시합니다.
 - 서버는 이 스크립트를 아무런 검증 없이 DB에 저장합니다.
 - 일반 사용자가 게시판을 조회하면, 서버는 DB에서 글을 가져와 화면에 보여줍니다.
 - 그 페이지를 조회하는 모든 사용자의 브라우저에서 스크립트가 실행됩니다.
 - 특징: 한 번 저장되면 수많은 사용자가 클릭 없이도 자동 감염됩니다.

// 게시물 조회 시 DB에서 가져온 내용을 그대로 렌더링
// DB의 content 필드에 <script>...</script>가 들어있음

res
.render('view', { content: post.content });
<div><%= content %></div>

 

3. DOM-based XSS (DOM 기반 XSS)
 - 스크립트가 서버를 거치지 않고, 브라우저 환경에서 DOM(Document Object Model)을 조작할 때 발생하는 공격입니다.

# 동작 원리

 - 서버는 안전하지만, 웹 페이지 내의 JavaScript 코드가 URL의 파라미터 등을 불안전하게 가져와 화면에 그립니다.
 - 공격자는 URL 뒤에 # 등을 사용하여 스크립트를 포함합니다(예: .../index.html#name=<img src=x onerror=alert(1)>).
 - 브라우저에서 실행되는 자바스크립트가 이 값을 받아 화면에 출력할 때 스크립트가 실행됩니다.
 - 특징: 서버는 이 공격을 전혀 알지 못합니다. 브라우저 안에서만 모든 일이 벌어집니다.

 

// URL 해시 값을 가져와서 화면에 직접 삽입
// URL: index.html#name=<img src=x onerror=alert(1)>


const name = new URLSearchParams(window.location.hash.substring(1)).get('name');
document.getElementById('welcome').innerHTML = "환영합니다, " + name;

// 안전한 코드
document.getElementById('welcome').textContent = "환영합니다, " + name;

 

사례1 : 외부 입력값을 검증 없이 응답페이지 생성에 사용하는 경우
웹 페이지에 악의적인 스크립트가 포함될 수 있으며, 해당 웹페이지를 열람하는 접속자의 권한으로
부적절한 스크립트가 실행되어 정보 유출 등의 공격을 유발할 수 있다.

사례2 : DB에 저장된 값을 검증 없이 응답페이지 생성에 사용하는 경우
공격자가 미리 취약한 서버에 악의적인 스크립트가 포함된 정보를 저장해서 일반 사용자들이 해당
정보를 조회하는 경우 접속자의 권한으로 부적절한 스크립트가 수행되어 정보 유출 등의 공격을 유발
할 수 있다.

반사형/저장형 방어의 표준:
서버 사이드 템플릿 엔진을 사용할 때는 무조건 이스케이프(Escape) 기능을 지원하는 태그/메서드만 사용하세요. (JSP의 <c:out>, Thymeleaf의 th:text, React의 기본 렌더링 방식 등)

DOM 기반 방어의 표준:
자바스크립트에서 innerHTML은 정말 필요한 경우가 아니면 절대 쓰지 마세요. 텍스트를 넣을 때는 무조건 textContent나 innerText를 사용하는 것을 팀 내 코딩 컨벤션(코딩 규칙)으로 정하는 것이 가장 확실합니다.

유형
스크립트 저장 위치
공격 방식
핵심 차이
Reflected
저장 안 됨
링크 클릭 유도
서버를 거쳐 즉시 반사됨
Stored
서버 DB
게시물 조회 시 자동 실행
서버 DB에 악성 코드가 영구 보관됨
DOM-based
저장 안 됨
클라이언트 측 코드 조작
서버를 전혀 거치지 않음