1. CSRF(Cross-Site Request Forgery)란?
- 사용자 동의 없이 인증 된 웹 애플리케이션에서 작업을 수행하도록 속이는 공격 유형
이 공격은 사용자 브라우저에 대한 웹사이트의 신뢰를 악용하며,
종종 브라우저가 사이트에 대한 요청에 관련 쿠키를 자동으로 포함한다는 사실을 활용하여 진행
2. CSRF 작동 방식
사용자 인증
- 사용자(공격대상)는 웹 애플리케이션에 로그인하고 세션 쿠키를 얻음
악성 이벤트
- 사용자(공격대상)가 원래 웹 애플리케이션에 로그인한 상태에서 악성 웹 사이트를 방문(Event)
위조된 요청
- 악성 사이트는 일부 작업(예: 송금, 비밀번호 변경)을 수행하고 사용자(공격 대상)의 세션 쿠키를 포함하는 요청을 대상 웹 애플리케이션에 보냄
실행된 작업
- 원래 웹 애플리케이션은 요청을 수신하고 세션 쿠키를 신뢰하여 마치 사용자가 수행한 것처럼 작업을 실행
3. CSRF 방어
- 이러한 공격을 방지하려면 웹 애플리케이션은 CSRF 보호 메커니즘을 구현하여
요청이 의도적이며 인증된 사용자로부터 발생하는지 확인해야 함
4. Spring Security의 CSRF 방어
- Spring Security는 내장된 CSRF 보호 기능을 제공
활성화되면 각 세션에 대해 고유한 토큰을 생성하고 모든 상태 변경 요청(예: POST, PUT, DELETE)에
이 토큰이 포함되도록 함
서버는 각 요청마다 토큰을 확인하여 토큰이 유효하고 사용자 세션과 일치하는지 확인
5.Spring Security에서 CSRF 방어 비활성화(disable)
CSRF 방어는 보안에 중요하지만 이를 비활성화하는 경우가 있다.
stateless
- stateless(세션을 유지하지 않는 등)한 RESTful한 API로 개발하는 경우 CSRF 보호가 필요하지 않을 수 있다.
( CSRF 토큰(방어기법)은 일반적으로 여러 요청에 걸쳐 세션이 유지되는 경우에 유용하다)
타사 클라이언트 사용
- 애플리케이션이 CSRF 토큰을 지원하지 않는 타사 클라이언트 또는 시스템의 요청을 허용해야 하는 경우
CSRF 보호를 비활성화할 수 있다.
( OAuth와 같은 대체 보안 조치를 고려한 후 신중하게 접근해야 한다. )
오늘의 배운점
CSRF가 어떤 공격인지 개념에 대해 알게 되었고
SpringSecurity에서 도대체 왜 보안에 유용한
CSRF방어를 비활성화 하는지에 대한 지식을 배웠다.