본문 바로가기

Language/Spring Security

CSRF (Cross Site Request Forgery, 사이트 간 요청 위조)

728x90

CSRF (Cross Site Request Forgery, 사이트 간 요청 위조)

  • 웹 애플리케이션의 보안 취약점으로 공격자가 사용자로 하여금 이미 인증된 다른 사이트에 대해 원치 않는 작업을 수행하게 만드는 기법을 의미
  • 이 공격은 사용자의 브라우저가 자동으로 보낼 수 있는 인증 정보, 예를 들어 쿠키나 기본 인증 세션을 이용하여 사용자가 의도하지 않은 요청을 서버로 전송하게 만듦
  • 이는 사용자가 로그인한 상태에서 악의적인 웹사이트를 방문하거나 이메일 등을 통해 악의적인 링크를 클릭할 때 발생 가능

 

CSRF 진행 순서

 

CSRF 기능 활성화

  • CSRF 기능 활성화 → 별도 설정하지 않아도 활성화 상태로 초기화
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(Customizer.withDefaults());

    return http.build();
}
  • 토큰은 서버에 의해 생성되어 클라이언트의 세션에 저장되고 폼을 통해 서버로 전송되는 모든 변경 요청에 포함되어야 하며 서버는 이 토큰을 검증하여 요청의 유효성을 확인
  • 기본 설정은 'GET', 'HEAD', 'TRACE', 'OPTIONS’ 와 같은 안전한 메서드를 무시하고 'POST', 'PUT', 'DELETE’ 와 같은 변경 요청 메서드에 대해서만 CSRF 토큰 검사 수행
  • 중요한 점은 실제 CSRF 토큰이 브라우저에 의해 자동으로 포함되지 않는 요청 부분에 위치해야 한다는 것으로서 HTTP 매개변수나 헤더에 실제 CSRF 토큰을 요구하는 것이 CSRF 공격을 방지하는데 효과적이라 할 수 있음
  • 반면에 쿠키에 토큰을 요구하는 것은 브라우저가 쿠키를 자동으로 요청에 포함시키기 때문에 효과적이지 않다고 볼 수 있음

CSRF 기능 비활성화

  • csrf 기능 전체 비활성화
    • 쿠키나 세션을 이용한 공격이기 때문에 쿠키 or 세션을 사용하지 않는 곳에서는 굳이 CSRF의 기능을 사용하지 않아도 됨
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(csrf -> csrf.disabled());

    return http.build();
}
  • csrf 보호가 필요하지 않은 특정 엔드포인트만 비활성화
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf(csrf -> csrf.ignoreRequestMatchers("경로"));

    return http.build();
}

 

728x90