Spring Security 공식문서에서 언급되며, 과거 포스팅 에서 간략하게 소개했던 XSS( 사이트 간 스크립팅) 공격에 대해 살펴보자
기본적인 공격루트는 공격자가 악의적인 스크립트를 서버에 저장하면서 발생한다.
일반 유저가 악의적 스크립트를 포함된 데이터를 읽으면서 스크립트가 실행되는 식으로 동작한다.
악의적 스크립트의 유형은 JavaScript나 HTML등 브라우저에서 실행할 수 있는 코드들을 포함한다.
이러한 스크립트의 실행은 공격자가 만들어놓은 악의적인 사이트로 피해자를 redirect 시키거나, 쿠키정보 등 개인정보 유출 등의 작업으로 이어진다.
XSS 공격의 유형은 일반적으로 Reflected/Stored 로 나뉘며, DOM기반 XSS를 포함하면 3가지의 유형으로 구분된다.
- Reflected XSS Attacks
이메일 등의 외부요인을 통해 사용자에게 악의적인 링크 등을 전송, 이를 동작시킴으로써 취약서버로 스크립트를 전송시키는 방식
취약서버에서는 에러메시지 등을통해 전송받은 스크립트를 반환시키게 되고, 사용자의 브라우저에서 스크립트가 실행된다- Stored XSS Attacks
악의적인 스크립트를 취약서버의 DB 등에 저장함으로써, 이를 조회 할때마다 스크립트가 실행되게 하는 방식- DOM Based XSS
피해자 브라우저의 DOM환경을 조작하여 예상치 못한 결과가 발생하게 하는 방식
스크립트가 포함된 링크실행을 유도하여, 서버를 통하지 않고 스크립트를 DOM에 직접 반영시킨다
전체적인 방법은 OWASP 문서를 참고하는걸 추천한다.
간략한 내용만 소개할 예정이다.
일반적인 XSS공격은 스크립트가 서버를 거쳐 다시 브라우저로 돌아오며 동작되는 원리를 이용한다.
따라서, 전송하고 전송된 내용을 점검하는 게 중요하다.
HTML태그( ex: div ) 사이에 입력되는 값 / HTML 속성 값 / HTML에 반영되는 JavaScript 변수 값 / 인라인 CSS 등
스크립트가 삽입될 가능성이 있는 구간들을 모두 점검하고, 특정 문자( <, &, >, " )들을 필터링 및 HTML 엔티티( <, >, &, " )로 변환하여 스크립트 태그나 속성으로 인식되지 않게 해야한다.를 해야한다.
이 외에 보안기능을 제공하는 프레임워크를 사용하거나, CSP 헤더 등을 이용한 보안 등의 방법이 존재한다.
각 방법은 하나가 하나를 대체하는 것이 아닌, 모두를 고려하는게 좋다.