XSS는 Cross-Site Scripting로 웹 페이지에 악성 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행되도록 하는 공격이다. 즉, 신뢰된 웹사이트를 통해 사용자의 브라우저를 공격한다.
XSS를 방어하는 방법은 여러 가지가 있지만, 출력 시점에서의 처리를 통해 방어할 수 있다.
Output Encoding
입력값을 그대로 출력하지 않고 인코딩하여 출력하는 방법이다.
< → <
> → >
HttpOnly 쿠키
쿠키에 HttpOnly 옵션을 설정하면 JavaScript에서 쿠키에 접근할 수 없다.
Set-Cookie: JSESSIONID=xxx; HttpOnly
이를 통해 document.cookie 기반 세션 탈취를 막을 수 있다. HttpOnly는 XSS 자체를 막는 것이 아니라 쿠키 탈취 피해를 줄이는 보완 수단이다.
CSRF는 Cross-Site Request Forgery로 사용자가 의도하지 않은 요청을 서버로 보내도록 하는 공격이다. 다시 말해, 사용자의 권한을 이용하는 공격이다.
브라우저는 기본적으로 같은 도메인의 경우 쿠키를 자동으로 포함한다.
CSRF Token
서버가 랜덤 토큰을 발행하고 요청 시 해당 토큰을 포함하는 방법이다.
POST /transfer
Cookie: JSESSIONID=xxx
X-CSRF-TOKEN: random_token
공격자는 이 토큰을 알 수 없어 위조 요청이 불가하다.
SameSite 쿠키
쿠키를 SameSite로 설정해 외부 사이트 요청에 대해 쿠키를 포함하지 않도록 한다.
Set-Cookie: JSESSIONID=xxx; SameSite=Strict
Origin / Refer 검증
서버에서 요청 헤더의 Origin을 검증하여 허용된 도메인인지 확인 하는 방법이다.
| 구분 | XSS | CSRF |
|---|---|---|
| 공격 대상 | 사용자 브라우저 | 서버 |
| 필요 조건 | 스크립트 실행 | 로그인 상태 |
| 목적 | 쿠키 탈취, 세션 장악 | 권한 악용 |
| 방어 핵심 | Output Encoding | CSRF Token |