理解Spring Boot中的CORS和CSRF

1. CORS(跨域资源共享)

定义:

CORS 是浏览器中实现的一种安全特性,用于控制 Web 应用程序如何从不同域访问资源。它的设计目的是防止网页向与提供该页面的域不同的域发出请求。这对于 API 尤其重要,因为托管在不同域上的客户端(如 Web 应用程序)可能需要访问你的 Spring Boot 服务器。

CORS 的工作原理:

  • • 当浏览器发出跨域请求时(例如,你的前端在 http://localhost:3000 上向运行在 http://localhost:8080 上的 Spring Boot API 发出请求),浏览器会向服务器发送一个预检请求OPTIONS 请求),以检查服务器是否允许此类跨域请求。
  • • 服务器会返回一组标头,指示是否允许实际请求。

在 Spring Boot 中配置 CORS:

你可以在全局范围内或特定控制器上配置 CORS。

示例 — Spring Boot 中的全局 CORS 配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 允许所有路径的 CORS
            .allowedOrigins("http://localhost:3000") // 允许特定来源
            .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许特定方法
            .allowedHeaders("*") // 允许所有标头
            .allowCredentials(true); // 允许凭证(例如,cookies)
    }
}

2. CSRF(跨站请求伪造)

定义:

CSRF 是一种攻击类型,恶意网站会诱使用户的浏览器在用户已认证的不同网站上执行不需要的操作(例如提交表单、进行交易)。它利用了网站对用户浏览器的信任。

CSRF 的工作原理:

  • • 如果用户登录了一个网站(例如银行网站),攻击者可以创建一个恶意页面,诱使用户的浏览器在用户不知情的情况下向该网站发送请求。这可能导致未经授权的操作,例如转账或账户更改。
  • • CSRF 保护通过要求在表单或标头中包含一个令牌(CSRF 令牌)来确保发送到服务器的请求来自合法来源。

Spring Boot 中的 CSRF 保护:

默认情况下,Spring Security 提供了 CSRF 保护。当启用 CSRF 保护时,每个表单提交都会包含一个由服务器验证的 CSRF 令牌。

  • • CSRF 令牌 是一个唯一的、秘密的、不可预测的值,由服务器生成并包含在 HTTP 请求中(通常在表单或标头中)。服务器会检查此令牌以确保请求是合法的。

禁用 CSRF:

在某些情况下,如果你正在使用无状态 API(例如使用 JWT 令牌进行身份验证),你可能希望禁用 CSRF,因为它与无状态服务无关。

示例 — 在 Spring Boot 中禁用 CSRF

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // 禁用 CSRF 保护
            .authorizeRequests()
            .anyRequest().authenticated(); // 确保所有请求都经过身份验证
    }
}

总结

CORS:一种基于浏览器的安全特性,用于控制来自 Web 应用程序的跨域请求。它通过标头进行配置,Spring Boot 提供了灵活的配置选项。

CSRF:一种安全机制,用于防止恶意请求(例如表单提交)诱使用户在其已认证的网站上执行不需要的操作。Spring Security 默认启用了 CSRF 保护,但对于无状态 API 可以禁用它。

 

请登录后发表评论

    没有回复内容