上一篇介紹的 SAML 2.0 Bearer,是將既有的 SAML Assertion 送到 Token 端點交換 Access Token。今天要看的 **Token Exchange(RFC 8693)進一步放寬輸入與輸出的 Token 類型,並明確區分模擬(Impersonation)與委派(Delegation)**兩種語意。實際可交換的 Token 類型,仍取決於 Authorization Server 的支援與安全政策。
需要特別說明的是,Token Exchange 並不屬於 JWT Bearer 與 SAML 2.0 Bearer 所採用的身份聲明框架,而是由 RFC 8693 獨立定義的 OAuth 2.0 擴展機制。三者都能運用既有憑證或 Token 取得新的 Access Token,但規格架構不同。
今天內容涵蓋:
以微服務架構為例,使用者先以 aud=service-a 的 Access Token 呼叫服務 A,之後服務 A 需要代表使用者呼叫服務 B。此時,服務 A 不應直接將原始 Token 轉送給服務 B,因為可能遇到以下問題:
aud 指向服務 A,服務 B 因此拒絕接受。scope 不符合服務 B 的需求,可能權限不足,也可能授權範圍過大。這表示一個 Token 即使仍然有效,也不一定適合直接拿去呼叫其他服務。
Token Exchange 提供的解法,是讓服務 A 將原始 Token 交給 Authorization Server,並指定準備存取的目標服務與所需權限。Authorization Server 驗證原始 Token、Client 身份與交換政策後,再核發一個適合服務 B 使用的新 Token。新 Token 可以採用不同的 aud、scope 與有效期限,並在委派情境中保留實際代為操作的服務身份。
這個流程可以拆成兩項工作:
前者負責「發出原始 Token」,後者負責「用原始 Token 換取新 Token」。這兩項工作可以由同一個 Authorization Server 處理,也可以由不同系統分別負責。

圖中的流程可依下列順序理解:
整體而言,Token Exchange 不是把原始 Token 原封不動轉交給下一個服務,而是依目標服務的驗證條件與權限需求,重新核發更適合的新 Token。
Token Exchange Request 的目的,是將原始 Token 交給 Authorization Server,並說明新 Token 要用在哪裡、需要哪些權限。為了方便理解,可以將參數分成「基本交換」與「委派時額外使用」兩組。
| 參數 | 必要性 | 說明 |
|---|---|---|
grant_type |
必填 | 表示這是一個 Token Exchange Request,固定使用 urn:ietf:params:oauth:grant-type:token-exchange |
subject_token |
必填 | Client 目前持有、準備拿去交換的原始 Token |
subject_token_type |
必填 | 說明原始 Token 的類型,例如 Access Token 或 JWT |
audience 或 resource |
選填 | 指定新 Token 準備用於哪個目標服務或資源 |
scope |
選填 | 指定新 Token 需要具備的權限 |
requested_token_type |
選填 | 指定希望取得的新 Token 類型;未指定時通常核發 Access Token |
如果服務 A 是代表使用者發起交換,還需要區分兩個身份:
subject_token:使用者的 Token,表示「為了誰執行」。actor_token:服務 A 的 Token,表示「實際由誰執行」。只提供 subject_token 時,屬於 Impersonation;同時提供 subject_token 與 actor_token 時,則屬於 Delegation。提供 actor_token 時,也必須使用 actor_token_type 說明它的 Token 類型。下一節會進一步說明兩種方式的差異。
先釐清一件事:Impersonation 與 Delegation 是同一層級的兩種 Token Exchange 方式,不是前後兩個步驟。 兩者差別在於新 Token 是否保留服務 A 的身份。

Impersonation 是讓服務 A 以使用者的身份呼叫服務 B。依照圖中的編號,完整流程如下:
subject_token 與 subject_token_type 送到 Token Exchange Service,並透過 audience 或 resource 指定服務 B。此處不提供 actor_token;圖中的 client_id 與 client_secret 則用來示意 Client Authentication。對應的 Request 只帶入 subject_token:
POST /as/token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&
audience=urn%3Aexample%3Acooperation-context&
subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0...&
subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
重點是服務 A 並未直接轉送原始 Token,而是先換得適合服務 B 使用的新 Token;只是新 Token 不會記錄服務 A 的身份。因此,Impersonation 適合服務 B 只需辨認使用者的情況,例如相容舊系統;相關系統仍須另外保存稽核日誌。
💡服務 B 是否能辨認服務 A?
- Client Authentication: 讓 Authorization Server 知道請求來自服務 A。
actor_token: 讓服務 B 從新 Token 得知,實際代為操作的是服務 A。Impersonation 只有第一項,所以 Authorization Server 知道服務 A 是誰,但服務 B 不知道。

Delegation 會在新 Token 中保留服務 A 的身份。依照圖中的編號,完整流程如下:
subject_token 與自己的 actor_token 送到 Token Exchange Service,並透過 audience 或 resource 指定服務 B。對應的 Request 會比 Impersonation 多出 actor_token 與 actor_token_type:
POST /as/token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange&
subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0...&
subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aaccess_token&
actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjgiLCJ0eXAiOiJKV1QifQ...&
actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
Request 中的 actor_token 會讓新 Token 保留服務 A 的身份,通常記錄在 act Claim。服務 B 看到後,就知道:「這是使用者的操作,但實際由服務 A 代為送出。」
Delegation 適合需要追蹤實際呼叫者的微服務系統;若服務 B 無法處理服務 A 的身份,才改用 Impersonation。
兩種方式交換成功後,都會取得新的 Token,例如:
{
"access_token": "eyJhbGciOiJFUzI1NiIsImtpZCI6IjEyIn0...",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 3600
}
其中,issued_token_type 用來說明實際核發的 Token 類型;此範例核發的是 Access Token。
| 比較項目 | Impersonation(模擬) | Delegation(委派) |
|---|---|---|
| 呼叫方向 | 使用者 → 服務 A → 服務 B | 使用者 → 服務 A → 服務 B |
| 交換請求 | subject_token |
subject_token 與 actor_token |
| 服務 B 從 Token 看見 | 使用者 | 使用者與服務 A |
| 主要用途 | 相容舊系統、以使用者身份操作 | 微服務委派、保留稽核紀錄 |
| 一般建議 | 有明確需求時使用 | 新系統優先採用 |
JWT Bearer 與 SAML 2.0 Bearer 都依循身份聲明框架(Assertion Framework),分別使用 JWT 與 SAML Assertion 交換 Access Token。Token Exchange 則是由 RFC 8693 獨立定義的擴展機制,可在 Authorization Server 支援的範圍內接受不同類型的 Token,並依目標服務重新核發 Token。
| 比較項目 | JWT Bearer(Day14) | SAML 2.0 Bearer(Day15) | Token Exchange |
|---|---|---|---|
| 規格關係 | 身份聲明框架的 JWT 實作 | 身份聲明框架的 SAML 實作 | 獨立的 OAuth 2.0 擴展機制 |
| 輸入格式 | JWT | SAML Assertion | Authorization Server 支援的 Token 類型 |
| 輸出格式 | Access Token | Access Token | 可指定輸出類型;未指定時通常為 Access Token |
| 核心參數 | assertion |
assertion |
subject_token、actor_token、requested_token_type |
| 主要用途 | 以 JWT 交換 Access Token | 以 SAML Assertion 交換 Access Token | 依目標服務、資源與權限重新核發 Token |
| 委派/模擬語意 | 未明確定義 | 未明確定義 | 明確區分 Impersonation 與 Delegation |
三者可以搭配使用。例如,Client 可先以 SAML 2.0 Bearer 將 SAML Assertion 換成第一個 Access Token;當該 Token 需要在微服務之間繼續傳遞時,再透過 Token Exchange 取得適合下游服務的新 Token,並保留必要的委派紀錄。
Token Exchange 的核心,是用現有 Token 換取另一顆用途更合適的新 Token。 新 Token 可以指定使用對象、權限與有效期限,再由 Client 用來存取目標服務。
本文可整理成三個重點:
下一篇將介紹 Implicit Grant。這是 OAuth 2.0 早期為純前端應用設計的授權流程,但因 Access Token 會直接回傳至前端,面臨較高的外洩風險,目前已不再建議使用。