You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Sanctum跨域SPA中Bearer Token的安全防护咨询

Laravel 9 Jetstream SPA跨域认证安全方案

首先明确:只要是前端发起的HTTP请求,任何携带在请求头里的认证凭证(Bearer Token、JWT、Basic Auth信息)都会在浏览器开发者工具中可见——这是浏览器的固有特性,无法彻底隐藏,但可以通过以下方案大幅降低风险:

1. 优先用Sanctum SPA认证替代纯API Token

Jetstream本身集成了Sanctum,专门针对SPA场景做了优化,比直接用API Token更安全:

  • 配置跨域:在config/cors.php中设置supports_credentials为true,并在config/sanctum.php的stateful数组里添加你的SPA域名
  • 前端配置:axios开启withCredentials,让请求自动携带Cookie:
    axios.defaults.withCredentials = true;
    
  • 认证流程:用户在SPA提交账号密码到Laravel登录接口,后端返回HttpOnly的会话Cookie(前端JS无法读取,XSS攻击没法窃取),后续请求自动携带该Cookie,同时Sanctum会自动处理CSRF防护
  • 核心优势:不需要前端存储任何Token,从根源上避免了Token被XSS窃取的风险

2. 若坚持用API Token,做以下优化

如果必须保留API Token方式,重点在降低泄露后的影响:

  • 缩短Token有效期:生成Token时设置短有效期(比如1小时),不要用永久有效Token
  • 实现Token刷新:前端在Token过期前,用旧Token请求新Token,刷新接口要严格校验权限
  • 最小权限原则:给Token分配仅能完成业务的最小abilities,比如只允许访问/admin/orders/*而不是全量admin路由,即使泄露也不会造成大范围权限损失

3. JWT方案的适配(可选)

JWT可以通过tymon/jwt-auth包在Laravel中实现,但相比Sanctum需要自己处理更多细节:

  • 登录接口返回JWT Token后,前端将其存入HttpOnly Cookie(不要存在localStorage/sessionStorage),后续请求自动携带
  • 同样需要配置跨域withCredentials和CSRF防护
  • 注意:JWT的Payload是可解码的,不要存敏感信息;必须设置短有效期,并实现刷新机制

必做的基础安全防护

不管选哪种方案,这些措施是底线:

  • 强制HTTPS:所有请求必须走HTTPS,防止凭证在传输过程中被明文截取
  • 严格CORS配置:config/cors.php里限制允许的域名、请求方法和头部,绝对不要用*
  • 启用CSRF防护:Sanctum或JWT方案都要配合CSRF校验,前端需携带X-XSRF-TOKEN请求头
  • 防范XSS:前端做好输入过滤转义,后端设置Content-Security-Policy头部,减少XSS攻击可能性

内容的提问来源于stack exchange,提问作者Catalin Farcas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:35:15