@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
설정은 서버가 세션(쿠키 등)을 생성하거나 저장하지 않게 만든다.