news 2026/5/10 3:33:27

03-CSRF与CORS详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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-Type
  • Content-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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 0:27:02

Open Control Framework:嵌入式MIDI控制器的语义化硬件抽象框架

1. 项目概述Open Control Framework&#xff08;OCF&#xff09;是一个面向嵌入式 MIDI 控制器的硬件抽象框架&#xff0c;其核心设计目标是为硬件控制器开发提供结构化、可移植、可扩展的底层软件基础。它并非一个封闭的固件方案&#xff0c;而是一套经过工程验证的 C 模块化架…

作者头像 李华
网站建设 2026/5/10 3:32:38

CSS 裁剪路径动画:创造独特的视觉效果

CSS 裁剪路径动画&#xff1a;创造独特的视觉效果掌握 CSS 裁剪路径动画的高级技巧&#xff0c;创造独特而引人入胜的视觉效果。一、裁剪路径概述 作为一名把代码当散文写的 UI 匠人&#xff0c;我对 CSS 裁剪路径动画有着独特的见解。裁剪路径是一种强大的视觉效果工具&#x…

作者头像 李华
网站建设 2026/4/10 0:21:42

MeanFilterLib:嵌入式均值滤波库原理与实战

1. MeanFilterLib 均值滤波库深度解析&#xff1a;嵌入式系统中的高效移动平均实现1.1 库定位与工程价值MeanFilterLib 是一个专为资源受限嵌入式平台&#xff08;尤其是 Arduino 及兼容 MCU&#xff09;设计的轻量级均值滤波库。其核心目标并非提供通用信号处理能力&#xff0…

作者头像 李华
网站建设 2026/4/10 0:19:11

simpleRPC:嵌入式轻量级RPC框架,实现Arduino函数远程调用

1. simpleRPC 库概述&#xff1a;面向嵌入式系统的轻量级远程过程调用框架simpleRPC 是一个专为 Arduino 及兼容平台&#xff08;如 ESP32、ESP8266、STM32duino&#xff09;设计的极简 RPC&#xff08;Remote Procedure Call&#xff09;实现库。其核心目标并非构建企业级分布…

作者头像 李华
网站建设 2026/4/10 0:10:31

OpenTSS:面向Arduino的无栈确定性回调调度器

1. 项目概述OpenTSS&#xff08;Open Time-Sharing System&#xff09;是一个面向Arduino平台的轻量级、无栈式时间片调度系统&#xff0c;其核心设计哲学是“无线程的类线程行为”&#xff08;thread-like system without thread&#xff09;。它不依赖传统RTOS的上下文切换、…

作者头像 李华