XSS와 CSRF는 모두 사용자의 인증 상태를 악용할 수 있지만, 공격 방식이 다릅니다.
XSS는 공격자가 웹페이지에 악성 스크립트를 삽입하고, 해당 페이지를 방문한 사용자의 브라우저에서 실행되게 하는 공격입니다. 이를 통해 쿠키나 토큰 같은 정보를 탈취하거나, 화면을 변조하거나, 사용자의 권한으로 요청을 보낼 수 있습니다.
반면 CSRF는 악성 사이트나 링크를 통해 인증된 사용자의 브라우저가 사용자의 의도와 무관한 요청을 대상 서버에 보내도록 만드는 공격입니다. 브라우저가 쿠키와 같은 인증 정보를 요청에 자동으로 포함한다는 점을 이용합니다.
따라서 XSS는 신뢰하는 웹사이트에서 악성 스크립트가 실행되는 문제이고, CSRF는 서버가 인증된 요청과 사용자가 의도한 요청을 구분하지 못하는 문제입니다.
CSRF와 XSS는 각각 어떻게 방어하나요?
CSRF는 CSRF Token 검증,
SameSite쿠키, Origin 또는 Referer 검증으로 방어합니다. XSS는 출력 컨텍스트에 맞는 이스케이프, 안전한 DOM API 사용, 입력값 검증과 HTML 정화, CSP 적용 등으로 악성 스크립트가 실행되지 않도록 방어합니다.
Authorization 헤더를 사용하는 API도 CSRF 공격에 취약한가요?
브라우저가 토큰을 자동으로 첨부하지 않고 애플리케이션이 명시적으로 Authorization 헤더에 넣는다면 일반적인 CSRF 공격 위험은 낮습니다. 반면 인증 정보를 쿠키로 전달하면 브라우저가 교차 사이트 요청에도 자동으로 쿠키를 보낼 수 있으므로 CSRF 방어가 필요합니다.
XSS가 발생하면 CSRF 방어도 무력화될 수 있나요?
그럴 수 있습니다. 악성 스크립트가 정상 페이지의 출처에서 실행되면 DOM에서 CSRF Token을 읽거나 정상 코드와 같은 방식으로 요청을 보낼 수 있습니다. HttpOnly 쿠키는 쿠키 값의 직접 탈취는 막지만, 실행 중인 스크립트가 사용자의 권한으로 요청하는 것까지 막지는 못합니다.