OAuth 2.0
OAuth 2.0 是一種授權協定(Authorization Protocol),允許應用程式代表使用者存取受保護的資源。
OAuth 2.0 是授權協定,不是認證協定。主要用於授予對一組資源的存取權限,例如遠端 API 或使用者資料。
四種角色
| 角色 | 說明 |
|---|---|
| Resource Owner | 擁有受保護資源的使用者,可授予存取權限 |
| Client / Application | 需要存取受保護資源的應用程式 |
| Authorization Server | 驗證使用者身份,發放 Access Token |
| Resource Server | 存放使用者受保護資料的伺服器 |
重要術語
| 術語 | 說明 |
|---|---|
| Redirect URI | Authorization Server 驗證後將使用者帶回的路徑 |
| Access Token | 應用程式用來存取資源的憑證 |
| Scopes | 定義存取權限的範圍(如:讀取名稱、編輯大頭貼) |
Protocol Flow

Authorization Code Flow
最常見的授權流程,適用於 Server-side Application。

適用場景:
- Web server applications
- 後端伺服器負責產生頁面
- Client Secret 等機密資訊可在伺服器端保存
Implicit Flow
注意: OAuth 2.1 已移除此流程,建議使用 PKCE。
適用於 Client-side applications(SPA、靜態網站)。

PKCE (Proof Key for Code Exchange)
用於增強 Public Clients 的安全性。
- Proof Key: 用來證明身份的密語(code verifier)
- Code Exchange: 解決原始 OAuth 2.0 在 public clients 無法驗證請求方身份的問題
Token 類型
JWT (JSON Web Token)
JWT 由三部分組成:Header、Payload、Signature。

使用私鑰簽名(如 RS256),接收者使用公鑰驗證。
JWKS (JSON Web Key Set)
一組以 JSON 格式表示的公開金鑰,用於驗證 JWT 的數位簽章。
{
"keys": [
{
"kty": "RSA",
"kid": "2011-04-29",
"use": "sig",
"alg": "RS256",
"n": "0vx7ago...",
"e": "AQAB"
}
]
}| Parameter | 說明 |
|---|---|
| kid | Key ID,金鑰識別碼 |
| kty | Key Type(RSA、EC、oct) |
| alg | Algorithm |
| use | 用途:sig(簽章)或 enc(加密) |
| n | RSA 公鑰模數(Base64urlUInt 編碼) |
| e | RSA 指數 |
Opaque Token
不包含使用者資訊的隨機字串,需要伺服器端驗證。
JWT vs Opaque Token
| Aspect | JWT | Opaque Token |
|---|---|---|
| 結構 | Header + Payload + Signature | 隨機字串 |
| 內容 | 包含使用者資訊 | 僅為參考識別碼 |
| 驗證 | 客戶端可驗證 | 需伺服器驗證 |
| 撤銷 | 難以在過期前撤銷 | 伺服器可隨時撤銷 |
| 大小 | 較大 | 較小 |
| 狀態 | 無狀態 | 需伺服器狀態 |
| 適用 | SSO、服務間共享 | 內部系統、API |
Token Based Authentication
