[Springboot] 웹 개발하며 마주치는 CSRF로 인한 403에러 해결하기
💡CSRF(Cross-Site Request Forgery)란?
CSRF란 사이트간 요청 위조라는 의미의 웹 보안 공격 일종 으로 사용자가 의도하지 않은 요청을 웹 애플리케이션에 보낼 수 있도록 악의적인 웹사이트가 사용자의 브라우저를 이용하는 공격이다. 즉, 사용자의 권한을 악용하여 비정상적인 요청을 보내는 것이다.
CSRF 방어 방법 3가지
- CSRF 토큰 사용 : 모든 폼 요청에 고유한 토큰을 포함하여 요청의 유효성을 검증.
- Referer 헤더 검사 : 요청의 출처를 확인하여 신뢰할 수 없는 출처에서 온 요청을 차단(모든 브라우저나 네트워크 환경에서 신뢰할 수 있는 방법은 아님).
- SameSite 쿠키 속성 : 쿠키에 SameSite 속성을 설정하여, 같은 사이트에서만 쿠키가 전송되도록 제한.
- SameSite=Lax: 기본적인 보안 수준으로, 크로스 사이트로부터의 대부분의 요청을 차단.
- SameSite=Strict: 더 높은 보안 수준으로, 크로스 사이트 요청을 완전히 차단.
회원가입 시 발생하는 403 에러의 원인
아마 뷰테스트에선 발생하지 않지만 postman으로 요청을 보내거나 테스트코드를 사용할 때 발생할 것이다.
-> 폼에 포함된 CSRF 토큰과 서버에서 기대하는 토큰이 일치하지 않기 때문이다.
토큰을 심은 적이 없는데? -> SpringSecurity사용으로 인해 CSRF토큰이 자동으로 심어졌을 것이다.
*참고로 CSRF방어 기능은 Spring Security 3.2.0 이후부터 지원된다고 한다.
해결 방법
SpringSecurity 설정 파일에서 CSRF 토큰을 해제해주면 된다!
[SecurityConfig.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration //IoC
public class SecurityConfig {
@Bean
BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
@Bean
SecurityFilterChain configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // CSRF 토큰 해제 코드 추가
http.authorizeRequests()
.antMatchers("/", "/user/**", "/image/**", "/subscribe/**", "/comment/**", "/api/**").authenticated()
.and()
.formLogin()
.loginPage("/auth/signin")
.loginProcessingUrl("/auth/signin")
.defaultSuccessUrl("/");
return http.build();
}
}
http.csrf().disable();
이를 통해 CSRF가 비활성화 되면서 에러를 해결할 수 있다.
This post is licensed under CC BY 4.0 by the author.