
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{
http.csrf(csrf -> csrf.disable())
<img src="http://은행/송금?to=해커&금액=100000"> (사용자가 로그인 상태에서 이 이미지를 보면 자동으로 송금)Authorization 헤더에 담겨 전송됨"When you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection."
https://docs.spring.io/spring-security/reference/servlet/exploits/csrf.html#csrf-when
Authorization 헤더 조합은 대표적인 사례설정 예시
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
🤔 csrf(AbstractHttpConfigurer::disable)와 csrf(csrf -> csrf.disable())의 차이
전자의 경우, AbstractHttpConfigurer의 disable 메서드를 메서드 참조 방식으로 전달하여 비활성화
후자의 경우, 람다식으로 csrf.disable()을 호출하여 비활성화
Spring Security 6.x 이상에서 후자(람다 기반)의 스타일로 변경되면서 권장되지는 않음.
"스프링 부트 3.x.x 버전부터는 csrf().disable()이 적용 시 경고 문장이 뜬다. 이는 다음과 같이 바꿔주면 된다.
http.csrf().disable() => http.csrf(AbstractHttpConfigurer::disable)"
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.httpBasic(AbstractHttpConfigurer::disable) // 기본 인증 비활성화
.formLogin(AbstractHttpConfigurer::disable) // 폼 로그인 비활성화
.csrf(AbstractHttpConfigurer::disable) // CSRF 보호 비활성화
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
이렇게 설정하는 이유는 주로 REST API 서버와 같이 "상태를 저장하지 않는(stateless)" 서비스에 적합한 보안 구성을 만들기 위해서다.
1. CSRF 보호 비활성화
2. 폼 로그인(formLogin) 비활성화
3. 기본 인증(httpBasic) 비활성화
4. 세션 비활성화(Stateless)
SessionCreationPolicy.STATELESS 설정은 서버가 세션(쿠키 등)을 생성하거나 저장하지 않게 만든다.