OAuth 2.0

OAuth 2.0 是一種授權協定(Authorization Protocol),允許應用程式代表使用者存取受保護的資源。

OAuth 2.0 是授權協定,不是認證協定。主要用於授予對一組資源的存取權限,例如遠端 API 或使用者資料。

四種角色

角色說明
Resource Owner擁有受保護資源的使用者,可授予存取權限
Client / Application需要存取受保護資源的應用程式
Authorization Server驗證使用者身份,發放 Access Token
Resource Server存放使用者受保護資料的伺服器

重要術語

術語說明
Redirect URIAuthorization Server 驗證後將使用者帶回的路徑
Access Token應用程式用來存取資源的憑證
Scopes定義存取權限的範圍(如:讀取名稱、編輯大頭貼)

Protocol Flow

OAuth 2.0 Flow

Authorization Code Flow

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

Authorization Code Flow

適用場景:

  • Web server applications
  • 後端伺服器負責產生頁面
  • Client Secret 等機密資訊可在伺服器端保存

Implicit Flow

注意: OAuth 2.1 已移除此流程,建議使用 PKCE。

適用於 Client-side applications(SPA、靜態網站)。

Implicit Flow

PKCE (Proof Key for Code Exchange)

用於增強 Public Clients 的安全性。

  1. Proof Key: 用來證明身份的密語(code verifier)
  2. Code Exchange: 解決原始 OAuth 2.0 在 public clients 無法驗證請求方身份的問題

Token 類型

JWT (JSON Web Token)

JWT 由三部分組成:Header、Payload、Signature。

JWT Structure

使用私鑰簽名(如 RS256),接收者使用公鑰驗證。

JWKS (JSON Web Key Set)

一組以 JSON 格式表示的公開金鑰,用於驗證 JWT 的數位簽章。

{
  "keys": [
    {
      "kty": "RSA",
      "kid": "2011-04-29",
      "use": "sig",
      "alg": "RS256",
      "n": "0vx7ago...",
      "e": "AQAB"
    }
  ]
}
Parameter說明
kidKey ID,金鑰識別碼
ktyKey Type(RSA、EC、oct)
algAlgorithm
use用途:sig(簽章)或 enc(加密)
nRSA 公鑰模數(Base64urlUInt 編碼)
eRSA 指數

Opaque Token

不包含使用者資訊的隨機字串,需要伺服器端驗證。

JWT vs Opaque Token

AspectJWTOpaque Token
結構Header + Payload + Signature隨機字串
內容包含使用者資訊僅為參考識別碼
驗證客戶端可驗證需伺服器驗證
撤銷難以在過期前撤銷伺服器可隨時撤銷
大小較大較小
狀態無狀態需伺服器狀態
適用SSO、服務間共享內部系統、API

Token Based Authentication

Token Based Authentication

相關主題