15강 / 20강

XSS — 남의 브라우저에서 내 코드를 돌린다

저장된 스크립트가 다른 손님을 노린다

XSS — 남의 브라우저에서 내 코드를 돌린다
SQL 인젝션이 DB를 노린다면, XSS 는 다른 손님의 브라우저를 노립니다.

14강의 인젝션이 서버의 DB를 노렸다면, XSS(Cross-Site Scripting)는 다른 손님의 브라우저를 노립니다. 후기·댓글·닉네임처럼 남에게 보이는 곳에 공격자가 스크립트를 심어 두면, 그 페이지를 여는 다른 손님의 브라우저에서 그 코드가 실행돼요.

뿌리는 같습니다(13강) — 손님이 넣은 데이터가 코드로 해석된 것.

후기에 태그를 심어 봅시다

상품 후기창에 <b>강조</b> 를 써 봅니다. 앱이 이걸 그대로 페이지에 넣으면, 브라우저는 이게 후기인지 개발자 코드인지 구분하지 못하고 글자를 굵게 만들어요. 태그가 먹혔다면, <script> 도 먹힌다는 뜻입니다.

XSS 실습실 — 후기에 스크립트를 심어 보고 이스케이프로 막는다
불러오는 중…

실습실에서 이스케이프를 끈 상태로 시도해 보세요.

<b>강조</b>
글자가 굵어짐 → 태그가 먹힘
<img src=x onerror=alert(1)>
코드가 실행됨
<script>쿠키 훔치기</script>
세션 탈취 😱

근본 방어 — 출력할 때 이스케이프

핵심은 들어올 때가 아니라 나갈 때(화면에 그릴 때) 막는 것입니다. 같은 데이터도 HTML·JS·URL 중 어디에 놓이느냐에 따라 위험한 글자가 다르거든요.

출력 이스케이프는 < 를 &lt; 로 바꿉니다. 그러면 브라우저는 그걸 '꺾쇠라는 글자'로 그릴 뿐, 태그로 읽지 않아요. 요즘 템플릿 엔진(우리 사이트의 Jinja 포함)은 기본으로 이스케이프합니다 — 개발자가 일부러 끄지만 않으면 됩니다.

이스케이프가 무엇을 하는지 눈으로 봅니다.
Python 브라우저 안에서 실행 (계산용)
🤔 확인 문제
XSS 공격이 주로 노리는 것은?
🤔 확인 문제
XSS 를 막는 근본 방어는?