웹 서비스를 운영하거나 개발할 때 반드시 알아야 하는 보안 개념이 있다. 바로 XSS와 CSRF 공격이다. 이 두 가지는 가장 흔하면서도 위험한 웹 취약점으로, 제대로 이해하지 못하면 사용자 정보 유출이나 계정 탈취 같은 심각한 문제로 이어질 수 있다. 특히 초보자들은 두 공격의 차이를 헷갈리는 경우가 많다. XSS는 사용자를 공격하는 방식이고, CSRF는 사용자를 이용해 서버를 공격하는 방식이라는 점에서 차이가 있다. 이 글에서는 XSS와 CSRF의 개념, 동작 원리, 차이점, 그리고 실제 대응 방법까지 쉽게 이해할 수 있도록 정리한다.
웹 보안 취약점이란 무엇인가
웹 애플리케이션은 사용자 입력을 기반으로 동작하기 때문에 다양한 공격에 노출될 수 있다. 입력값 검증이 제대로 이루어지지 않으면 공격자가 의도한 코드나 요청이 실행될 수 있다.
이러한 취약점을 이용한 대표적인 공격이 XSS와 CSRF이다. 두 공격 모두 사용자의 신뢰를 악용한다는 공통점이 있지만 공격 방식과 목적은 다르다.
XSS란 무엇인가
XSS는 Cross Site Scripting의 약자로, 웹 페이지에 악성 스크립트를 삽입하여 실행시키는 공격이다.
공격자는 입력 폼이나 URL을 통해 악성 코드를 삽입하고, 이를 다른 사용자가 보게 되면 해당 코드가 브라우저에서 실행된다. 이 과정에서 쿠키 탈취, 세션 탈취, 사용자 정보 유출 등이 발생할 수 있다.
즉, XSS는 사용자의 브라우저를 공격하는 방식이다.
XSS의 동작 원리
XSS는 다음과 같은 과정으로 이루어진다.
공격자가 웹사이트 입력 창에 악성 스크립트를 삽입한다.
이 스크립트가 서버에 저장되거나 그대로 반영된다.
다른 사용자가 해당 페이지를 방문한다.
브라우저에서 악성 스크립트가 실행된다.
이때 브라우저는 해당 스크립트를 정상 코드로 인식하기 때문에 별도의 경고 없이 실행된다.
XSS의 종류
XSS는 크게 세 가지 유형으로 나뉜다.
저장형 XSS는 서버에 악성 코드가 저장되어 지속적으로 실행된다.
반사형 XSS는 요청에 포함된 코드가 즉시 반영되어 실행된다.
DOM 기반 XSS는 클라이언트 측 스크립트에서 발생한다.
각 유형은 공격 방식과 발생 위치가 다르다.
CSRF란 무엇인가
CSRF는 Cross Site Request Forgery의 약자로, 사용자의 인증 정보를 이용하여 원치 않는 요청을 서버에 보내는 공격이다.
공격자는 사용자가 로그인된 상태를 이용하여 특정 요청을 자동으로 실행하도록 유도한다. 예를 들어 사용자가 모르는 사이에 계정 정보가 변경되거나 송금이 이루어질 수 있다.
즉, CSRF는 사용자를 통해 서버를 공격하는 방식이다.
CSRF의 동작 원리
CSRF는 다음과 같은 과정으로 이루어진다.
사용자가 정상적으로 웹사이트에 로그인한다.
공격자는 악성 요청이 포함된 페이지를 만든다.
사용자가 해당 페이지를 방문한다.
브라우저가 자동으로 요청을 서버에 전송한다.
이때 서버는 요청이 정상 사용자로부터 온 것으로 판단하기 때문에 공격이 성공한다.
XSS와 CSRF의 핵심 차이
두 공격의 차이는 다음과 같이 정리할 수 있다.
XSS는 악성 스크립트를 실행하여 사용자 브라우저를 공격한다.
CSRF는 사용자의 인증 상태를 이용해 서버에 요청을 보낸다.
즉, XSS는 “코드 실행” 공격이고 CSRF는 “요청 위조” 공격이다.
XSS 대응 방법
XSS를 방지하기 위해서는 입력값 검증과 출력 시 이스케이프 처리가 중요하다.
사용자 입력을 그대로 출력하지 않는다.
HTML 태그를 이스케이프 처리한다.
스크립트 실행을 제한한다.
또한 Content Security Policy를 설정하면 보안을 강화할 수 있다.
CSRF 대응 방법
CSRF를 방지하기 위해서는 요청의 신뢰성을 검증해야 한다.
CSRF 토큰을 사용하여 요청을 검증한다.
SameSite 쿠키 옵션을 설정한다.
Referer나 Origin을 확인한다.
이러한 방법을 통해 외부에서 발생한 요청을 차단할 수 있다.
실무에서의 중요성
XSS와 CSRF는 실제 서비스에서 매우 자주 발생하는 취약점이다. 특히 사용자 입력을 많이 받는 서비스일수록 위험성이 높다.
보안 사고의 상당수가 이러한 기본적인 취약점에서 발생한다는 점에서 반드시 이해하고 대응해야 한다.
자주 발생하는 실수
개발 과정에서 다음과 같은 실수가 자주 발생한다.
입력값 검증을 하지 않는 경우
출력 시 필터링을 생략하는 경우
CSRF 토큰을 구현하지 않는 경우
이러한 실수는 보안 취약점으로 이어진다.
보안 강화 전략
웹 보안을 강화하기 위해서는 다음과 같은 전략이 필요하다.
입력과 출력 모두 검증한다.
최소 권한 원칙을 적용한다.
정기적으로 보안 점검을 수행한다.
이러한 기본 원칙을 지키는 것이 중요하다.
마무리
XSS와 CSRF는 웹 보안에서 가장 기본이 되는 공격 유형이다. 두 공격 모두 사용자 신뢰를 악용하지만 방식과 대상이 다르다.
핵심은 다음과 같다.
XSS는 브라우저에서 악성 코드를 실행하는 공격이고
CSRF는 사용자의 인증을 이용해 요청을 위조하는 공격이다.
이 두 개념을 정확히 이해하면 웹 보안의 기본을 탄탄하게 다질 수 있다. 실제로 다양한 웹 서비스에서 입력값 처리와 요청 검증을 분석해보면 이론이 어떻게 적용되는지 확인할 수 있다.