Cross-Site Scripting(XSS)이란?
Cross-Site Scripting(XSS)이란?
교차 사이트 스크립트 XSS는 간단하게 웹에서 악의적인 Javascript를 실행하는 공격이라고 생각하면 이해하기 쉽습니다. 예를 들어 댓글을 남길 수 있는 상황에 댓글에 일반적인 내용이 아니라 악의적인 Javascript 코드를 삽입합니다. 그러면 이 내용이 서버에 저장되고, 다른 사용자들이 댓글을 보기 위해 해당 페이지에 접속하게 되면 이를 화면에서 표시하는 과정에 해당 부분이 문자열로 인식되지 않고 스크립트 코드로 인식되어 실행될 위험이 있습니다.
XSS 공격의 유형
XSS는 크게 세 가지 유형으로 나눌 수 있습니다.
-
- 저장된 XSS (Stored XSS)
-
악성 스크립트가 서버에 저장되어 여러 사용자가 해당 스크립트를 실행하게 됩니다. 예를 들어, 댓글 시스템에 악의적인 코드를 삽입하면, 해당 댓글을 보는 모든 사용자가 코드가 실행됩니다.
-
- 반사형 XSS (Reflected XSS)
-
사용자가 요청한 URL이나 요청 파라미터에 포함된 악성 스크립트가 서버에서 반사되어 웹 페이지에 출력됩니다. 일반적으로 링크 클릭을 통해 특정 URL로 유도하여 발생합니다.
-
- DOM 기반 XSS (DOM-based XSS)
-
클라이언트 측 JavaScript 코드에 의해 발생합니다. 페이지가 로드된 후, JavaScript가 사용자의 입력을 검증하지 않고 DOM에 삽입하게 되어 발생합니다.
XSS 고려해야 하나?
개인적으로 XSS 실습을 위해 댓글을 script 태그로 남기고 이를 그대로 화면에 표현해 해당 스크립트 코드가 실행되게 유도해보았습니다. 이 과정에서 ejs 같은 템플릿 엔진을 사용하기도 하고 react같은 프레임워크를 사용하기도 해보았습니다. 하지만 두 경우 모두 기본적으로 XSS 방지해주는 기능이 포함되어 있어 스크립트 코드를 넣어도 일반적인 문자열로 처리되기 때문에 XSS 공격이 방어됨을 확인했습니다.
물론 일부러 이런 html 태그로 인식될 수 있는 문자를 의미를 가지지 않도록 변환하는 이스케이프 기능을 의도적으로 끌 수도 있습니다. react에서는 dangerouslySetInnerHTML을 사용하거나 ejs에서는 <%- 를 사용합니다. 하지만 일반적으로는 이런 것들을 사용하지 않으므로 XSS를 크게 고려하지 않아도 무방하다고 생각합니다.
하지만 이런 기본적인 방어로만 XSS를 완전히 방어할 수는 없다고 합니다. 이로 인해 보안이 중요한 경우 클라이언트와 서버 측 모두 들어오는 데이터를 철저히 검증하도록 해야하고, 컨텐츠 보안 정책(CSP)을 설정해 외부 스크립트 실행을 제한하는 것도 고려해야합니다.