REST API安全基石

REST表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。 作為一種現代架構風格,它定義了一種設計 Web 服務的新方法。和之前的 HTTP 以及 SOA 不同,它不是一個協議(即:一套嚴格的規則),而是一些關於 Web 服務應該如何相互通信的一些建議和最佳實踐。按照 REST 最佳實踐開發的服務被稱為 “RESTful Web 服務”。

安全性是 RESTful 服務的基石。啟用它的方法之一是儘可能內置用戶身份驗證和授權機制。

在 RESTful 服務中實現用戶身份驗證和授權的方法有很多。我們今天要講的主要方法(或標準)有:

  • Basic 認證
  • OAuth 2.0
  • OAuth 2.0 + JWT

為了讓我們的討論更加具體,假設我們的後端程序有微服務,並且每個用戶請求時,必須調用後端的幾個服務來返回請求的數據。所以,我們將不僅從安全性問題方面,而且在它們產生的額外流量和服務器負載的背景下檢查每個標準。

Basic 認證

最古老也是最簡單的標準。

看起來像: 用戶名 + 密碼 + Base64(對用戶名和密碼做哈希的基礎算法)。

工作原理:加入有人嘗試登錄用戶的 Fackbook 賬戶,去訪問他的消息、歷史記錄、群組信息,這些都是獨立的服務。當用戶輸入用戶名和密碼後,系統會允許登錄。但是,默認情況下,系統不知道用戶的角色和權限是什麼,他們可以訪問哪些服務等等。

所以每次用戶嘗試訪問任何一個服務的時候,系統都應該再次驗證是否允許執行這個操作,這意味著需要對身份驗證進行額外的調用。就我們的示例中有四個服務而言,在這種情況下,每個用戶將有四個額外的調用。

現在假設每秒有 3k 個請求,在 Facebook 的系統中每秒 300k 請求更現實。將這請求乘以四,結果是每秒要向服務器發出 12k 次調用。

總結:可伸縮性差,大量的額外流量(額外調用)沒有帶來業務價值,服務器的負載很大。


OAuth 2.0

看起來像:用戶名 + 密碼 + 訪問令牌 + 過期令牌

工作原理:OAuth 2.0 標準的核心思想是,用戶使用用戶名和密碼登錄系統後,客戶端(用戶訪問系統的設備)會收到一對令牌,這是一個訪問權限令牌和刷新令牌。

訪問令牌用於訪問系統中的所有服務。到期後,系統使用刷新令牌生成一對新的令牌。所以,如果用戶每天都進入系統,令牌也會每天更新,不需要每次都用用戶名和密碼登錄系統。刷新令牌也有它的過期時間(雖然它比訪問令牌長得多),如果一個用戶一年沒有進入系統,那麼很可能會被要求再次輸入用戶名和密碼。

OAuth 2.0 標準取代了基本的身份驗證方法,它具有一定的優勢,例如用戶每次想要進入系統時不用輸入用戶名和密碼。但是,系統仍然需要調用身份驗證服務器,就像使用基本身份驗證方法時一樣,以檢查擁有該令牌的用戶有權限做什麼。

假設有效期是一天。這意味著登錄服務器上的負載要少得多,因為用戶每天只需要輸入一次憑證,而不是每次都要進入系統。但是,系統仍需要驗證每個令牌並檢查用戶角色的存儲狀態。所以我們最終還要調用身份驗證服務器.

總結:和 Basic 驗證有相同的問題 - 可伸縮性差,身份驗證服務器負載較高。

OAuth2 + JSON Web 令牌

看起來像:用戶名 + 密碼 + JSON數據 + Base64 + 私鑰 + 到期日期

工作原理:當用戶第一次使用用戶名和密碼登錄系統時,系統不僅會返回一個訪問令牌(只是一個字符串),而是一個包含所有用戶信息的 JSON 對象,比如角色和權限,使用 Base64 進行編碼並使用私鑰簽名。

看起來很可怕,但這確實有效!主要區別在於我們可以在令牌中存儲狀態,而服務保持無狀態。這意味著用戶自己擁有自己的信息,不需要額外的調用來檢查它,因為所有的內容都在令牌裡。這對於減少服務器負載方面是一個很大的優勢。這個標準在世界範圍內得到廣泛應用。

總結:良好的可伸縮性,可以和微服務一起工作。


分享到:


相關文章: