Post

[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.