Spring Security两种CORS配置的差异及实际效果疑问
跨源资源共享(CORS)是基于HTTP头的机制,浏览器默认禁止跨源请求。只有当跨站服务器返回包含源应用域名(或通配符*)的Access-Control-Allow-Origin头时,源应用才能处理响应,否则会被浏览器CORS策略拦截。
我在使用Spring Security 6.4.2(对应Spring Boot 3.4.1)时做了实验,发现httpSecurity.cors(Customizer.withDefaults());和httpSecurity.cors(AbstractHttpConfigurer::disable);这两种配置,似乎都不会改变浏览器的上述默认行为——两者都不会主动发送Access-Control-Allow-Origin头。
核心疑问
从实际应用角度看,这两种配置效果是否相同?我知道它们在实现层面有区别,但站在开发者视角,选择哪种配置(或者干脆都不配置)是否重要?
疑问来源与相关代码
我是在学习Spring Security教程时产生这个疑问的,视频作者在配置无状态REST API的安全FilterChain时,写了这段未做解释的代码:
http .cors(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable)
我困惑的点在于,.cors(AbstractHttpConfigurer::disable)看起来没改变浏览器默认行为,但.csrf(AbstractHttpConfigurer::disable)确实会禁用Spring Security默认的CSRF令牌生成,关闭跨站请求伪造防护——这点我的理解是否正确?
以下是视频里更新后的完整安全配置代码:
@Bean public SecurityFilterChain applicationSecurity(HttpSecurity http) throws Exception { http .cors(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable) .securityMatcher("/**") // 将当前配置映射到指定资源路径 .sessionManagement(sessionManagementConfigurer -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(AbstractHttpConfigurer::disable) .authorizeHttpRequests(registry -> registry .requestMatchers("/").permitAll() .anyRequest().authenticated() ); return http.build(); }
补充背景
这个教程系列的目标是保护无状态REST API,而非Spring MVC动态Web应用,上述代码是第一步基础配置。
内容的提问来源于stack exchange,提问作者chris457

