「登入之後,誰負責證明『我就是我』?又是誰負責記錄『我做了什麼』?」
當我們談認證(authentication)時,真正想要的其實是——可稽核的信任鏈。
我們從實務角度出發,帶你拆解 Laravel 11 裡 Sanctum 的兩種主流用法:SPA (Session/Cookie) 模式與 API Token 模式。除了流程、優缺點,我也把「實作後怎麼做到 accountability」的經驗放進來,讓你的系統不只「能用」,還能在出事時留下清楚的稽核線索。
前端先打 GET /sanctum/csrf-cookie
Laravel 會同時種下兩顆 cookie:
laravel_session
(HttpOnly,之後用來綁定使用者)與 XSRF-TOKEN
(供 JS 讀取、寫入 X-XSRF-TOKEN
header)
POST /login——送帳密 + X-XSRF-TOKEN
laravel_session
與使用者 ID 綁定完成。所有後續 API
withCredentials: true
,瀏覽器才願意帶 cookie。auth:sanctum
middleware 自動驗證。面向 | 說明 |
---|---|
XSS 風險低 | laravel_session 被 HttpOnly 保護,JS 永遠拿不到,攻擊面大幅縮小 |
內建 CSRF 保護 | 有 VerifyCsrfToken + XSRF-TOKEN ,前端只要先 call /sanctum/csrf-cookie 就安全上路 |
快速上手 | 不必自己塞 Authorization header,只要 cookie 正常帶就過關 |
Session ID = 行為指紋
在 sessions
table 開 agent
、ip_address
、last_activity
欄位,任何可疑行為都能順著 Session 追到裝置、IP、時間。
單裝置登出
如果安全政策要求「一支手機失竊要立即失效」,可以在登入後記錄 session()->getId()
,並在「登出其他裝置」功能裡呼叫 Auth::logoutOtherDevices()
來清空同帳號其他 Session。
SANCTUM_STATEFUL_DOMAINS
漏填就 401
localhost,127.0.0.1
) 和所有正式網域(含 www / 非 www)通通列進去。Access-Control-Allow-Origin: *
會被擋下。必須明寫來源網域。withCredentials: true
// 1. 登入成功後產生 token
$token = $user->createToken('api')->plainTextToken;
plainTextToken
(localStorage / IndexedDB / Secure Storage)Authorization: Bearer <token>
personal_access_tokens
驗證面向 | 說明 |
---|---|
完全 Stateless | 不吃 Session,適合微服務、Serverless、ECS 之類易於橫向擴充的場景 |
跨域 & App 友好 | 不倚賴瀏覽器 cookie,同一顆 token 放到 iOS、Android 甚至 Postman 皆可用 |
Token 可細分權限 | abilities(['read', 'write']) 讓單一帳號生成多顆能力各異的 token,利於最小權限 |
Token=可吊銷的身份證
建議在使用者後台做「查看 / 撤銷 token」列表,若發現異常流量,可立即 revoke。
加強到期策略
tokens->where('created_at', '<', now()->subDays(30))->delete();
週期性失效降低遺失風險。
集中式日誌
把 Request::user()?->id
、request()->bearerToken()
寫進 ELK 或 CloudWatch,可快速從 token 反查行為。
客戶端 | 建議模式 | 背後思路 |
---|---|---|
企業後台(同網域 SPA) | Session/Cookie | 風險集中在瀏覽器,採 HttpOnly 最安全 |
iOS / Android | API Token | 不受 cookie 限制,且 Stateless 易於佈署 |
第三方整合 | API Token 或 Passport | 需 Scope / OAuth2 flow 時改用 Passport |
auth:sanctum
config/cors.php
、sanctum.php
皆進 Git,PR 時才能被同儕審閱選擇認證方案,其實就是在選擇一條「信任鏈」的管理方式。
確認責任歸屬、留下可追溯的軌跡,再把技術落地——這才是讓使用者真正感到安心的關鍵。
原文發佈於: