1. 적을 알아야 막는다: XSS 공격의 3가지 핵심 유형
XSS를 단순히 “스크립트 공격”으로 퉁쳐서 이해하면 제대로 막을 수 없습니다. 공격자가 어디를 노리느냐에 따라 대응 방식이 달라지기 때문입니다.
저장형 XSS (Stored XSS) – “가장 치명적인 지뢰”
공격자가 악성 스크립트를 게시판, 댓글, 사용자 프로필 등에 영구적으로 저장하는 방식입니다.
- 시나리오: 해커가 쇼핑몰 상품 리뷰에 악성 스크립트를 심어놓습니다. 이후 이 상품 페이지를 조회하는 모든 일반 사용자와 관리자의 브라우저에서 스크립트가 자동 실행됩니다.
- 위험성: 불특정 다수에게 광범위한 피해를 입히며, 관리자 계정이 탈취될 경우 사이트 전체가 장악당합니다.
반사형 XSS (Reflected XSS) – “교묘한 미끼”
악성 스크립트가 포함된 URL을 사용자에게 클릭하도록 유도하는 방식입니다. 웹 서버에 저장되지 않고, URL 파라미터를 통해 즉시 반사되어 실행됩니다.
- 시나리오: “이벤트 당첨 확인하세요”라는 이메일 속 링크를 클릭하는 순간, URL 뒤에 숨겨진 스크립트(site.com/search?q=<script>…)가 실행되어 쿠키 정보를 해커에게 전송합니다.
- 위험성: 피싱(Phishing) 공격과 결합하여 주로 발생하며, 사용자가 링크를 클릭하지 않으면 발생하지 않기에 사회 공학적 기법이 동원됩니다.
③ DOM 기반 XSS (DOM-based XSS) – “서버를 거치지 않는 유령”
최근 유행하는 SPA(Single Page Application) 환경에서 가장 주의해야 할 유형입니다. 서버 측의 탐지를 우회하고, 브라우저 내의 DOM 환경에서만 스크립트가 조작되어 실행됩니다.
- 위험성: 서버 로그에 남지 않아 탐지가 매우 어렵고, 프론트엔드 개발자의 보안 의식이 낮을 경우 취약점이 쉽게 노출됩니다.

2. [관리자/개발자 편] 철통 보안을 위한 다층 방어 시스템 (Layered Defense)
“완벽한 코드는 없다”는 전제하에, 한 곳이 뚫려도 다음 단계에서 막히도록 다층적인 방어막을 구축해야 합니다.
입력값 검증의 고도화 (Whitelist over Blacklist)
대부분의 개발자가 <script> 태그만 막으면 된다고 생각하지만, 이는 오산입니다. 해커들은 <img src=x onerror=alert(1)>과 같이 스크립트 태그 없이도 코드를 실행합니다.
- 솔루션: ‘나쁜 것’을 막는 블랙리스트 방식은 한계가 있습니다. ‘허용할 것’만 정하는 화이트리스트(Whitelist) 방식을 사용하세요. 숫자 입력칸엔 숫자만, 이름엔 문자만 허용하는 식입니다.
- 라이브러리 활용: Java의 Lucy XSS Filter, Node.js의 DOMPurify 등 검증된 라이브러리를 사용하여 입력을 살균(Sanitize)해야 합니다.
보안 헤더의 적극적 활용 (CSP & SameSite)
코딩만으로는 부족합니다. 브라우저가 스스로 방어하도록 서버 설정을 강화해야 합니다.
- CSP (Content Security Policy): 외부 스크립트 로딩을 원천 차단하는 가장 강력한 방패입니다. default-src ‘self’ 설정만으로도 대부분의 XSS를 무력화할 수 있습니다.
- SameSite 쿠키 속성: 쿠키 설정에 SameSite=Strict 또는 Lax를 추가하십시오. 이는 XSS뿐만 아니라 CSRF(사이트 간 요청 위조) 공격까지 효과적으로 방어하여, 타 사이트에서의 비정상적인 요청 시 쿠키 전송을 막습니다.
③ 웹 방화벽 (WAF) 도입
코드 레벨에서 놓친 공격 패턴을 네트워크 단에서 차단합니다. AWS WAF, Cloudflare 등 클라우드 기반 방화벽은 최신 XSS 패턴을 실시간으로 업데이트하여 막아줍니다.

3. [사용자 편] 내 정보를 지키는 ‘제로 트러스트’ 브라우저 습관
해커가 아무리 정교한 덫을 놓아도, 사용자가 걸려들지 않으면 그만입니다. 다음의 심화 수칙을 기억하세요.
2단계 인증(2FA)은 선택이 아닌 필수
XSS 공격으로 아이디와 비밀번호가 털렸다고 가정해 봅시다. 만약 여러분이 OTP나 생체 인증 같은 2단계 인증을 설정해 두었다면, 해커는 로그인 마지막 단계에서 막히게 됩니다. 이는 계정 탈취를 막는 최후의 보루입니다.
브라우저 확장 프로그램의 ‘권한’ 확인하기
편리함 때문에 설치한 ‘유튜브 광고 제거’, ‘쇼핑 최저가 검색’ 등의 확장 프로그램이 여러분의 모든 웹사이트 방문 기록과 입력 데이터를 보고 있을 수 있습니다.
- 행동 수칙: 확장 프로그램 설치 시 “모든 웹사이트의 데이터 조회 및 변경” 권한을 요구한다면 설치를 재고하십시오. 사용하지 않는 프로그램은 즉시 삭제하는 ‘브라우저 다이어트’가 필요합니다.
링크 클릭 전 ‘미리보기’ 습관화
단축 URL(bit.ly 등)은 목적지를 숨기기 때문에 위험합니다. 모바일에서는 링크를 길게 눌러 실제 주소를 확인하고, PC에서는 마우스를 올려 브라우저 하단에 표시되는 실제 URL이 내가 아는 정상 도메인이 맞는지 확인하는 습관을 들이세요.
중요 작업 전용 ‘세컨드 브라우저’ 사용
웹 서핑용 브라우저(예: 크롬)와 금융/업무용 브라우저(예: 엣지, 웨일)를 분리해서 사용하십시오. 웹 서핑 중 XSS에 감염되더라도, 분리된 브라우저에 저장된 금융 정보나 업무 세션은 안전하게 보호될 수 있습니다.
4. 이미 공격이 의심된다면? 긴급 대응 매뉴얼
증상이 발견된 직후의 1분이 피해 규모를 결정합니다.
- 네트워크 차단: 랜섬웨어 다운로드나 추가 데이터 유출을 막기 위해 즉시 인터넷 연결(와이파이/랜선)을 끊으십시오.
- 다른 기기로 비번 변경: 감염된 PC가 아닌, 스마트폰(LTE/5G 모드)이나 다른 PC를 이용해 주요 사이트의 비밀번호를 즉시 변경하고, ‘모든 기기에서 로그아웃’ 기능을 실행하십시오.
- 전문 백신 검사: 윈도우 디펜더(Windows Defender) 혹은 신뢰할 수 있는 유료 백신으로 전체 검사를 수행하여 숨겨진 악성 코드를 제거해야 합니다.
5. 맺음말: 보안은 ‘불편함’을 감수하는 용기입니다
20년 전이나 지금이나, 가장 강력한 보안 취약점은 시스템이 아닌 ‘사람의 방심’ 입니다. “귀찮아서” 업데이트를 미루고, “편하려고” 자동 로그인을 유지하는 순간 보안의 문은 활짝 열립니다.
웹사이트 관리자는 끊임없는 모의 해킹(Penetration Testing) 을 통해 시스템의 내성을 키우고, 사용자는 ‘의심하는 습관’ 을 무기로 삼아야 합니다. 오늘 이 글을 읽고 브라우저 설정을 한 번이라도 점검하신다면, 여러분은 이미 상위 1%의 보안 의식을 가진 사용자입니다. 안전한 웹 생활은 바로 지금, 여러분의 클릭 하나에서 시작됩니다.
