크로스 사이트 스크립트 (XSS)
크로스 사이트 스크립트(XSS, Cross-Site Scripting)는 공격자가 웹 사이트에 몰래 심어 둔 악성 스크립트가 다른 사용자의 브라우저에서 실행되는 취약점입니다. 웹 사이트가 사용자가 입력한 글이나 검색어를 확인하지 않고 그대로 화면에 보여줄 때 생깁니다. 예를 들어, 공격자가 게시판 글에 평범한 문장 대신 스크립트 코드를 넣어 둘 수 있습니다. 그러면 그 글을 연 다른 사용자의 브라우저는 이 코드를 프로그램으로 인식하고 실행합니다.
XSS는 악성 스크립트가 전달되는 방식에 따라 나뉩니다.
– 저장형(Stored) XSS: 스크립트가 게시글처럼 서버에 저장되었다가, 그 글을 조회하는 사용자에게 전달되는 방식입니다.
– 반사형(Reflected) XSS: 공격자가 만든 링크를 클릭하면, 링크에 담긴 입력값이 바로 화면에 반영되는 방식입니다.
– DOM 기반(DOM-based) XSS: 서버를 거치지 않고 브라우저 안에서만 처리되는 방식입니다.
공격이 성공하면 공격자는 사용자의 로그인 정보를 빼내 계정을 도용할 수 있습니다. 진짜 사이트처럼 보이는 가짜 화면을 띄워 개인정보를 입력하게 만들 수도 있습니다. 사용자 모르게 그 사용자의 권한으로 글을 쓰거나 설정을 바꿀 수도 있습니다.
XSS를 막는 가장 중요한 방법은 사용자가 입력한 내용을 화면에 보여줄 때 코드가 아닌 글자로만 표시되도록 이스케이핑 등을 통해 변환하는 것입니다. 이를 출력 인코딩(Output Encoding)이라고 합니다. 입력값이 표시되는 위치(HTML, JavaScript, CSS, URL 등)마다 알맞은 변환 방법이 다릅니다. HTML을 직접 넣어야 한다면 신뢰할 수 있는 검증(Sanitization) 라이브러리를 사용해야 합니다. 콘텐츠 보안 정책(CSP)을 함께 적용하면 공격을 당하더라도 피해를 줄일 수 있습니다.
대표 사례는 다음과 같습니다. 2023년 러시아 연계 해킹 조직이 웹메일 Roundcube와 Zimbra의 XSS 취약점을 이용해, 메일을 열기만 해도 유럽 등 각국 정부 기관의 이메일이 탈취되는 사건이 발생했습니다.

