- 사이트 간 요청 위조. 인증된 유저의 계정을 사용해 유저의 의도와는 무관하게 악의적인 변경 요청을 만들어 보내는 기법
- 스프링 시큐리티의 경우 CSRF Filter 를 통해 검사
- 페이지를 제공하는 서버와 데이터를 제공하는 서버가 다를 경우 CSRF 토큰을 포함하지 않는 요청을 허용해야함으로 이를 대체할 방어 전략이 필요하다.
- 교차 출처 리소스 공유. 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제
- Preflight Request
- 교차 출처 리소스 공유 사전 요청. 교차 출처 HTTP 요청 전에 서버 측에서 그 요청의 메서드와 헤더에 대해 인식하고 있는지 체크하기 위한 요청
@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) {
// CORS 허용
// 페이지를 제공하는 서버(Origin Server)와 데이터를 제공하는 서버(Other Server)가 다를 경우
// Other Server 에서 CSRF 토큰을 제공할 수 없으므로 CSRF Filter 인증을 사용하지 않음
http.csrf(AbstractHttpConfigurer::disable)
.cors(corsConfigurer -> corsConfigurer.configurationSource(corsConfigurationSource()));
// 페이지 권한 설정
http.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests.anyRequest().permitAll());
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
// 지정한 출처의 애플리케이션의 요청을 허용
configuration.addAllowedOriginPattern("http://localhost:5173");
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
