Laravel/Vue项目使用cookie会话驱动时出现CSRF令牌不匹配419错误
核心原因
当使用cookie作为session驱动时,后端依赖浏览器携带的laravel_session cookie识别用户会话。如果axios请求未正确携带该cookie,后端会为每个请求创建全新session,导致生成的CSRF令牌与客户端发送的不一致,触发419错误。而redis/file驱动依赖服务器端存储session,会话识别逻辑不受cookie携带问题影响,因此能正常工作。
解决方案
1. 开启Axios的Cookie携带功能
修改客户端axios配置,添加withCredentials: true,确保请求自动携带session cookie:
if(!window.axios) { window.axios = require("axios"); window.axios.defaults.headers.common = { 'X-Requested-With': 'XMLHttpRequest', 'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content') }; // 允许axios携带cookie到后端 window.axios.defaults.withCredentials = true; }
2. 调整Laravel Session配置(config/session.php)
根据部署环境修正session cookie参数:
- same_site:本地HTTP开发环境设为
'lax';生产HTTPS同域场景设为'strict',跨域场景设为'none'(需同时开启secure)'same_site' => 'lax', - secure:本地HTTP环境设为
false,HTTPS环境设为true'secure' => env('SESSION_SECURE_COOKIE', false), - domain:前后端子域名部署时,设置为根域名(如
.yourdomain.com),确保cookie跨子域名共享'domain' => env('SESSION_DOMAIN', null),
3. 确认路由中间件配置
若请求路由在api中间件组,默认不会启用session和CSRF验证。如需在api路由中使用session,需手动添加web中间件:
// 单个路由添加示例 Route::post('/api/shopping/getCartInfo', [CartController::class, 'getCartInfo'])->middleware('web');
或在app/Providers/RouteServiceProvider.php中批量配置api路由的中间件:
public function mapApiRoutes() { Route::prefix('api') ->middleware(['web', 'api']) ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
4. 确保CSRF令牌正确生成
页面meta标签的CSRF令牌必须由Laravel动态生成,避免硬编码:
<meta name="csrf-token" content="{{ csrf_token() }}">
验证步骤
- 打开浏览器开发者工具,检查请求头
Cookie字段是否包含laravel_session值; - 在后端方法中打印session ID,确认多次请求的session ID一致:
public function getCartInfo(Request $request) { \Log::info($request->session()->getId()); // 多次请求应输出相同ID \Log::info($request->session()->token()); // 此时应与客户端发送的令牌一致 // ... 业务代码 }
内容的提问来源于stack exchange,提问作者Marko Jovanovic
相关产品推荐
相关产品推荐

