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

咨询:Laravel Sanctum生成的访问令牌如何安全存储?

针对Laravel Sanctum令牌存储的正确方案

一、SPA单页应用场景(推荐)

如果你的原生JS前端是单页应用,直接用Sanctum自带的SPA认证机制,无需手动处理令牌存储:

  1. 后端配置
    • 在.env中设置SESSION_DRIVER=cookie
    • 在config/sanctum.php里,将你的前端域名加入stateful数组,示例:
      'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1:8000')),
      
    • 确保config/cors.php中supports_credentials设为true
  2. 前端流程
    • 先请求/sanctum/csrf-cookie接口,后端会返回一个非HttpOnly的XSRF-TOKEN Cookie
    • 发送登录请求时,浏览器会自动携带这个Cookie,验证通过后,后端会设置一个HttpOnly的Session Cookie(前端JS无法读取,从根源避免XSS窃取)
    • 后续所有请求需带上credentials: 'include'(Fetch API)或withCredentials: true(Axios),让浏览器自动携带Session Cookie完成认证

二、纯API令牌场景(非SPA/独立前端)

如果是纯API调用场景(比如多页应用、需手动管理Bearer令牌):

  1. 优先选择HttpOnly Cookie存储
    • 登录成功后,后端通过响应头设置Cookie:
      return response()->json(['message' => '登录成功'])
          ->cookie('access_token', $accessToken, 60*24*7, null, null, env('APP_ENV') === 'production', true, false, 'Strict');
      
      参数说明:
      • 第3位是过期时间(分钟,示例为7天)
      • 第7位true表示开启Secure,生产环境必须启用(仅HTTPS传输)
      • 第8位true表示开启HttpOnly,前端JS无法读取,防XSS
      • 第9位'Strict'是SameSite属性,防止CSRF攻击
  2. 若必须前端JS读取令牌
    • 只能存在sessionStorage(关闭页面即销毁,风险低于localStorage),同时必须做好XSS防护:
      • 禁用innerHTML等危险DOM操作API
      • 严格过滤用户输入内容
      • 启用CSP(内容安全策略)限制脚本来源

三、你之前的错误做法解析

  • 用Laravel的session()存令牌:这是后端服务器端的session存储,前端根本无法获取该值,完全不符合前后端分离的令牌传递逻辑,属于错误用法
  • 前端存普通无HttpOnly标志的Cookie:这类Cookie可被前端JS读取,一旦页面存在XSS漏洞,令牌会被直接窃取,安全性极低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:22:37