繁體中文(台灣)
  • OAuth
  • client
  • public
  • confidential
  • PKCE

公開客戶端與機密客戶端有什麼區別?

本文揭示了在 OAuth 中公開客戶端和機密客戶端的區別,以 Logto 應用程序為例。

Darcy Ye
Darcy Ye
Developer

當使用 Logto 創建一個應用程序時,你會注意到有幾種不同的應用程序類型可以選擇,包括單頁應用程序 (SPA)、原生應用程序和傳統 Web 應用程序。直觀地理解,從名字就可以看出,原生應用程序運行在常見的操作系統上,比如手機設備。但是,什麼是 SPA 和傳統 Web 應用程序呢?為什麼我們需要區分這些不同類型的應用程序?這篇文章將揭示這些問題的答案。

開始之前,我們需要對一些概念進行簡單的介紹。

什麼是 OAuth?

OAuth 是一個開放標準的授權代理,通常用作互聯網用戶授權網站或應用程序訪問其在其他網站上的信息,而不需要提供密碼的一種方式。

在最近十年中,它逐漸成為標準授權過程並被谷歌、Meta、微軟等大多數公司廣泛接受。目前使用的版本是 OAuth 2.0

在 OAuth 的背景下,我們之前提到的應用程序被稱為客戶端。只要獲得資源所有者(通常是最終用戶)的授權,它們可以請求受保護的資源。

公開客戶端和機密客戶端

OAuth 根據客戶端保持客戶端憑據機密性的能力,定義了兩種類型的客戶端。

機密客戶端

能夠保持其憑據機密性的客戶端(例如,實施在具有受限客戶端憑據訪問權限的安全服務器上的客戶端)或者能夠通過其他方式進行安全客戶端身份驗證的客戶端。

公開客戶端

無法保持其憑據機密性的客戶端(例如,運行在資源所有者設備上的客戶端,如原生應用程序或基於 Web 的應用程序),並且也無法通過其他方式安全地進行客戶端身份驗證。

SPA、原生應用程序和傳統 Web 應用程序

有了上述基礎知識,我們來看看在 Logto 的上下文中,SPA、原生應用程序和傳統 Web 應用程序意味著什麼,以及它們是否被認為是公開客戶端或機密客戶端。

SPA

SPA 的客戶端代碼從 Web 服務器下載並在資源所有者設備上的用戶代理(如 Web 瀏覽器)中執行。協議數據和憑據對資源所有者而言是容易獲得的(通常也是可見的)。

原生應用程序

原生應用程序被安裝並在資源所有者的設備上執行。協議數據和憑據對資源所有者是可獲得的。通常假定應用程序中包含的任何客戶端身份驗證憑據都可以被提取。

傳統 Web 應用程序

傳統 Web 應用程序是一種運行在 Web 服務器上的客戶端。資源所有者通過 HTML 用戶界面在其設備上的用戶代理中訪問客戶端。客戶端憑據以及發放給客戶端的任何訪問令牌都存儲在 Web 服務器上,資源所有者無法查看或訪問。

所以,我們可以清楚地看到 SPA 和原生應用程序是公開客戶端,而傳統 Web 應用程序是機密客戶端。

你可能會發現,在 Logto 中創建 SPA 或原生應用程序時沒有應用程序密鑰,而傳統 Web 應用程序同時有應用程序 ID 和應用程序密鑰。這是因為公開客戶端的密鑰無法保證安全。

客戶端在 OAuth 授權流中的工作原理是什麼?

開發 OAuth 應用程序的第一步是向 OAuth 服務提供者註冊客戶端。客戶端註冊涉及提供有關應用程序的詳細信息,如其名稱和重定向 URI。然後,OAuth 服務提供者生成客戶端 ID 和客戶端密鑰,這被視為應用程序的憑據。

客戶端 ID 被視為公共信息,並在 OAuth 過程中與用戶共享。它通常包含在授權 URL 中,對最終用戶可見。

另一方面,客戶端密鑰充當應用程序的密碼,必須保密。在 OAuth 過程中,利用它交換授權碼(假設是授權碼流)來獲取訪問令牌。客戶端密鑰的存在確保只有註冊應用程序可以完成訪問令牌的交換。

引入證明碼交換(PKCE)

如前所述,公開客戶端的客戶端密鑰無法保證安全,攻擊者可以獲取客戶端憑據並冒充客戶端訪問受保護的資源,這在任何情況下都是不可接受的。

PKCE(證明碼交換)通過在每次授權流開始時臨時生成一個驗證碼來解決這個問題,該驗證碼在本地存儲並被哈希以生成一個發送給授權服務器的挑戰碼。當交換訪問令牌時,驗證碼再度發送至授權服務器。授權服務器檢查驗證碼和挑戰碼是否匹配,這確保了公開客戶端沒有被冒充。

在 PKCE 中,驗證碼實際上充當了一個動態的客戶端密鑰。其安全性由哈希算法的不可逆性保證。

回顧

本文中,我們討論了 OAuth 中機密客戶端和公開客戶端的概念。我們了解到機密客戶端具備保存秘密並安全存儲敏感信息的能力,而公開客戶端則缺乏這種能力。我們考察了使用 Logto 產品實踐中兩種類型客戶端的例子,包括傳統 Web 應用程序、SPA 和原生應用程序。

我們還討論了在 OAuth 中的客戶端註冊過程以及客戶端 ID 和客戶端密鑰的角色。

此外,我們發現公開客戶端在安全存儲客戶端密鑰時面臨限制。為了克服這一限制,我們介紹了 PKCE(證明碼交換),這是一個 OAuth 擴展,允許公開客戶端在不需要客戶端密鑰的情況下安全地交換授權碼。

我們的產品 Logto 是一個全面的 CIAM 解決方案,遵循 OAuth 和 OIDC 協議的最佳實踐,在每個階段確保安全,包括採用 PKCE 來保護公開客戶端的安全。