REST 是一種現代架構風格,它定義了一種設計 Web 服務的新方法。和之前的 HTTP 以及 SOA 不同,它不是一個協定(即:一套嚴格的規則),而是一些關于 Web 服務應該如何互相通信的一些建議和最佳實踐。按照 REST 最佳實踐開發的服務被稱為 “RESTful Web 服務”。
安全性是 RESTful 服務的基石。啟用它的方法之一是盡可能内置使用者身份驗證和授權機制。
在 RESTful 服務中實作使用者身份驗證和授權的方法有很多。我們今天要講的主要方法(或标準)有:
- Basic 認證
- OAuth 2.0
- OAuth 2.0 + JWT
為了讓我們的讨論更加具體,假設我們的後端程式有微服務,并且每個使用者請求時,必須調用後端的幾個服務來傳回請求的資料。是以,我們将不僅從安全性問題方面,而且在它們産生的額外流量和伺服器負載的背景下檢查每個标準。下面開始吧…
https://blog.didispace.com/rest-api-security-base/#Basic-%E8%AE%A4%E8%AF%81
最古老也是最簡單的标準。
看起來像: 使用者名 + 密碼 + Base64(對使用者名和密碼做哈希的基礎算法)。
工作原理:加入有人嘗試登入使用者的 Fackbook 賬戶,去通路他的消息、曆史記錄、群組資訊,這些都是獨立的服務。當使用者輸入使用者名和密碼後,系統會允許登入。但是,預設情況下,系統不知道使用者的角色和權限是什麼,他們可以通路哪些服務等等。
是以每次使用者嘗試通路任何一個服務的時候,系統都應該再次驗證是否允許執行這個操作,這意味着需要對身份驗證進行額外的調用。就我們的示例中有四個服務而言,在這種情況下,每個使用者将有四個額外的調用。
現在假設每秒有 3k 個請求,在 Facebook 的系統中每秒 300k 請求更現實。将這請求乘以四,結果是每秒要向伺服器發出 12k 次調用。

總結:可伸縮性差,大量的額外流量(額外調用)沒有帶來業務價值,伺服器的負載很大。
https://blog.didispace.com/rest-api-security-base/#OAuth-2-0
看起來像:使用者名 + 密碼 + 通路令牌 + 過期令牌
工作原理:OAuth 2.0 标準的核心思想是,使用者使用使用者名和密碼登入系統後,用戶端(使用者通路系統的裝置)會收到一對令牌,這是一個通路權限令牌和重新整理令牌。
通路令牌用于通路系統中的所有服務。到期後,系統使用重新整理令牌生成一對新的令牌。是以,如果使用者每天都進入系統,令牌也會每天更新,不需要每次都用使用者名和密碼登入系統。重新整理令牌也有它的過期時間(雖然它比通路令牌長得多),如果一個使用者一年沒有進入系統,那麼很可能會被要求再次輸入使用者名和密碼。
OAuth 2.0 标準取代了基本的身份驗證方法,它具有一定的優勢,例如使用者每次想要進入系統時不用輸入使用者名和密碼。但是,系統仍然需要調用身份驗證伺服器,就像使用基本身份驗證方法時一樣,以檢查擁有該令牌的使用者有權限做什麼。
假設有效期是一天。這意味着登入伺服器上的負載要少得多,因為使用者每天隻需要輸入一次憑證,而不是每次都要進入系統。但是,系統仍需要驗證每個令牌并檢查使用者角色的存儲狀态。是以我們最終還要調用身份驗證伺服器。
總結:和 Basic 驗證有相同的問題 - 可伸縮性差,身份驗證伺服器負載較高。
https://blog.didispace.com/rest-api-security-base/#OAuth2-JSON-Web-%E4%BB%A4%E7%89%8C OAuth2 + JSON Web 令牌
看起來像:使用者名 + 密碼 + JSON資料 + Base64 + 私鑰 + 到期日期
工作原理:當使用者第一次使用使用者名和密碼登入系統時,系統不僅會傳回一個通路令牌(隻是一個字元串),而是一個包含所有使用者資訊的 JSON 對象,比如角色和權限,使用 Base64 進行編碼并使用私鑰簽名。下圖是它在沒有編碼的情況下的樣子:
看起來很可怕,但這确實有效!主要差別在于我們可以在令牌中存儲狀态,而服務保持無狀态。這意味着使用者自己擁有自己的資訊,不需要額外的調用來檢查它,因為所有的内容都在令牌裡。這對于減少伺服器負載方面是一個很大的優勢。這個标準在世界範圍内得到廣泛應用。
總結:良好的可伸縮性,可以和微服務一起工作。
https://blog.didispace.com/rest-api-security-base/#%E6%96%B0%E7%8E%A9%E6%84%8F%EF%BC%9A%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%AD%BE%E5%90%8D%E6%96%B9%E5%BC%8F 新玩意:亞馬遜簽名方式
一種全新的,奇特的方法,稱為 HTTP 簽名,亞馬遜是目前使用它的大廠之一。
它的思路是,當你建立亞馬遜帳戶的時候,會生成一個永久的、非常安全的通路令牌,你要非常小心地存儲起來并且不要給任何人顯示。當你要從 Amazon 請求某些資源時,你可以擷取到所有相關的 http 頭資訊,使用這個私鑰對其進行簽名,然後将簽名的字元串作為 header 發送。
在伺服器端,亞馬遜也有你的通路密鑰。它們接下來做什麼?隻需要使用你的 http 頭資訊和這個密鑰進行簽名。然後将簽名字元串和你作為簽名的字元串進行比較;如果相同那麼就知道你是誰。
最大的好處是你隻需要發送一次使用者名和密碼 - 就可以獲得令牌。至于使用私鑰簽名的 header 資訊,基本上沒有機會對它們進行編碼。就算有人截獲了資訊——誰在乎呢 ;)
英文原文: https://yellow.systems/blog/rest-security-basics