블로그

코더들의 보안 정복: 공유와 학습 - 사이트 간 스크립팅(XSS)

September 25, 2024
자프 카란 싱

교차 사이트 스크립팅(XSS)은 2000년대 초반부터 보안 전문가들을 괴롭혀 온 골칫거리이며, 안타깝게도 수십 년이 지난 지금도 가장 흔한 코드 수준의 위협 중 하나로 꼽힙니다. 이러한 소프트웨어 취약점은 너무나 오랫동안 우리를 괴롭혀 왔으며, 최근 CISA가 'Secure-by-Design(설계부터 보안)' 운동의 일환으로 발표한 경고는 이를 완전히 근절하려는 움직임을 보여줍니다. 그들은 대규모로 취약점 유형을 제거하려는 전 세계적인 임무를 수행 중이며, 개발자 중심의 보안에 주목하는 이러한 노력은 실질적인 변화를 이끌어낼 수 있습니다. 하지만 이를 위해서는 개발자가 보안을 성공적으로 구현할 수 있는 환경을 조성하는 스마트한 기업들의 헌신이 필요합니다.

그렇다면 XSS란 정확히 무엇일까요?

웹 브라우저는 온라인상의 방대한 정보에 접근하는 관문이지만, 안타깝게도 모든 것이 긍정적인 것만은 아닙니다. 웹 브라우저의 고유한 동작 방식이 보안 취약점의 촉매제가 될 수 있기 때문입니다. 브라우저는 초기부터 마크업을 신뢰하고 질문 없이 실행하는 특성을 가지고 있었습니다. 이러한 기능이 악의적인 목적으로 악용되기 전까지는 아무런 문제가 없었지만, 공격자들은 결국 이러한 경향을 이용해 자신의 사악한 목적을 달성하는 방법을 찾아냈습니다.

교차 사이트 스크립팅은 브라우저에 대한 신뢰와 사용자의 부주의를 악용하여 데이터를 탈취하고, 계정을 장악하며, 웹사이트를 변조합니다. 이는 매우 심각한 피해를 빠르게 초래할 수 있는 취약점입니다.

XSS의 작동 원리와 발생 가능한 피해, 그리고 예방 방법에 대해 살펴보겠습니다:

XSS는 어떻게 작동할까요?

XSS는 신뢰할 수 없는 입력값(주로 데이터)이 페이지의 출력값으로 렌더링될 때, 실행 가능한 코드로 잘못 해석되면서 발생합니다. 공격자는 입력 매개변수에 악성 실행 코드(HTML 태그, JavaScript 등)를 삽입할 수 있으며, 이 코드가 브라우저로 반환되면 데이터로 표시되는 대신 실행되어 버립니다.

앞서 언급했듯이, 이 취약점은 데이터와 실행 코드를 구분하기 어려운 브라우저의 핵심 동작 방식 때문에 나타났습니다. 웹의 운영 모델은 다음과 같습니다:

  1. 사용자가 웹 페이지를 방문합니다.
  2. 페이지는 브라우저에 로드할 파일과 실행할 내용을 지시합니다.
  3. 브라우저는 페이지에 있는 내용을 질문 없이 그대로 실행합니다.

이러한 기능 덕분에 우리는 웹에서 놀랍고 상호작용이 뛰어난 경험을 누릴 수 있게 되었습니다. 하지만 그 이면에는 비용이 많이 드는 악용 사례와 취약점이라는 동전의 양면이 존재합니다.

공격자가 취약한 사이트에 악성 스크립트를 추가하면, 브라우저는 이를 의심 없이 실행합니다. 심층적인 조사나 탐지 조치가 마련되어 있지 않기 때문입니다.

Custom javascript code could be executed in the browsers of your users

XSS에는 세 가지 유형이 있습니다:

  • 저장형 XSS
  • 반사형 XSS
  • DOM 기반 XSS

저장형 XSS는 공격자가 애플리케이션의 데이터 필드(예: 사용자의 휴대전화 번호를 저장하는 필드)에 악성 스크립트를 영구적으로 저장할 수 있을 때 발생합니다. 이 위험한 스크립트는 해당 데이터 필드가 애플리케이션에 표시될 때마다 사용자의 브라우저로 전송됩니다.

이러한 유형의 공격은 포럼 사이트나 댓글 엔진에서 자주 볼 수 있습니다. 공격자가 댓글에 악성 스크립트를 입력하면, 해당 댓글을 보는 모든 사용자가 자신도 모르게 스크립트를 실행하게 됩니다.

반사형 XSS는 사용자 입력값이 그대로 사용자의 브라우저로 반사될 때 발생합니다. 예를 들어, 검색 결과를 가져오는 동안 사용자에게 "검색하신 결과는..."이라고 표시하는 검색창을 들 수 있습니다.

이제 검색 기능이 검색어를 URL의 쿼리 매개변수로 배치하여 작동한다고 가정해 봅시다. 악의적인 공격자는 동일한 매개변수에 악성 스크립트를 포함한 링크를 피해자에게 보낼 수 있으며, 사실 대부분의 웹 사용자는 이를 거의 알아차리지 못할 것입니다.

피해자가 링크를 클릭하면 피싱 사이트로 리디렉션되고, 자신도 모르게 해당 사이트의 비밀번호를 입력하게 됩니다. 그들은 공격자가 방금 자신의 계정 열쇠를 훔쳐갔다는 사실을 전혀 깨닫지 못합니다.

DOM 기반 XSS는 비교적 새로운 유형의 취약점입니다. 이는 Angular나 React와 같은 많은 UI 프레임워크에서 발견되는 복잡한 템플릿 구조를 악용합니다.

이러한 템플릿은 동적 콘텐츠와 풍부한 UI 애플리케이션을 가능하게 하지만, 잘못 사용하면 XSS 공격을 실행하는 데 악용될 수 있습니다.

이제 XSS의 범위를 대략적으로 이해하셨을 것입니다. 그렇다면 이것이 어떻게 파괴적으로 사용될 수 있는지 더 자세히 알아보겠습니다.

XSS가 위험한 이유는 무엇일까요?

XSS는 사용자를 악성 사이트로 리디렉션하거나, 쿠키를 훔치고 세션 데이터를 노리는 데 사용될 수 있습니다. 기본적으로 JavaScript가 할 수 있는 모든 일을 XSS 공격도 수행할 수 있습니다.

다음은 세 가지 XSS 공격 사례입니다:

  1. Yahoo 이메일 사용자들은 세션 쿠키를 탈취당했습니다 2015년 XSS를 통해 말이죠.
  2. Samy 웜은 MySpace의 XSS 취약점을 통해 유포되었습니다. 이는 단 20시간 만에 100만 명의 사용자에게 영향을 미친, 역사상 가장 빠르게 확산된 악성 코드입니다.
  3. eBay는 제품 설명에 악성 스크립트가 포함되는 것을 허용했습니다. 이는 eBay 사용자를 대상으로 한 XSS 공격으로 이어졌습니다.

XSS 공격은 단순해 보이지만 매우 심각합니다. 세션, 사용자 자격 증명 또는 민감한 데이터의 탈취로 이어질 수 있습니다. 평판 하락과 수익 감소는 이러한 공격의 주요 피해입니다. 단순히 웹사이트를 변조하는 것만으로도 기업에 바람직하지 않은 결과를 초래할 수 있습니다.

하지만 XSS는 당신과 같은 노련한 보안 전문가에 의해 충분히 막을 수 있습니다. 해결책은 복잡하지 않으며, XSS가 흔한 공격 수단이 된 이후 업계는 비약적인 발전을 이루었습니다.

당신은 XSS를 막을 수 있습니다.

XSS를 막는 핵심은 컨텍스트를 이해하는 것입니다. 구체적으로는 사용자 입력값이 클라이언트로 다시 렌더링되는 컨텍스트와 그 위치(HTML 코드 내부인지, JavaScript 스니펫 내부인지)를 파악해야 합니다.

사용자 입력값을 브라우저로 다시 보낼 필요가 없다면 가장 좋겠지만, 보내야 한다면 HTML 인코딩을 하는 것이 좋습니다. 출력값을 HTML 인코딩하면 브라우저가 콘텐츠를 실행하지 않고 그대로 표시하도록 지시할 수 있습니다.

입력값 검증 또한 중요합니다. 하지만 검증과 화이트리스트 방식만으로는 완벽한 해결책이 될 수 없습니다. 인코딩은 한 단계 더 나아가 브라우저가 악성 스크립트를 실행하지 못하도록 차단합니다. 검증 및 화이트리스트 전략으로 걸러지지 않은 것들도 인코딩을 통해 처리할 수 있습니다.

많은 프레임워크가 이제 HTML 출력값을 자동으로 인코딩합니다.
Angular, ASP.NET MVC, 그리고 React.js는 기본적으로 HTML 인코딩을 사용하는 프레임워크입니다. 이러한 프레임워크에서 인코딩을 하지 않으려면 특별한 메서드를 호출하여 명시적으로 지시해야 합니다.

다른 대부분의 프레임워크(예: Django 및 Spring)에는 코드에 쉽게 통합할 수 있는 표준 XSS 방지 라이브러리가 있습니다.

가장 큰 과제는 사용자 입력값이 시스템에 들어올 수 있는 모든 경로를 분석하는 법을 익혀 항상 경계하는 것입니다. 쿼리 매개변수뿐만 아니라 POST 매개변수도 공격 경로가 될 수 있습니다. 애플리케이션 전체에서 데이터 흐름을 추적하고 외부에서 들어오는 데이터는 무엇이든 신뢰하지 마세요.

국경 수비대처럼 생각하세요. 모든 데이터를 멈춰 세우고 검사하며, 악의적으로 보이면 허용하지 마세요. 그런 다음 렌더링 시 인코딩을 수행하여 놓친 악성 요소가 문제를 일으키지 않도록 하세요.

이러한 전략을 실행하면 사용자를 XSS 공격으로부터 안전하게 보호할 수 있습니다. 더 많은 팁을 얻으려면 OWASP 치트 시트를 확인해 보세요.

XSS를 차단하고 보안 역량을 한 단계 높이세요.

XSS는 OWASP Top 10 2017 웹 보안 위험 목록에서 7위를 차지했습니다. 오랫동안 존재해 온 위협이지만, 주의하지 않으면 여전히 애플리케이션에 나타나 문제를 일으킬 수 있습니다.

개발자가 코드를 작성할 때 보안 우선 사고방식을 갖추도록 하는 교육은 매우 중요합니다. 이러한 교육은 개발자가 실제로 사용하는 언어로 실제 애플리케이션을 시뮬레이션할 때 가장 효과적입니다. 이를 염두에 두고, XSS에 대해 더 자세히 알아보려면 학습 리소스를 확인해 보는 것은 어떨까요? 그 후, 숙련도를 높이기 위한 교육과 실습을 시작할 수 있습니다.

지금 바로 XSS 취약점을 찾아 해결할 준비가 되셨나요? Secure Code Warrior 플랫폼에서 도전해 보세요.

태그라인

배포 전 AI 기반 개발 거버넌스 확보

AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.

데모 예약하기
리소스 라이브러리

더 많은 블로그 살펴보기

보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.

전체 보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

하나의 보안 문화: Sage는 어떻게 챔피언 프로그램을 구축했는가

Sage가 유연하고 관계 중심적인 접근 방식을 통해 보안을 강화하고, 200명 이상의 보안 챔피언을 양성하며 실질적인 위험 감소를 달성한 사례를 확인해 보세요.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

2026년 사이버 보안 인식의 달: 기업 방어의 핵심, AI 보안 이해하기

주요 AI 기업 대부분이 안전 가이드라인이 마련될 때까지 AI 개발 속도를 전 세계적으로 늦춰야 한다고 공개적으로 촉구하는 시점에 이르렀지만, 사실 심각한 보안 문제는 이미 현실화되었습니다. 이로 인해 AI 도입에 따른 금전적 비용과 위험 부담이 계속 쌓이면서 수많은 보안 책임자와 경영진이 절박한 상황에 놓였습니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

인에이블러 8: 프로그램 브랜딩

성공적인 보안 코딩 프로그램을 위해서는 훌륭한 콘텐츠 그 이상의 것이 필요합니다. 인에이블러 8에서는 브랜딩을 통해 참여를 누구나 선망하는 위상 중심의 경험으로 바꾸는 방법을 알아봅니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

이제 모든 직원이 AI 사이버 보안의 최전선에 있습니다

엔터프라이즈 기술 환경은 너무 늦기 전까지는 아무도 예상하지 못한 속도로 변화하고 있습니다. 우리는 공식적으로 사람이 직접 작성한 코드와 기본적인 코파일럿 지원의 시대를 지나 '에이전트 기반 개발 수명 주기(ADLC)'의 시대로 진입했습니다. 자율형 AI 에이전트는 여러 기능 전반에 걸쳐 전례 없는 효율성을 약속하지만, 동시에 완전히 새로운 차원의 보안 및 규제 위험을 야기합니다.

더 알아보기

배포 전 AI 기반 개발 보안 확보

소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.

데모 예약하기
항목이 없습니다.