XSS(크로스 사이트 스크립팅)는 웹 페이지에 악성 스크립트를 주입하여 사용자에게 실행되도록 하는 공격입니다. 이로 인해 공격자는 사용자의 세션을 탈취하거나, 브라우저에서 악성 동작을 수행할 수 있습니다. 특히, 사용자가 로그인한 상태라면 공격자는 세션 쿠키를 이용해 사용자 계정에 접근하거나, 민감한 정보를 탈취할 수 있습니다.
XSS 공격은 삽입된 스크립트의 실행 방식에 따라 Stored XSS, Reflected XSS, DOM-based XSS로 나뉩니다
Stored XSS는 악성 스크립트가 서버에 저장되어 다른 사용자들이 해당 스크립트를 실행하게 하는 방식입니다. 예를 들어, 사용자가 입력한 악성 댓글이나 게시글이 데이터베이스에 저장된 후, 다른 사용자들이 해당 페이지를 열 때 스크립트가 실행됩니다.
<script>alert('Your session is hijacked!');</script>
Reflected XSS는 악성 스크립트를 포함한 URL을 통해 즉시 실행되는 방식입니다. 사용자가 조작된 URL을 클릭할 때 스크립트가 실행되며, 주로 이메일 링크나 URL 공유를 통해 이루어집니다.
https://example.com/search?q=<script>alert('Hacked!');</script>
DOM-based XSS는 클라이언트 측에서 DOM(Document Object Model) 조작으로 인해 발생하는 공격입니다. 서버와의 통신 없이 자바스크립트 코드에서 DOM을 조작할 때 발생합니다.
입력 데이터는 반드시 검증하고 필터링해야 합니다. 특히, HTML 태그와 스크립트를 필터링하여 XSS 공격의 가능성을 줄입니다.
// DOMPurify 사용 예시
import DOMPurify from 'dompurify';
const sanitizedInput = DOMPurify.sanitize(userInput);
입력 데이터를 HTML로 렌더링할 때는 반드시 이스케이프(escape) 처리를 하여, 스크립트가 HTML로 해석되지 않도록 합니다.
&로 변환<로 변환>로 변환function escapeHTML(str) {
return str.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
HTML 이스케이프 처리를 통해 악성 스크립트가 실제로는 텍스트로만 표시되게 되어, XSS 공격을 방지할 수 있습니다.
CSP(Content Security Policy)는 브라우저가 특정 스크립트 소스에서만 자바스크립트를 실행하도록 제한하는 보안 기능입니다. 이 설정을 통해 외부 스크립트나 인라인 스크립트가 실행되지 않도록 방지할 수 있습니다.
HttpOnly 쿠키는 자바스크립트에서 쿠키에 접근할 수 없도록 설정하는 옵션입니다. 이를 통해 쿠키에 저장된 세션 ID나 민감한 정보가 XSS 공격을 통해 탈취되지 않도록 보호할 수 있습니다.
React, Angular, Vue와 같은 프론트엔드 프레임워크는 기본적으로 XSS 방지 기능을 제공합니다. 예를 들어, React에서는 JSX가 HTML 이스케이프 처리를 자동으로 수행하여 안전한 출력을 제공합니다.
// React에서 안전한 출력 예시
function UserComment({ comment }) {
return <div>{comment}</div>;
}