存取權杖(Token)是一種數位金鑰,用於在授予使用者存取各種資源的能力之前,驗證並確認其身分。這些資源可能包括應用程式介面 (application programming interface, API)、網頁應用程式以及雲端服務。作為傳統密碼系統的替代方案,存取權杖可作為授權的證明,促進客戶端與伺服器之間的安全通訊。
存取權杖的關鍵要素
存取權杖包含標頭、有效載荷與簽章,三者共同運作以驗證使用者對資源的存取權限。標頭中包含權杖類型及生成所使用的演算法資訊。有效載荷則記錄使用者相關資訊(例如:權限與到期時間)。簽章包含收件方用以驗證權杖真實性的必要資料。存取權杖的簽章通常會進行編碼(例如:雜湊處理),以防止被濫用或複製。
如何取得存取權杖
存取權杖由資源所有者明確授權或透過重新整理權杖發行。它們可在未再次請求使用者授權的情況下,於之後取得存取權限,但出於安全考量,存取權杖的有效期限是有限的。一旦存取權杖過期,即無法再使用。
存取權杖的取得位置
任何登入系統或應用程式的使用者,都會在啟動會話並登入服務時產生存取權杖。使用者會話中執行的每個程序都會擁有該權杖的副本,其中包含登入安全識別碼或 SID,用以識別當前會話。
存取權杖與重新整理權杖可存放於伺服器端會話中,使其可用於來自伺服器端程式碼的請求。這種方式稱為前端後端代理 (Backend for Frontend, BFF) 模式。應用程式也可使用專用 API 來儲存存取權杖、將其保存在記憶體中,或存放於 Cookie 內。
存取權杖的用途
API 存取
- 允許應用程式向授權伺服器請求權杖,並使用這些權杖存取 API
- 限制特定 API 功能的存取,僅允許授權的應用程式、服務或使用者使用
- 保護 API 端點
雲端服務
- 控制對資源的存取,例如資料庫、儲存容器及虛擬機器
- 協助雲端平台管理對其服務的存取
- 限制對敏感雲端資源的存取與互動,僅允許已驗證及授權的實體使用
聯合身分系統
- 允許使用者存取不同安全領域或組織的資源
- 協助在各系統間對使用者身分與權限進行對應
- 簡化多組織協作中的存取管理
物聯網 (Internet of Things, IoT)
- 維護物聯網通訊的完整性與隱私
- 限制僅授權裝置的存取與資料傳輸能力
- 確保物聯網裝置與雲端或其他裝置之間的通訊安全
行動應用程式
- 在不儲存使用者憑證的情況下,進行使用者身分驗證與授權
單一登入(Single Sign-On, SSO) 系統
- 協助維持使用者在不同應用程式間的認證工作階段
- 使用一組憑證即可無縫存取多個應用程式或服務
- 減少重複登入的需求
網路驗證(例如 OAuth2 與 OpenID Connect)
- 配合 OAuth2 與 OpenID Connect 協議,用於使用者身分驗證與授權
存取權杖的重要性
存取權杖之所以重要,是因為它們能協助保護數位資源免於未經授權的存取。其重要性的幾項益處如下。
提升安全性
存取權杖比密碼更安全,因為它們較難被竊取或破解。此外,由於存取權杖通常是無狀態的,伺服器無需儲存使用者的工作階段資訊。
合規性
存取權杖可以設定包含關於同意與使用情況的中繼資料。這些資訊可協助組織滿足合規要求,提供一種清晰且可稽核的方式來管理並限制對敏感資源的存取。
委派存取
存取權杖可用於允許第三方應用程式在不暴露使用者憑證的情況下,代表使用者執行操作。例如,使用社群媒體帳號登入或與第三方服務整合。
效率性
存取權杖可降低密碼學運算負擔,因為只需建立一次簽章即可取得權杖。
細粒度存取控制
存取權杖可設定以限制授予客戶端應用程式的權限,從而減少敏感資料或資源的未經授權曝露。
互通性
存取權杖促進不同服務與應用程式之間的互通性,使其能在分散式環境中無縫整合並存取共享資源。例如,在 API 生態系統中,一個服務可請求存取權杖,以代表使用者與另一個服務互動,而無需共享使用者憑證。
減少攻擊面(Attack Surface)
存取權杖可設定為短期有效,透過縮短濫用的時間窗口,降低遭入侵的可能性與影響。
可撤銷性
若存取權杖遭到入侵或不再需要,授權伺服器可以撤銷或使其失效,從而增強對資源存取的安全性與控制能力。
可擴展性
存取權杖使系統能更有效地擴展,因為它們消除了伺服器維護工作階段狀態的需求。這在分散式系統或微服務架構中特別有利,因為各服務可以獨立驗證權杖,而無需依賴中央工作階段存儲。
簡化開發
存取權杖簡化了在應用程式各部分管理使用者工作階段與權限的流程。由於權杖可以輕鬆地透過標頭或查詢參數傳遞,開發人員可將其應用於多種情境,以低成本提供安全的存取控制。
存取權杖類型
在上述不同情境中,會使用各種類型的存取權杖。選擇存取權杖的類型需考量多項標準,例如安全性需求、互通性,以及應用程式或服務的特定使用情境。
無論使用哪種類型的存取權杖,都應注意它們可用於存取敏感資料,因此需要與其他存取方式相同的安全控制。
常用的存取權杖類型如下。
API 金鑰
API 金鑰用於識別呼叫的程式或使用者,並可用來控制存取權限及追蹤使用情況。
不記名權杖
不記名權杖是一種存取權杖,具有自包含性,代表授予客戶端應用程式的授權。
不記名權杖不包含任何使用者資訊,這意味著持有該權杖的人即可使用它。它們常用於 HTTP 驗證中,客戶端會在 HTTP 請求的授權標頭中提供不記名權杖,以存取受保護的資源。
JSON 網路權杖 (JWT)
JWT(Json Web Token) 是一種自包含的存取權杖,使用基於 JavaScript 物件表示法 (JSON) 的資料結構來編碼身分驗證工作階段及授權範圍的資訊。它們允許資源伺服器在不需與授權伺服器通訊的情況下,驗證權杖的真實性與完整性。JWT 常用於 OpenID Connect 中的身分權杖與存取權杖。
OAuth 存取權杖
OAuth 存取權杖用於 OAuth 驗證通訊協定,允許應用程式在不需要使用者密碼的情況下,存取使用者資料的特定部分。這些權杖可根據不同的範圍與有效期限進行發行,具有高度彈性。
參考權杖
與 JWT 或不記名權杖不同,參考權杖並非自包含的。它們僅是存放於授權伺服器上的權杖資料的參考。當客戶端向資源伺服器提供參考權杖時,資源伺服器必須向授權伺服器發出額外請求,以驗證權杖並取得相關權杖資料。
雖然參考權杖提供額外的安全性與控制能力,但它們需要資源伺服器與授權伺服器之間更多的互動。
重新整理權杖
重新整理權杖與 OAuth 存取權杖搭配使用。當其他權杖過期時,客戶端可以向使用者提供重新整理權杖,而無需重新進行身分驗證。重新整理權杖通常用於使用者需要長期持續存取資源的情況。
存取權杖內容
存取權杖包含資源伺服器用以驗證及授權存取受保護資源所需的資訊。權杖的具體內容會依驗證通訊協定 (例如 OAuth 2.0、OpenID Connect) 及實作方式而有所不同,但通常包括以下資訊。
存取權杖的運作原理
存取權杖透過將使用者的憑證與其在系統中的操作關聯起來運作。當使用者登入系統時,會發行一個存取權杖,其中包含使用者身分及權限的詳細資訊,並附加於使用者在系統中的所有操作上。這使系統能驗證使用者的身分,以及確認其是否有權執行所嘗試的操作。
存取權杖流程概覽
- 授權請求
客戶端將使用者重導向至授權伺服器,並附上客戶端 ID、請求的範圍以及重新導向 URI。 - 身分驗證
使用者或客戶端應用程式向授權伺服器或身分供應商進行身分驗證。 - 授權
授權伺服器驗證使用者憑證,並授予對請求資源的存取權限。 - 存取權杖發行
授權伺服器向已驗證的使用者或客戶端應用程式發行存取權杖,其中包含使用者資訊、權限及存取受保護資源所需的其他中繼資料。 - 存取權杖呈現
客戶端將存取權杖提供給資源伺服器。 - 存取權杖驗證
資源伺服器驗證存取權杖,以確保其真實性、完整性與有效性。 - 資源存取
資源伺服器授予對受保護資源的存取權限。 - 存取權杖到期與更新
當存取權杖到期時,工作階段結束,或客戶端應用程式可取得新的存取權杖(例如透過重新整理權杖)以繼續存取受保護資源。
存取權杖的撤銷
存取權杖的一項強大安全功能是可以在到期前撤銷。需要撤銷存取權杖的情境包括:權杖遭到入侵、使用者登出,或使用者的權限或角色發生變更。
存取權杖可以透過多種方式撤銷。OAuth 2.0 規範了一個撤銷端點,允許客戶端通知授權伺服器使權杖失效。一些系統則使用權杖黑名單機制,將已撤銷的權杖加入黑名單,在每次請求時進行檢查。
使用者通常也能自行撤銷權杖,特別是在應用程式提供檢視與管理活躍工作階段功能的情況下。例如,許多網路服務允許使用者從所有裝置登出,這會撤銷所有活躍的權杖。在使用 API 閘道的環境中,閘道可透過向身分驗證服務查詢或使用撤銷清單來強制執行權杖撤銷,確保權杖仍然有效。
無論以何種方式執行,一旦存取權杖被撤銷,對資源的存取會立即中止。一些系統會維護一個集中化的已撤銷權杖清單,並在每次請求時進行檢查。此清單用於判斷存取權杖是否已被撤銷,並決定是否拒絕其存取。
存取權杖安全性
存取權杖必須妥善保護,以確保存取權杖所支持的身分驗證與授權流程的機密性、完整性與真實性。常見的保護措施包括:
- 將存取權杖綁定至特定的客戶端裝置或使用者工作階段。
- 將存取權杖與額外的身分驗證因素結合使用,例如密碼、生物特徵或硬體權杖。
- 將存取權杖設定為短期有效,並使用重新整理權杖延長使用期限。
- 對存取權杖進行加密。
- 建立存取權杖撤銷機制。
- 實施日誌記錄、監控及稽核機制。
- 限制存取權杖的範圍,只授予完成所需任務的最低權限。
- 安全地儲存存取權杖。
- 透過安全通道傳輸存取權杖(例如 HTTPS)。
- 驗證權杖,包括檢查其簽章、發行者、受眾及到期時間。
存取權杖使用範例
以下是存取權杖常見的使用方式。
API 存取
存取權杖經常用於與 RESTful API 互動時驗證請求。例如,當行動應用程式需要從後端服務取得使用者資料時,應用程式會在請求標頭中包含存取權杖,以證明該請求來自已驗證的使用者。
雲端服務
在雲端環境(例如 AWS、Azure 和 GCP)中,存取權杖可用於向服務或應用程式授予臨時憑證。例如,在 AWS 中,EC2 執行個體可以使用存取權杖與 S3 儲存桶互動。
安全 API 呼叫
行動應用程式是安全 API 呼叫的一個範例。這些應用程式通常使用存取權杖與後端服務安全通訊,確保只有已驗證的使用者能執行操作,例如檢索或更新其資料。
工作階段管理
JSON Web Token (JWT) 可用於管理網頁應用程式的使用者工作階段。使用者登入後,會收到一個 JWT,該權杖會儲存在客戶端(例如本地儲存或 Cookie 中),並隨每次請求一起傳送,以驗證使用者身分。
單一登入 (Single Sign-On , SSO)
在企業環境中,SSO 系統可發行存取權杖,使用戶登入一次即可存取多個應用程式,而無需為每個應用程式單獨進行身分驗證。
第三方服務存取
使用社群或其他帳號(例如 Google 或 Facebook)可登入第三方應用程式。在此情況下,該應用程式會收到一個存取權杖,允許其代表使用者與這些服務互動,而無需使用者再次輸入憑證。
交易驗證
支付閘道經常使用存取權杖來驗證與付款處理相關的 API 請求,確保僅授權的交易得以執行。
依功能選擇存取權杖類型
使用存取權杖可提供低摩擦的身分驗證。存取權杖已被證實是一種可靠的授權與資源委派安全機制,適用於分散式環境。在決定使用哪種類型的存取權杖時,應花時間評估使用情境與需求。