03-CSRF与CORS详解

张开发
2026/4/18 23:58:00 15 分钟阅读

分享文章

03-CSRF与CORS详解
Spring Security CSRF与CORS详解一、知识概述CSRF(跨站请求伪造)和 CORS(跨源资源共享)是 Web 安全中的两个重要概念。Spring Security 提供了对这两种安全机制的完善支持,帮助开发者构建安全的 Web 应用。CSRF 防护和 CORS 配置的核心概念:CSRF:防止恶意网站冒充用户发起请求CORS:控制浏览器跨域访问权限同源策略:浏览器安全限制预检请求:CORS 的 OPTIONS 请求理解 CSRF 和 CORS 的原理,是构建安全 Web 应用的必要知识。二、知识点详细讲解2.1 CSRF 原理正常请求: 用户 → 浏览器 → 目标网站(已登录)→ 执行操作 CSRF 攻击: 用户 → 恶意网站 → 浏览器(携带目标网站 Cookie)→ 目标网站 → 执行恶意操作CSRF 防护原理1. 服务端生成 CSRF Token 2. Token 嵌入表单或响应头 3. 用户提交请求时携带 Token 4. 服务端验证 Token 有效性 5. Token 不匹配则拒绝请求2.2 CORS 原理浏览器同源策略: - 相同协议(http/https) - 相同域名 - 相同端口 跨域请求: 前端(http://localhost:3000)→ 后端(http://localhost:8080)CORS 流程简单请求: 1. 浏览器发送请求,携带 Origin 头 2. 服务端检查 Origin,返回 Access-Control-Allow-Origin 3. 浏览器检查响应头,决定是否允许 预检请求: 1. 浏览器发送 OPTIONS 预检请求 2. 服务端返回允许的方法、头等 3. 浏览器发送实际请求2.3 简单请求 vs 预检请求简单请求条件方法:GET、POST、HEAD头:Accept、Accept-Language、Content-Language、Content-TypeContent-Type:text/plain、multipart/form-data、application/x-www-form-urlencoded预检请求触发条件方法:PUT、DELETE、PATCH自定义请求头Content-Type:application/json三、代码示例3.1 CSRF 防护配置importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.web.SecurityFilterChain;importorg.springframework.security.web.csrf.*;@Configuration@EnableWebSecuritypublicclassCsrfConfig{// 启用 CSRF 防护(默认启用)@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{http.csrf(csrf-csrf// 使用 Cookie 存储 CSRF Token.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));returnhttp.build();}// 禁用 CSRF(仅用于无状态 API)@BeanpublicSecurityFilterChaindisableCsrf(HttpSecurityhttp)throwsException{http.csrf(csrf-csrf.disable());returnhttp.build();}// 自定义 CSRF 配置@BeanpublicSecurityFilterChaincustomCsrf(HttpSecurityhttp)throwsException{http.csrf(csrf-csrf.csrfTokenRepository(csrfTokenRepository()).ignoringRequestMatchers("/api/public/**").csrfTokenRequestHandler(newCsrfTokenRequestAttributeHandler()));returnhttp.build();}@BeanpublicCsrfTokenRepositorycsrfTokenRepository(){CookieCsrfTokenRepositoryrepository=newCookieCsrfTokenRepository();repository.setCookieName("XSRF-TOKEN");repository.setHeaderName("X-XSRF-TOKEN");repository.setParameterName("_csrf");returnrepository;}}3.2 前端 CSRF Token 处理!-- Thymeleaf 表单 --formth:action="@{/transfer}"method="post"inputtype="hidden"th:name="${_csrf.parameterName}"th:value="${_csrf.token}"/!-- 其他表单字段 --buttontype="submit"提交/button/form// JavaScript 获取 CSRF TokenfunctiongetCsrfToken(){constcookieValue=document.cookie.split('; ').find(row=row.startsWith('XSRF-TOKEN='))?.split('=')[1];returndecodeURIComponent(cookieValue);}// 发送请求时携带 Tokenfetch('/api/transfer',{method

更多文章