XSS 공격을 방지하는 방법

HTML 입력을 차단하고, 데이터를 삭제하며, 쿠키를 보호하고, 웹 애플리케이션 방화벽(WAF)을 배포하여 악의적 스크립트의 실행과 사용자 정보 도난을 방지합니다.

학습 목표

이 글을 읽은 후에 다음을 할 수 있습니다:

  • 'XSS'의 정의
  • XSS 작동 방식 이해
  • XSS 공격 방지 방법 알아보기

글 링크 복사

XSS란?

Cross-site scripting(XSS)은 공격자가 하나 이상의 웹 스크립트를 통해 악성 코드를 합법적인 웹 사이트 또는 웹 앱에 삽입하는 전술입니다. 사용자가 웹 사이트를 로드하거나 웹 앱을 실행하면 이러한 스크립트가 사용자의 브라우저 내에서 실행됩니다.

스크립트는 사용자의 HTTP 쿠키, 세션 토큰, 기타 중요한 정보를 훔치는 등 악의적인 다양한 작업을 수행할 수 있습니다. 공격자는 이 정보를 사용하여 사용자를 가장하고 소셜 미디어 플랫폼이나 은행 웹 사이트와 같은 다른 플랫폼의 계정에 무단으로 액세스할 수 있습니다. 또한, 스크립트는 웹 사이트를 손상시키거나, 악의적 사이트로 사용자를 리디렉션하거나, 웹 앱에서 기밀 데이터를 추출할 수 있습니다.

자세한 내용은 Cross-site scripting 이란?을 참조하세요.

XSS 공격의 유형에는 어떤 것이 있을까요?

XSS 공격의 가장 대표적인 두 가지 유형은 반사 공격(비지속적)과 저장(지속적) XSS입니다.

반사형 XSS(비지속적)

반사형 XSS 공격은 합법적인 웹 사이트에서 사용자 입력의 유효성을 검사하거나 삭제하지 못할 때 발생할 수 있습니다. 이러한 공격은 공격자가 피싱 이메일을 보내거나 사용자가 클릭하도록 유도하는 링크가 포함된 메시지를 온라인 포럼 게시물에 남기는 소셜 엔지니어링으로 시작되는 경우가 많습니다. 일반적으로 링크에는 악성 코드가 추가된 합법적인 웹 사이트의 URL이 포함됩니다.

사용자가 링크를 클릭하면 해당 브라우저는 합법적인 웹 사이트에 요청을 보내고, 삽입된 코드가 사용자의 브라우저에 다시 반영됩니다. 웹 사이트에서 입력을 제대로 삭제하지 않으므로 악의적 스크립트는 사용자의 브라우저에서 실행됩니다.

코드는 사용자의 쿠키를 복사하여 공격자에게 전송할 수 있습니다. 공격자가 세션 쿠키를 획득하면 세션을 제어하여 사기 구매, 은행 정보 도용, 소셜 미디어 플랫폼에 스팸 게시 등의 악의적인 작업을 수행할 수 있습니다.

이러한 유형의 XSS는 악의적 스크립트가 웹 서버에 반사되어 사용자의 브라우저에서 실행되므로 "반사형" 공격이라고 합니다. 또한, 페이지가 로드될 때만 사용자의 브라우저에서 스크립트가 작동하고 지속적으로는 작동하지 않으므로 "비지속적"이라고도 합니다.

저장된 XSS(지속적)

저장된 XSS 공격은 반사형 XSS 공격보다 더 심각합니다. 저장된 XSS를 통해 악의적인 스크립트는 대상 서버에 지속적으로 저장됩니다.

공격자는 일반적으로 댓글 상자, 사용자 프로필, 사용자 콘텐츠를 수락하고 저장하는 입력 필드와 같은 양식 필드에 악성 스크립트를 삽입하여 이러한 형태의 XSS를 수행합니다. 게시물, 댓글, 양식이 제출되면 스크립트가 웹 앱에 삽입되고 웹 앱의 데이터베이스에 저장됩니다. 다른 사용자가 영향을 받는 페이지를 로드하면 저장된 스크립트가 해당 사용자의 브라우저에서 실행됩니다. 반사형 XSS 공격과 마찬가지로 이 스크립트는 쿠키 또는 기타 사용자 정보를 훔쳐 공격자에게 다시 전송할 수 있습니다.

이러한 유형의 XSS는 페이지에 액세스할 때마다 실행되므로 "지속적"이라고도 합니다. 저장된 XSS 공격이 특히 위험한 이유는 저장된 XSS 공격이 단순히 웹 페이지를 보는 것 이상의 상호 작용 없이도 많은 사용자에게 영향을 미칠 수 있기 때문입니다.

사용자는 XSS 공격을 어떻게 방지할 수 있을까요?

개별 사용자는 XSS 공격의 위험을 줄이기 위해 몇 가지 조치를 취할 수 있습니다.

의심스러운 이메일 및 메시지 식별

많은 XSS 공격이 피싱 계획이나 기타 소셜 엔지니어링 전술로 시작되므로 사용자는 의심스러운 이메일 및 메시지를 식별하는 방법을 배워야 합니다. 사용자는 적절한 IT 팀이나 보안팀에 알려 XSS 공격을 중단시키고 기타 보안 문제를 해결할 수 있습니다.

링크 조사

사용자는 온라인 포럼이나 모르거나 신뢰하는 사람이 보낸 소셜 게시물의 링크를 보게 되면 클릭하기 전에 다시 생각해봐야 합니다. 링크가 합법적인 것처럼 보이더라도 사용자는 주의하여 링크를 이용해야 합니다. XSS 공격을 트리거하는 링크에는 합법적인 URL이 포함되어 있기 때문에 합법적인 것처럼 보이는 경우가 많습니다. 하지만 사용자는 .com, .org, .gov, 기타 접미사 등의 뒤에 있는 링크 전체를 살펴봐야 합니다. 페이지 주소 뒤의 예상치 못한 텍스트는 악성 코드일 수 있습니다.

개발자는 XSS 공격을 어떻게 방지할 수 있을까요?

개발자는 몇 가지 주요 모범 사례를 구현하여 XSS 공격을 방지하는 데 있어 중요한 역할을 할 수 있습니다.

입력 유효성 검사

개발자는 특정 기준을 충족하지 않는 한 사용자가 페이지나 양식에 데이터를 게시하지 못하도록 하는 규칙을 구현할 수 있습니다. 예를 들어 양식에 주민등록번호 또는 전화번호를 요청하는 경우, 개발자는 이 입력에 숫자, 대시, 괄호만 포함해야 하는 규칙을 만들 수 있습니다. 더 강력하게 공격을 방지하려면, 개발자는 < script > 태그처럼 XSS 공격에서 흔히 사용되는 태그나 문자를 명시적으로 거부하는 유효성 검사 규칙을 설정할 수도 있습니다.

개발자는 사용자가 댓글, 게시물, 양식 입력에 HTML을 사용하지 못하도록 막을 수도 있습니다. HTML 콘텐츠는 악성 스크립트를 게시하거나 악성 코드가 포함된 URL의 링크를 숨기는 수단이 될 수 있습니다.

사용자가 서식이 지정된 텍스트나 이미지와 같은 리치 콘텐츠를 게시할 수 있게 하려는 경우, 조직에서는 Markdown(경량 마크업 언어)을 통합하거나 '위지위그'(WYSIWYG) 편집기 내에서 리치 텍스트 서식을 활성화할 수 있습니다. 2가지 방법 모두 리치 콘텐츠를 더 안전하게 지원하는 방법입니다.

데이터 삭제

개발자는 데이터가 웹 서버에 게시된 후 다른 사용자에게 표시되기 전에 검사하는 프로세스를 구현하여 XSS 공격으로 인한 피해를 방지할 수 있습니다. 예를 들어 개발자가 HTML 사용을 허용하더라도 모든 HTML 입력을 삭제하고 악성 코드가 브라우저에서 실행되기 전에 필터링할 수 있습니다.

출력 인코딩 및 '이스케이프 처리'도 유사한 접근 방식을 따릅니다. 그 개념은 페이지에 작성하기 전에 사용자 입력에서 발견되는 악의적 스크립트 또는 기타 코드를 일반 텍스트로 변환하는 것입니다. 출력 인코딩은 코드를 다른 형식으로 변환합니다. 이스케이프 처리는 코드에 특수 문자(예: 백슬래시 또는 따옴표)를 추가합니다. 두 경우 모두 브라우저는 결과 텍스트를 코드로 해석하고 실행하지 않습니다. 삭제(sanitizing)는 필터링을 통해 코드를 제거하는 반면, 출력 인코딩 및 이스케이프 처리는 코드를 보존하면서도 무해하게 렌더링합니다.

코드 검토 및 테스트

개발자는 웹 앱 개발 전반에 걸쳐 보안을 통합해야 합니다. 예를 들어 개발자는 특히 사용자 입력을 수용하고 표시하는 영역에 초점을 맞춰 코드 검토를 수행해야 합니다. 또한 앱을 출시하기 전에 위협 모델링과 테스트를 수행하여 취약점을 식별해야 합니다.

보안 팀에서는 어떻게 XSS 공격을 방지하고 대응할 수 있을까요?

보안 팀에서는 몇 가지 모범 사례를 구현하여 XSS 공격을 방지하고 신속하게 대응할 수 있습니다.

적절한 웹 서버 및 앱 보안 구성을 보장합니다

보안 팀에서는 악의적 스크립트를 차단하고 공격자가 사용자 쿠키를 훔치지 못하도록 웹 서버가 올바르게 구성되어 있는지 확인하기 위해 몇 가지 조치를 취할 수 있습니다.

콘텐츠 보안 정책 구현: 개발자와 보안팀에서는 협력하여 웹 사이트 및 웹 앱에 대한 강력한 콘텐츠 보안 정책(CSP)을 정의하고 해당 정책을 웹 서버에 구현해야 합니다. CSP는 추가 보안 계층으로, 특정 유형의 공격을 감지하고 완화할 수 있습니다. XSS 공격을 방지하기 위해 CSP는 실행할 수 있는 스크립트를 제한합니다. 브라우저가 유해한 스크립트를 로드하지 못하도록 하는 CSP HTTP 응답 헤더를 반환하도록 웹 서버를 구성할 수 있습니다.

보안 쿠키: 보안팀에서는 웹 서버의 쿠키 처리 방법에 대한 특수 규칙을 설정하여 쿠키 도난 가능성을 줄일 수 있습니다. 예를 들어 쿠키를 특정 IP 주소에 연결할 수 있습니다. 대부분의 사용자는 동적 IP 주소를 가지고 있으므로 IP 주소와 쿠키의 연결은 오래 지속되지 않습니다. 따라서 공격자가 해당 쿠키를 훔쳐 사용할 수 없습니다.

또한 보안팀에서는 JavaScript가 쿠키에 액세스하지 못하도록 차단할 수 있습니다. 쿠키를 생성하는 방법 중 하나는 쿠키를 생성할 때 HttpOnly 플래그를 추가하는 것입니다. 이 플래그는 쿠키에 세션 토큰이나 인증 자격 증명 등의 중요한 사용자 정보가 포함되어 있을 수 있음을 나타냅니다. HttpOnly 플래그를 지원하는 브라우저에서는 해당 정보를 공개하지 않습니다.

웹 앱 방화벽 구현

웹 앱 방화벽(WAF)은 XSS 공격에 대한 핵심 방어선을 제공할 수 있습니다. WAF는 웹 앱 앞에 위치한 서버로 운영되는 리버스 프록시 앱은 앱과 인터넷 사이의 HTTP 트래픽을 모니터링하고 필터링하여 해당 앱을 보호합니다. 조직에서는 WAF 규칙을 설정하여 URL에 악의적 스크립트가 있는지 검사하고 이 스크립트가 사용자에게 반영되지 않도록 차단할 수 있습니다. 머신 러닝을 기반으로 하는 WAF 솔루션은 규칙을 우회하려는 시도를 감지하고 알려진 공격의 변형을 식별하여 더욱 강력한 보호 기능을 제공합니다.

피싱 감지 및 대응에 중점을 둠

많은 XSS 공격이 피싱으로 시작되므로 보안팀에서는 피싱 공격에 대한 방어를 강화해야 합니다. 의심스러운 이메일 및 메시지를 식별하는 방법을 사용자에게 교육하는 것 외에도, 보안팀에서는 이메일 스팸을 차단하기 위한 보안 기능을 구현하고, 브라우저 격리 서비스를 사용하며, 맬웨어 실행을 방지하고, 보안 웹 게이트웨이(SWG)를 설치하여 사용자가 맬웨어를 다운로드하지 못하도록 할 수 있습니다. 또한 이메일 보안 도구를 배포하여 실시간으로 피싱 시도를 감지하고 차단할 수 있습니다.

앱에서 보안 테스트 실행

보안팀에서는 프로덕션 환경에서 취약점을 테스트해야 합니다. 보안팀에서는 수동으로 침투 테스트를 실행하거나 자동화된 XSS 스캐너를 사용할 수 있습니다.

사고 대응 계획 구축

광범위한 예방 노력에도 불구하고 조직은 여전히 XSS 공격의 대상이 될 수 있습니다. 신속한 복구를 위해서는 사고 대응 계획을 마련하는 것이 중요합니다. 그 계획에는 웹 앱 활동을 모니터링하고 의심스러운 이벤트가 발생할 때 조치를 취하기 위한 전략이 포함되어야 합니다. 그런 다음 팀에서는 근본 원인을 분석하고 공격 방법을 식별해야 합니다. 공격이 끝나면 얻은 교훈을 적용하여 보안 기능을 강화하고 정책을 업데이트하며 웹 앱의 취약점을 패치해야 합니다.

Cloudflare는 XSS 공격을 방지하는 데 어떻게 도움이 될까요?

Cloudflare에서는 조직과 사용자가 XSS 공격을 방지하는 데 도움이 되는 여러 제품과 기능을 갖추고 있습니다.

  • Cloudflare WAF에서는 XSS 공격, DDoS 공격, SQL 삽입 등 일반적인 위협으로부터 웹 앱을 보호할 수 있습니다
  • Cloudflare Email Security는 XSS 공격을 트리거하는 데 사용될 수 있는 피싱 이메일을 차단하도록 지원합니다
  • Cloudflare 브라우저 격리는 사용자 컴퓨터에서 악의적 스크립트가 실행되지 않도록 합니다
  • Cloudflare CSP는 콘텐츠/코드 삽입, 악의적인 리소스 임베딩, 악의적 iframe 사용(클릭재킹)을 비롯한 XSS 공격을 감지하고 완화하는 데 도움이 될 수 있습니다

Cloudflare WAF에 대해 자세히 알아보세요.