XSS란 무엇인가요? 왜 브라우저가 실행되지 말아야 할 콘텐츠를 실행하나요?

웹사이트는 매일 사용자 입력을 처리합니다. 댓글, 사용자 이름, 검색 키워드, 제품 리뷰 및 개인 프로필 등이 이에 해당합니다. 이러한 데이터는 일반적으로 데이터베이스에 저장되거나 URL 매개변수를 통해 브라우저로 다시 전달됩니다. 만약 웹사이트가 신뢰할 수 없는 콘텐츠를 적절히 처리하지 않으면, 브라우저는 원래 표시되어야 할 텍스트를 HTML, 자바스크립트 또는 다른 실행 가능한 콘텐츠로 간주할 수 있습니다. 이 문제를 XSS, 즉 크로스사이트 스크립팅이라고 부릅니다. 이 공격의 핵심은 여러 웹사이트를 넘는 것이 아니라, 악성 콘텐츠가 희생자가 신뢰하는 웹사이트의 콘텐츠 내에서 실행되도록 만드는 것입니다. 사용자가 특정 웹사이트에 로그인한 상태에서의 위험은 화면 수정, 사용자 행동 유도, 민감한 데이터 열람, 계정 활동 영향 등을 포함할 수 있습니다. XSS의 원인은 일반적으로 브라우저의 갑작스런 오류가 아니라, 웹사이트가 데이터와 실행 가능한 콘텐츠를 명확하게 분리하지 않기 때문입니다. OWASP는 웹사이트가 데이터를 최종적으로 삽입하게 될 상황에 따라 처리하도록 권장합니다. HTML 텍스트, HTML 속성, 자바스크립트, CSS 또는 URL과 같은 각 상황마다 서로 다른 방어 방식이 필요합니다.

Reflected XSS, Stored XSS, DOM 기반 XSS의 차이는 무엇인가요?

Reflected XSS는 보통 웹사이트가 요청받은 내용을 즉시 페이지로 반환할 때 발생합니다. 예를 들어, 검색 결과 페이지가 URL에 포함된 키워드를 직접 표시하되 적절한 처리를 하지 않는 경우입니다. 사용자는 악성 콘텐츠가 포함된 링크를 통해 웹사이트로 유도될 수 있으므로 웹사이트 관리자는 URL 매개변수와 검색 바, 오류 페이지의 출력 방식을 확인해야 합니다. Stored XSS는 웹사이트가 신뢰할 수 없는 콘텐츠를 먼저 저장한 뒤 이후 다른 사용자에게 표시하는 경우를 말합니다. 댓글 영역, 제품 리뷰, 포럼 글 및 개인 프로필 등이 확인이 필요한 위치가 됩니다. 이 공격의 영향은 단순한 반사보다 더 클 수 있습니다. 콘텐츠가 저장된 이후, 해당 페이지를 조회하는 다른 사용자에게도 문제 내용이 노출될 수 있기 때문입니다. DOM 기반 XSS는 주로 클라이언트 측 자바스크립트가 페이지 데이터를 처리할 때 발생합니다. 서버에서 콘텐츠를 직접 반환하지 않는 경우에도, 클라이언트 측 프로그램이 URL, 브라우저 저장 데이터 또는 다른 신뢰할 수 없는 콘텐츠를 위험한 DOM 작업에 전달할 수 있습니다. 웹 개발자는 서버 측뿐 아니라, 클라이언트 측 데이터 흐름 및 자바스크립트 API 사용 방식을 점검해야 합니다. 세 가지의 차이점을 간단히 보면, Reflected XSS는 요청 후 즉시 응답되는 경우이고, Stored XSS는 먼저 저장된 후, DOM 기반 XSS는 클라이언트 측에서 데이터를 처리할 때 발생합니다. 세 가지 유형의 수정 방향은 다를 수 있지만, 공통 원칙은 신뢰할 수 없는 콘텐츠가 실행 가능한 코드로 간주되지 않도록 해야 한다는 것입니다.

웹사이트는 출력 인코딩을 통해 XSS를 어떻게 차단하나요?

XSS를 방어하는 핵심은 단순히 특정 기호 몇 가지를 삭제하는 것이 아니라, 출력 위치에 따라 맥락에 맞게 인코딩하는 것입니다. HTML 텍스트에 포함된 데이터와 HTML 속성, 자바스크립트 문자열, CSS 또는 URL에 포함된 데이터는 각각 다른 보안 처리가 필요합니다. 잘못된 인코딩 방식을 사용하면, 웹사이트는 겉으로 검열이 이루어진 것처럼 보이지만 실제로는 여전히 위험이 존재할 수 있습니다. 웹사이트 관리자는 먼저 각 입력 및 출력 위치를 정리해야 합니다:

  1. 댓글, 검색, 사용자 이름, 개인 데이터, URL 매개변수 및 API 응답 등 신뢰할 수 없는 출처를 나열합니다.
  2. 각 데이터가 최종적으로 HTML, 속성, 자바스크립트, CSS, URL 또는 DOM 작업의 어느 상황에 삽입될지 확인합니다.
  3. 프레임워크나 보안 라이브러리에서 제공하는 자동 출력 인코딩을 사용하고, 불완전한 필터 규칙을 스스로 작성하지 않습니다.
  4. 제품이 일부 HTML을 허용해야 하는 경우, 신뢰할 수 있는 정리 함수 라이브러리를 사용하고 사용 가능한 태그와 속성을 제한합니다.
  5. 수정 후 승인된 테스트 환경에서 정상 텍스트, 특수 기호 및 다른 언어 콘텐츠가 올바르게 표시되는지 확인합니다.

클라이언트 측 프로그램에서 개발자는 먼저 콘텐츠를 순수 텍스트로 처리할 수 있는 안전한 API를 사용해야 하며, 신뢰할 수 없는 데이터를 위험한 HTML이나 스크립트 실행 위치에 직접 삽입해서는 안됩니다. OWASP의 크로스사이트 스크립팅 방지 요령은 출력 상황에 따라 방어 방식을 선택하는 완전한 원칙을 제공합니다. 입력 검증은 여전히 가치가 있지만, 출력 인코딩을 대체할 수는 없습니다. 검증은 사용자의 이름 길이, URL이 허용된 형식에 맞는지 또는 정렬 필드가 고정 목록에 있는지를 제한하는 데 적합하지만, 모든 XSS를 차단하는 유일한 방어선으로 여겨져서는 안 됩니다.

CSP, 쿠키 및 보안 헤더는 무엇을 할 수 있나요?

Content Security Policy, 즉 CSP는 HTTP 헤더를 통해 브라우저에 어떤 출처가 스크립트, 이미지, 스타일 및 기타 자원을 로드할 수 있는지를 알려줍니다. 합리적인 CSP는 부분적으로 XSS의 영향을 줄일 수 있으며, 웹사이트가 위반된 자원 로드를 감지하는 데도 도움이 됩니다. 하지만 CSP는 추가 방어선이며 보안 출력 인코딩과 코드 수정을 대체할 수는 없습니다. 웹사이트는 먼저 테스트 환경에서 보고 모드를 사용하여 어떤 자원이 정책에 의해 차단되는지 관찰한 뒤, 점진적으로 허용 출처를 제한해야 합니다. CSP를 설정할 때는 모든 기능을 빠르게 복원하기 위해 모든 출처를 허용하거나 스크립트 제한을 완화해서는 안 됩니다. MDN의 콘텐츠 보안 정책 가이드는 헤더와 자원 제한을 이해하는 데 참고할 수 있습니다. 쿠키는 데이터의 민감성에 따라 보안 속성을 설정해야 합니다. HttpOnly는 클라이언트 측 스크립트가 쿠키를 직접 읽을 수 있는 기회를 줄이며, Secure는 쿠키가 HTTPS를 통해 전송되도록 요구하고, SameSite는 일부 교차 사이트 요청 상황을 제한할 수 있습니다. 이러한 설정은 XSS 자체를 수정할 수는 없지만, 취약점이 발생했을 때 영향을 줄일 수 있습니다. 웹사이트는 또한 적절한 HTTPS, 권한 제어, 오류 메시지, 로그 및 모니터링을 설정해야 합니다. 보안 팀은 비정상적인 입력 오류, 의심스러운 페이지 수정, CSP 위반 보고 및 비정상적인 계정 행동을 관찰할 수 있습니다. 문제가 발견되면 최소한 필요한 정보를 저장한 뒤, 취약점 보고 절차에 따라 처리해야 하며, 공개 페이지에 민감한 데이터나 직접 악용될 수 있는 콘텐츠를 게시해서는 안 됩니다.

웹사이트에 XSS 위험이 있는지 합법적으로 테스트하려면 어떻게 해야 하나요?

테스트를 시작하기 전에 범위, 시간, 허용되는 도구 및 데이터 처리 방법을 확인해야 합니다. 가장 안전한 학습 출입구는 PortSwigger 웹 보안 아카데미의 XSS 과정이나 자신의 로컬 프로젝트, 테스트 서버 및 의도적으로 설계된 테스트 환경에서 연습하는 것입니다. 이러한 환경은 학습자가 취약점의 원인을 이해할 수 있도록 하며, 테스트의 영향을 낯선 웹사이트로 확장하지 않을 수 있습니다. 방어 테스트는 다음 순서로 진행될 수 있습니다. 먼저 입력 지점을 점검한 뒤, 출력 상황을 확인합니다. 그런 다음 프레임워크가 자동으로 인코딩하는지, 클라이언트가 안전한 DOM API를 사용하는지, CSP가 정상 작동하는지 및 쿠키가 적절한 속성을 사용할 수 있는지를 검토합니다. 테스트 중 가상의 계정과 비민감 데이터를 사용하고, 완료 후 테스트 콘텐츠를 정리하며 수정 전과 후의 결과를 저장해야 합니다. 인터넷에서 찾은 XSS 테스트 문자열을 실제 웹사이트에 직접 붙여넣거나 쿠키 읽기, 계정 조작 또는 권한 우회 테스트를 하지 마십시오. 본 문서의 해커는 보안 연구자 또는 사이버 보안 기술자를 지칭할 수 있습니다. 무단으로 웹사이트를 수정하거나 데이터를 훔치거나 계정을 탈취하는 사람은 공격자나 범죄자가 됩니다. 웹사이트 소유자인 경우, VexelOps는 웹사이트 보안 점검, XSS 위험 이해 및 합법적인 테스트 계획 수립을 지원할 수 있습니다. 취약점이 발견되면, 근본 원인을 최우선으로 수정하고 민감한 데이터가 노출되었는지도 확인해야 합니다. 화면 삭제, 단일 출처 차단 또는 블랙리스트 규칙 추가에만 의존해서는 안 됩니다.

브라우저가 신뢰할 수 없는 스크립트를 차단하는 보안 정책

XSS 크로스사이트 스크립팅 공격에 대한 자주 묻는 질문들

XSS는 웹사이트의 모든 사용자 비밀번호를 직접적으로 훔치나요?

반드시 그렇지는 않습니다. XSS의 실제 영향은 취약점이 있는 페이지, 사용자 권한, 쿠키 설정, CSP, 클라이언트 기능 및 웹사이트 데이터 구조에 따라 다릅니다. 일부 XSS는 특정 페이지의 표시만 수정할 수 있고, 일부는 사용자 작업에 영향을 주거나 페이지에서 스크립트로 읽을 수 있는 데이터를 노출할 수 있습니다. XSS라는 단어가 보인다고 해서 모든 계정이 손실된 것으로 단정짓지 마세요. 웹사이트 관리자는 먼저 취약점 유형과 영향을 받는 범위를 확인한 후 로그, 로그인 활동, CSP 보고 및 민감한 기능을 점검해야 합니다. 수정을 할 때는 출력 상황, 위험한 DOM API 및 권한 설계에 집중해야 하며, 단순히 의심스러운 콘텐츠를 삭제하거나 URL 하나를 차단해서는 안 됩니다.

CSP를 사용하면 XSS를 완전히 방지할 수 있나요?

그렇지 않습니다. CSP는 영향 감소를 위한 브라우저 방어선이며, 정책이 너무 느슨하게 설정되거나 신뢰할 수 없는 스크립트 출처를 허용하거나 웹사이트 자체에서 여전히 위험한 출력 위치에 입력을 삽입할 경우 위험은 여전히 존재합니다. 여러 브라우저, 서드파티 자원 및 웹사이트 기능도 정책 효과에 영향을 미칠 수 있습니다. 보다 완전한 접근 방법은 CSP를 상황별 출력 인코딩, HTML 공유, 안전한 DOM API, HttpOnly 쿠키, 코드 검토 및 테스트 환경 검증과 함께 사용하는 것입니다. CSP는 먼저 보고 모드로 관찰한 후, 웹사이트에서 실제 자원에 따라 점진적으로 제한해야 하며 이를 유일한 수정 방법으로 간주해서는 안 됩니다.

일반 사용자가 의심스러운 팝업이나 웹 페이지 콘텐츠를 보았을 때는 어떻게 해야 할까요?

먼저 비밀번호, 인증 코드 또는 신용카드 정보를 입력하지 말고, 팝업에서 요청하는 파일 다운로드나 낯선 확장 기능 설치를 따르지 마십시오. 의심스러운 페이지를 닫고, 자주 사용하는 공식 웹사이트 주소를 직접 입력하여 서비스에 재접속 하세요. 만약 전에 계정 정보를 입력했다면, 즉시 안전한 장치에서 비밀번호를 수정하고 로그인 활동을 확인해야 합니다. 사이트 취약점이나 피싱 페이지로 의심되는 경우, URL, 시간 및 화면을 저장하되 개인 정보를 공개하거나 의심스러운 링크를 전파하지 마십시오. 웹사이트 공식 보안 보고 경로를 통해 소유자에게 알릴 수 있으며, 계정 손실이나 개인 정보 유출이 관련된 경우 해당 플랫폼과 지역 관련 기관에도 연락해야 합니다.

중요 요점: 출력 인코딩과 CSP는 XSS 방어의 핵심입니다.