認證 vs 授權:Session / JWT / OAuth
認證(Authentication)vs 授權(Authorization)
認證 = 你是誰?(登入)
授權 = 你能做什麼?(權限)
比喻:
認證 = 公司門禁卡(證明你是員工)
授權 = 門禁卡上的權限(你能進哪些樓層)
Session-based 認證
1. 使用者登入 → 伺服器建立 Session(存在記憶體/Redis)
2. 回傳 Session ID(放在 Cookie)
3. 每次請求帶 Cookie → 伺服器查 Session 確認身份
優點:
- 伺服器有完全控制權(可以即時踢人下線)
- Cookie 自動帶,前端不用管
缺點:
- 伺服器要存 Session → 多台伺服器要共享(Redis)
- 不適合手機 App(Cookie 支援差)
- CSRF 攻擊風險(Cookie 自動帶)
JWT(JSON Web Token)認證
1. 使用者登入 → 伺服器產生 JWT Token
2. 回傳 Token → 前端自己存(localStorage / memory)
3. 每次請求帶 Authorization: Bearer <token>
4. 伺服器驗證 Token 簽名 → 不需要查 DB
JWT 結構:
xxxxx.yyyyy.zzzzz
↓ ↓ ↓
Header.Payload.Signature
Payload 裡面有:
{ sub: "user123", name: "小明", role: "admin", exp: 1700000000 }
優點:
- 無狀態(伺服器不需要存 Session)
- 跨域 / 手機 App 友善
- 可以放自訂資料(Claims)
缺點:
- 無法即時撤銷(Token 發出後直到過期前都有效)
- Token 被偷就完了(要設短過期時間 + Refresh Token)
- 放 localStorage 有 XSS 風險
OAuth 2.0
場景:「用 Google 登入」
你的網站不需要知道使用者的 Google 密碼
→ 使用者去 Google 登入
→ Google 回傳授權碼(Authorization Code)
→ 你的後端用授權碼換 Access Token
→ 用 Access Token 取得使用者資料
四種授權流程:
1. Authorization Code(最安全,後端用)
2. PKCE(前端 SPA 用)
3. Client Credentials(伺服器對伺服器)
4. Password(已棄用)
比較總覽
| Session | JWT | OAuth 2.0 | |
|---|---|---|---|
| 狀態 | 有狀態(伺服器存 Session) | 無狀態 | 看實作 |
| 適合 | 傳統 MVC 網站 | SPA、手機 App、API | 第三方登入 |
| 能即時撤銷? | ✅ 刪 Session | ❌ 要等過期 | 看實作 |
| 跨域? | ❌ Cookie 限制 | ✅ Header 帶 | ✅ |
| 安全風險 | CSRF | XSS(若存 localStorage) | 設定複雜 |
你的 DevLearn 用的是 Cookie + Session 模式(BCrypt 密碼 + 登入 Cookie),這對 MVC 網站是最適合的。