XSS — 남의 브라우저에서 내 코드를 돌린다
저장된 스크립트가 다른 손님을 노린다
SQL 인젝션이 DB를 노린다면, XSS 는 다른 손님의 브라우저를 노립니다.
14강의 인젝션이 서버의 DB를 노렸다면, XSS(Cross-Site Scripting)는
다른 손님의 브라우저를 노립니다. 후기·댓글·닉네임처럼 남에게 보이는 곳에
공격자가 스크립트를 심어 두면, 그 페이지를 여는 다른 손님의 브라우저에서
그 코드가 실행돼요.
뿌리는 같습니다(13강) — 손님이 넣은 데이터가 코드로 해석된 것.
후기에 태그를 심어 봅시다
상품 후기창에 <b>강조</b> 를 써 봅니다. 앱이 이걸 그대로
페이지에 넣으면, 브라우저는 이게 후기인지 개발자 코드인지 구분하지 못하고
글자를 굵게 만들어요. 태그가 먹혔다면, <script> 도 먹힌다는 뜻입니다.
실습실에서 이스케이프를 끈 상태로 시도해 보세요.
<b>강조</b>
글자가 굵어짐 → 태그가 먹힘
<img src=x onerror=alert(1)>
코드가 실행됨
<script>쿠키 훔치기</script>
세션 탈취 😱
근본 방어 — 출력할 때 이스케이프
핵심은 들어올 때가 아니라 나갈 때(화면에 그릴 때) 막는 것입니다.
같은 데이터도 HTML·JS·URL 중 어디에 놓이느냐에 따라 위험한 글자가 다르거든요.
출력 이스케이프는 < 를 < 로 바꿉니다.
그러면 브라우저는 그걸 '꺾쇠라는 글자'로 그릴 뿐, 태그로 읽지 않아요.
요즘 템플릿 엔진(우리 사이트의 Jinja 포함)은 기본으로 이스케이프합니다 —
개발자가 일부러 끄지만 않으면 됩니다.
이스케이프가 무엇을 하는지 눈으로 봅니다.
Python
브라우저 안에서 실행 (계산용)
🤔 확인 문제
XSS 공격이 주로 노리는 것은?
해설 XSS 는 다른 손님의 브라우저에서 코드를 실행해, 주로 세션 쿠키를 훔칩니다. 쿠키만 있으면 비밀번호 없이 그 사람으로 로그인되니, 사실상 계정 탈취예요.
🤔 확인 문제
XSS 를 막는 근본 방어는?
해설 핵심은 출력 이스케이프입니다. 화면에 그릴 때 < 를 글자로 바꾸면 브라우저가 코드로 실행하지 않아요. 입력 필터링은 우회가 많아 근본책이 못 됩니다.