CSRF란

**브라우저가 쿠키를 자동으로 붙여주는 성질**을 악용하는 공격이다. 공격자는 피해자의 인증 정보를 훔치지 않는다. 대신 피해자의 브라우저가 이미 갖고 있는 인증 상태를 빌려서, 피해자 몰래 서버에 요청을 보낸다.

  1. 은행 사이트에 로그인 - 세션 쿠키가 브라우저에 저장됨
  2. 공격자 페이지 방문 - 숨겨진 폼이 자동 제출됨
  3. 은행 서버로 요청 전송 - 쿠키가 자동으로 첨부됨
  4. 서버가 요청을 처리 - 본인 요청과 구분 불가

공격이 성립하는 조건

CSRF는 다음 세 가지가 동시에 맞아떨어질 때만 성립한다.

  1. 서버가 쿠키만으로 사용자를 식별한다. 요청에 유효한 세션 쿠키가 있으면 그냥 본인으로 간주한다.
  2. 브라우저가 쿠키를 자동으로 첨부한다. 요청을 누가 유발했는지와 상관없이, 목적지 도메인에 해당하는 쿠키를 알아서 붙인다. 이걸 Ambient Authority (주변 권한) 라고 부른다.
  3. 요청이 예측 가능하다. 공격자가 URL, 메서드, 파라미터 이름을 미리 알 수 있어야 한다.

공격자 페이지는 피해자가 클릭하지 않아도 요청을 발생시킬 수 있다. 이미지 태그의 주소가 GET 요청이고, 숨겨둔 폼은 스크립트로 즉시 제출할 수 있기 때문.

방어 원리

아이디어: 쿠키만으로는 부족하게 만들 것. 즉, 공격자가 알 수 없거나 자동으로 딸려가지 않는 무언가를 요청에 추가로 요구하는 것이다.

방식 원리
CSRF 토큰 서버가 세션마다 난수를 발급하고, 폼이나 헤더에 담아 보내게 함.
공격자는 다른 출처의 응답을 읽을 수 없어 이 값을 알아낼 수 없음
SameSite 쿠키 Lax 또는 Strict를 지정하면 브라우저가 교차 사이트 요청에 쿠키 자체를 붙이지 않음.
Origin / Referer 검증 요청 헤더의 출처가 자기 도메인인지 서버에서 확인
재인증 송금, 비밀번호 변경 같은 민감한 작업에 비밀번호나 OTP를 다시 요구