CSRF(Cross-Site Request Forgery)는 웹 애플리케이션에서 자주 발생하는 보안 취약점 중 하나로, 사용자의 인증 정보를 도용하여 원하지 않는 요청을 전송하게 만드는 공격 기법입니다. 이번 글에서는 CSRF의 개념, 동작 방식, 주요 특징과 실제 공격 시나리오, 그리고 방지 방법까지 자세히 설명드리겠습니다.
CSRF는 사이트 간 요청 위조라고 번역되며, 사용자가 자신도 모르게 공격자가 의도한 요청을 웹 서버에 전송하도록 만드는 공격입니다. 이 공격은 주로 사용자가 이미 로그인 상태일 때 발생하며, 공격자는 사용자의 세션 쿠키를 활용하여 피해자 대신 서버에 악의적인 요청을 전송합니다.
즉, 사용자가 어떤 웹사이트에 로그인된 상태에서, 다른 악성 웹페이지를 방문하게 되면, 그 악성 페이지가 사용자를 대신해 원래 로그인된 사이트에 요청을 보내는 구조입니다.
아래 그림은 CSRF의 일반적인 작동 흐름을 도식화한 것입니다.
<!-- 공격자가 만든 악성 웹페이지 예시 -->
<html>
<body>
<h1>당신의 무료 쿠폰이 도착했습니다!</h1>
<img src="https://bank.com/transfer?to=attacker123&amount=10000" style="display:none">
</body>
</html>
피해자가 bank.com
에 로그인한 상태에서 이 코드를 포함한 웹사이트에 방문하면, 자동으로 공격자의 계좌로 송금 요청이 전송됩니다.
<form action="https://site.com/change-email" method="POST">
<input type="hidden" name="email" value="attacker@example.com" />
<input type="submit" />
</form>
<script>
document.forms[0].submit();
</script>
서버는 폼에 고유한 CSRF 토큰을 포함시켜, 클라이언트가 요청 시 반드시 이 토큰을 같이 보내도록 합니다. 서버는 이를 검증하여 유효한 요청인지 판단합니다.
SameSite
속성을 Strict
또는 Lax
로 설정하여 외부 사이트로부터의 쿠키 전송을 제한합니다.
Set-Cookie: sessionId=abc123; SameSite=Strict
Strict
: 외부 도메인에서는 쿠키 전송 금지Lax
: GET 요청만 허용, 대부분의 CSRF 방어 가능서버 측에서 요청 헤더의 Referer
또는 Origin
값을 확인하여, 자신의 도메인에서 보낸 요청인지 검증할 수 있습니다.
민감한 작업(비밀번호 변경, 송금 등) 시 비밀번호 재입력 등의 추가 인증을 요구하는 방식도 효과적입니다.
항목 | 설명 |
---|---|
공격 대상 | 로그인된 사용자 세션 |
공격 방식 | 사용자가 의도하지 않은 요청을 전송하게 만듦 |
주요 특징 | 세션 쿠키 자동 전송, 사용자 개입 없이 공격 가능 |
방어 방법 | CSRF 토큰, SameSite 쿠키, Referer/Origin 검사 등 |
CSRF는 브라우저의 기본 동작을 악용한 치명적인 공격이지만, 위에서 설명드린 여러 가지 방어 기법을 적절히 조합한다면 충분히 방어할 수 있습니다.
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…