咨询:Laravel Sanctum生成的访问令牌如何安全存储?
针对Laravel Sanctum令牌存储的正确方案
一、SPA单页应用场景(推荐)
如果你的原生JS前端是单页应用,直接用Sanctum自带的SPA认证机制,无需手动处理令牌存储:
- 后端配置
- 在
.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
- 在
- 前端流程
- 先请求
/sanctum/csrf-cookie接口,后端会返回一个非HttpOnly的XSRF-TOKENCookie - 发送登录请求时,浏览器会自动携带这个Cookie,验证通过后,后端会设置一个HttpOnly的Session Cookie(前端JS无法读取,从根源避免XSS窃取)
- 后续所有请求需带上
credentials: 'include'(Fetch API)或withCredentials: true(Axios),让浏览器自动携带Session Cookie完成认证
- 先请求
二、纯API令牌场景(非SPA/独立前端)
如果是纯API调用场景(比如多页应用、需手动管理Bearer令牌):
- 优先选择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攻击
- 登录成功后,后端通过响应头设置Cookie:
- 若必须前端JS读取令牌
- 只能存在
sessionStorage(关闭页面即销毁,风险低于localStorage),同时必须做好XSS防护:- 禁用
innerHTML等危险DOM操作API - 严格过滤用户输入内容
- 启用CSP(内容安全策略)限制脚本来源
- 禁用
- 只能存在
三、你之前的错误做法解析
- 用Laravel的
session()存令牌:这是后端服务器端的session存储,前端根本无法获取该值,完全不符合前后端分离的令牌传递逻辑,属于错误用法 - 前端存普通无HttpOnly标志的Cookie:这类Cookie可被前端JS读取,一旦页面存在XSS漏洞,令牌会被直接窃取,安全性极低
内容的提问来源于stack exchange,提问作者UndercoverCoder
相关产品推荐
相关产品推荐

