[SpringSecurity] CSRF - Post 403 Forbidden 에러

유알·2023년 3월 15일
0

[SpringSecurity]

목록 보기
10/15

문제의 내용

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {

    //비밀번호 암호화
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http.authorizeHttpRequests().anyRequest().permitAll();
        return http.build();
    }
}

일단 간단히 테스트 하기 위해 저런식으로 모든 request에 permitAll을 걸고 postman으로 진행을 하였지만, 이상한 결과가 나왔다.

  1. GET요청은 정상적으로 처리되었다.
  2. POST요청은 403 Forbidden이 떴다.
  3. 혹시나 내부 에러인가 싶어 exception handler에 모두 Break point를 걸고 실행했지만, 컨트롤러, exception handler 모두 걸리는게 없었다.

결국 찾아낸 문제점은 바로 csrf()이다. 옛날에 spring security를 공부할 때 공부했었는데, 이 문제 때문일 줄이야..
https://iseunghan.tistory.com/302

CSRF란

간단하게 복습할겸 간단하게 정리하자면
Cross-Site Request Forgery 의 약자이다.
일단 기본 전제 조건은

  1. 보안이 취약한 서버에 사용자가 로그인 되어있어야 한다.
  2. 서버가 쿠키를 통해 SessionId를 관리하고 있어야 한다.
  3. 공격자가 서버를 공격하기 위한 방법을 미리 파악하고 있어야한다.

쉽게 말하면 사용자가 정상적으로 발급받은 쿠키는 브라우저에 저장되어있다. 그리고 악성 사용자가 만든 악성 코드를 클릭함으로 인해 쿠키와 함께 원치 않는 요청이 전송된다.

그래서 문제는?

Spring Security의 경우 HTTP POST, PUT, DELETE, PATCH 에 대해 기본적으로 CSRF를 적용하도록 되어있다. 이는 토큰 방식으로 작동한다.
GET의 경우 서버를 변경시키지 않으므로 기본적으로는 적용시키지 않지만, 설정을 통해 적용시킬 수 있다.

그래서 POST Man을 통해 전송을 할 때 이 토큰이 포함되어있지 않아 403 Forbidden을 내보낸 것이다.

해결?

해결하는 방법은 csrf를 disable 시키면 된다.

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {

    //비밀번호 암호화
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http.csrf().disable();
        http.authorizeHttpRequests().anyRequest().permitAll();
        return http.build();
    }
}
profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글