CSRF공격 시나리오
1. 사용자가 google.com에 로그인
- 사용자는 google.com에 로그인하여 세션 쿠키를 받습니다. 이 쿠키는 사용자가 google.com에 다시 요청을 보낼 때마다 자동으로 포함됩니다.
2. 악의적인 사이트 방문
- 사용자는 이메일 링크, 소셜 미디어 링크 또는 광고 등을 통해 attack.com이라는 악의적인 사이트를 방문합니다.
- attack.com에는 CSRF 공격을 수행하기 위한 악의적인 스크립트가 포함되어 있습니다.
3. 악의적인 요청 생성
- attack.com의 페이지에 다음과 같은 HTML 코드가 포함되어 있다고 가정합니다.
<img src="<https://google.com/some-action?param=value>" style="display:none">
- 이 코드는 이미지 태그를 사용하여 google.com으로 GET 요청을 보냅니다. style="display:none" 속성은 사용자가 이 이미지를 보지 못하게 합니다. 또는 AJAX 요청을 사용하여 POST 요청을 보낼 수도 있습니다
<form action="<https://google.com/some-action>" method="POST">
<input type="hidden" name="param" value="value">
</form>
<script>
document.forms[0].submit();
</script>
4. 브라우저의 자동 쿠키 포함
- 사용자의 브라우저는 google.com으로 요청을 보낼 때 자동으로 해당 도메인의 쿠키를 요청 헤더에 포함시킵니다.
- 이는 브라우저의 동작 원리로, 사용자가 로그인된 상태의 세션을 유지하기 위해 쿠키를 포함하는 것입니다.
5. google.com에서 요청 처리
- google.com은 이 요청을 받습니다.
- 서버는 요청에 포함된 쿠키를 사용하여 요청이 유효한 사용자로부터 온 것인지 확인합니다.
- 쿠키가 유효한 세션을 나타내므로, google.com은 요청을 정상적인 사용자 요청으로 처리합니다.
6. 결과
- 요청이 성공적으로 처리되어, 사용자가 의도하지 않은 행동이 google.com에서 수행됩니다. 예를 들어, 계좌 이체, 설정 변경, 데이터 삭제 등의 작업이 이루어질 수 있습니다.
<img src="<https://google.com/some-action?param=value>" style="display:none">
방어 방법
- CSRF 토큰 사용
- 각 요청마다 고유한 CSRF 토큰을 포함시켜 요청이 유효한지 확인합니다.
- 서버는 이 토큰을 검증하여 요청이 실제로 의도된 사용자로부터 온 것인지 확인합니다.
- SameSite 쿠키 속성
- 쿠키에 SameSite 속성을 설정하여 크로스 사이트 요청 시 쿠키가 포함되지 않도록 합니다.
Set-Cookie: JSESSIONID=abc123; SameSite=Strict