CSRF(Cross-Site Request Forgery)는 로그인된 사용자가 악성 사이트를 방문했을 때, 그 사이트가 사용자의 인증 쿠키를 이용해 사용자 몰래 대상 사이트로 상태 변경 요청을 보내게 만드는 공격입니다.
핵심 원리는 브라우저가 대상 사이트로 가는 요청에 쿠키를 '자동으로' 붙인다는 점을 악용하는 것입니다.
예를 들어 사용자가 은행에 로그인한 상태에서 공격자의 페이지를 열면, 그 페이지의 숨은 폼·이미지·스크립트가 `POST https://bank.com/transfer`를 자동 발사하고 브라우저는 은행 쿠키를 함께 실어 보냅니다. 은행 서버 입장에서는 정상 로그인 요청과 구분되지 않아 이체가 실행될 수 있습니다. 동일 출처 정책은 응답을 '읽는' 것만 막지 요청이 '나가는' 것은 막지 않기 때문에 이 공격이 성립합니다(응답을 못 읽어도 부작용은 일어남).
방어는 여러 겹입니다. (1) `SameSite=Lax/Strict` 쿠키로 교차 사이트 요청에 쿠키가 실리지 않게 하는 것이 오늘날 가장 근본적인 완화책입니다. (2) CSRF 토큰(동기화 토큰 패턴): 서버가 예측 불가한 토큰을 폼/헤더에 심고 검증하면, 응답을 못 읽는 공격자는 이 토큰을 알 수 없어 실패합니다. (3) 상태 변경에는 안전하지 않은 메서드(POST 등)만 쓰고 GET으로 부작용을 만들지 않기. 주의: 쿠키가 아니라 `Authorization` 헤더의 Bearer 토큰만 쓰는 API는 브라우저가 자동으로 헤더를 붙이지 않아 CSRF에 원천적으로 덜 취약합니다. 반대로 XSS가 있으면 어떤 CSRF 방어도 무력화될 수 있어 XSS 차단이 선행되어야 합니다.