跳到內容

Token Introspection

Token Introspection 由 RFC 7662 定義,讓 Resource Server 能夠向 Authorization Server 即時查詢一個 Token 是否有效,以及該 Token 的相關資訊(持有者、有效期限、授權範圍等)。

Resource Server 收到 Client 的 API 請求時,需要驗證附帶的 Access Token 是否有效。有兩種常見做法:

方式說明適用場景
本地驗證(JWT)Resource Server 自行解析並驗證 JWT 簽章Token 是 JWT 格式,效能優先
Introspection(遠端查詢)向 Authorization Server 確認 Token 狀態Opaque Token,或需要即時確認是否已撤銷

Token Introspection 特別適合以下情況:

  • Token 是不透明字串(Opaque Token),Resource Server 無法自行解析
  • 需要確認 Token 是否已被撤銷(JWT 本地驗證無法即時得知撤銷狀態)
  • 多個 Resource Server 共用同一個 Authorization Server

Resource Server 對 Authorization Server 的 Introspection 端點發送 POST 請求:

POST /introspect HTTP/1.1
Host: auth.example.com
Authorization: Basic BASE64(rs_client_id:rs_client_secret)
Content-Type: application/x-www-form-urlencoded
token=ACCESS_TOKEN_VALUE

⚠️ 注意:Introspection 端點本身需要認證(通常是 Resource Server 的 Client 憑證),防止任意人查詢 Token 資訊。

可選參數:

參數說明
token要查詢的 Token(必填)
token_type_hint提示 Token 類型(access_tokenrefresh_token),可加速查詢
{
"active": true,
"client_id": "my-app",
"username": "alice",
"scope": "read:profile read:email",
"sub": "user-123",
"aud": "https://api.example.com",
"iss": "https://auth.example.com",
"exp": 1742040000,
"iat": 1742036400,
"token_type": "Bearer"
}
{
"active": false
}

active: false 涵蓋所有無效狀態:Token 不存在、已過期、已撤銷,或不屬於這個 Resource Server。

欄位說明
active必填true 代表有效,false 代表無效
scope授權範圍,空格分隔的字串
client_id發起授權的 Client
subToken 代表的使用者識別碼
exp到期時間(Unix timestamp)
iat核發時間(Unix timestamp)
aud允許使用此 Token 的受眾(Audience)

Introspection 是一次網路請求,如果每個 API call 都做 Introspection 會產生顯著延遲。常見的最佳化方式:

  1. 短期快取:Resource Server 本地快取 Introspection 結果,時間不超過 Token 的剩餘有效期
  2. 搭配 JWT:Token 核發時使用 JWT,本地驗證簽章與有效期;只在需要確認撤銷狀態時才做 Introspection
  3. Token 撤銷通知:搭配 Token Revocation (RFC 7009) 讓 Resource Server 主動更新快取
面向Token IntrospectionJWT 本地驗證
Token 格式Opaque Token 或 JWT必須是 JWT
即時撤銷✅ 每次查詢 Authorization Server❌ 需等 Token 自然過期
效能❌ 每次驗證需網路請求✅ 本地計算
架構耦合Resource Server 依賴 Authorization Server 可用性無依賴
適用規模中小型、需要即時撤銷的系統大型分散式系統