作者 | 魔王不造反
10萬(wàn)開(kāi)發(fā)者都知道的部署方式,你居然不知道!??jì)群瑧屹p活動(dòng)
REST 是一種現代架構風(fēng)格,它定義了一種設計 Web 服務(wù)的新方法。和之前的 HTTP 以及 SOA 不同,它不是一個(gè)協(xié)議(即:一套嚴格的規則),而是一些關(guān)于 Web 服務(wù)應該如何相互通信的一些建議和最佳實(shí)踐。按照 REST 最佳實(shí)踐開(kāi)發(fā)的服務(wù)被稱(chēng)為 “RESTful Web 服務(wù)”。
安全性是 RESTful 服務(wù)的基石。啟用它的方法之一是盡可能內置用戶(hù)身份驗證和授權機制。
在 RESTful 服務(wù)中實(shí)現用戶(hù)身份驗證和授權的方法有很多。我們今天要講的主要方法(或標準)有:
Basic 認證
OAuth 2.0
OAuth 2.0 JWT
最古老也是最簡(jiǎn)單的標準。
看起來(lái)像: 用戶(hù)名 密碼 Base64(對用戶(hù)名和密碼做哈希的基礎算法)。
工作原理:加入有人嘗試登錄用戶(hù)的 Fackbook 賬戶(hù),去訪(fǎng)問(wèn)他的消息、歷史記錄、群組信息,這些都是獨立的服務(wù)。當用戶(hù)輸入用戶(hù)名和密碼后,系統會(huì )允許登錄。但是,默認情況下,系統不知道用戶(hù)的角色和權限是什么,他們可以訪(fǎng)問(wèn)哪些服務(wù)等等。
所以每次用戶(hù)嘗試訪(fǎng)問(wèn)任何一個(gè)服務(wù)的時(shí)候,系統都應該再次驗證是否允許執行這個(gè)操作,這意味著(zhù)需要對身份驗證進(jìn)行額外的調用。就我們的示例中有四個(gè)服務(wù)而言,在這種情況下,每個(gè)用戶(hù)將有四個(gè)額外的調用。
現在假設每秒有 3k 個(gè)請求,在 Facebook 的系統中每秒 300k 請求更現實(shí)。將這請求乘以四,結果是每秒要向服務(wù)器發(fā)出 12k 次調用。
總結:可伸縮性差,大量的額外流量(額外調用)沒(méi)有帶來(lái)業(yè)務(wù)價(jià)值,服務(wù)器的負載很大。
看起來(lái)像:用戶(hù)名 密碼 訪(fǎng)問(wèn)令牌 過(guò)期令牌
工作原理:OAuth 2.0 標準的核心思想是,用戶(hù)使用用戶(hù)名和密碼登錄系統后,客戶(hù)端(用戶(hù)訪(fǎng)問(wèn)系統的設備)會(huì )收到一對令牌,這是一個(gè)訪(fǎng)問(wèn)權限令牌和刷新令牌。
訪(fǎng)問(wèn)令牌用于訪(fǎng)問(wèn)系統中的所有服務(wù)。到期后,系統使用刷新令牌生成一對新的令牌。所以,如果用戶(hù)每天都進(jìn)入系統,令牌也會(huì )每天更新,不需要每次都用用戶(hù)名和密碼登錄系統。刷新令牌也有它的過(guò)期時(shí)間(雖然它比訪(fǎng)問(wèn)令牌長(cháng)得多),如果一個(gè)用戶(hù)一年沒(méi)有進(jìn)入系統,那么很可能會(huì )被要求再次輸入用戶(hù)名和密碼。
OAuth 2.0 標準取代了基本的身份驗證方法,它具有一定的優(yōu)勢,例如用戶(hù)每次想要進(jìn)入系統時(shí)不用輸入用戶(hù)名和密碼。但是,系統仍然需要調用身份驗證服務(wù)器,就像使用基本身份驗證方法時(shí)一樣,以檢查擁有該令牌的用戶(hù)有權限做什么。
假設有效期是一天。這意味著(zhù)登錄服務(wù)器上的負載要少得多,因為用戶(hù)每天只需要輸入一次憑證,而不是每次都要進(jìn)入系統。但是,系統仍需要驗證每個(gè)令牌并檢查用戶(hù)角色的存儲狀態(tài)。所以我們最終還要調用身份驗證服務(wù)器。
總結:和 Basic 驗證有相同的問(wèn)題 - 可伸縮性差,身份驗證服務(wù)器負載較高。
看起來(lái)像:用戶(hù)名 密碼 JSON數據 Base64 私鑰 到期日期
工作原理:當用戶(hù)第一次使用用戶(hù)名和密碼登錄系統時(shí),系統不僅會(huì )返回一個(gè)訪(fǎng)問(wèn)令牌(只是一個(gè)字符串),而是一個(gè)包含所有用戶(hù)信息的 JSON 對象,比如角色和權限,使用 Base64 進(jìn)行編碼并使用私鑰簽名。下圖是它在沒(méi)有編碼的情況下的樣子:
看起來(lái)很可怕,但這確實(shí)有效!主要區別在于我們可以在令牌中存儲狀態(tài),而服務(wù)保持無(wú)狀態(tài)。這意味著(zhù)用戶(hù)自己擁有自己的信息,不需要額外的調用來(lái)檢查它,因為所有的內容都在令牌里。這對于減少服務(wù)器負載方面是一個(gè)很大的優(yōu)勢。這個(gè)標準在世界范圍內得到廣泛應用。
總結:良好的可伸縮性,可以和微服務(wù)一起工作。
一種全新的,奇特的方法,稱(chēng)為 HTTP 簽名,亞馬遜是目前使用它的大廠(chǎng)之一。
它的思路是,當你創(chuàng )建亞馬遜帳戶(hù)的時(shí)候,會(huì )生成一個(gè)永久的、非常安全的訪(fǎng)問(wèn)令牌,你要非常小心地存儲起來(lái)并且不要給任何人顯示。當你要從 Amazon 請求某些資源時(shí),你可以獲取到所有相關(guān)的 http 頭信息,使用這個(gè)私鑰對其進(jìn)行簽名,然后將簽名的字符串作為 header 發(fā)送。
在服務(wù)器端,亞馬遜也有你的訪(fǎng)問(wèn)密鑰。它們接下來(lái)做什么?只需要使用你的 http 頭信息和這個(gè)密鑰進(jìn)行簽名。然后將簽名字符串和你作為簽名的字符串進(jìn)行比較;如果相同那么就知道你是誰(shuí)。
最大的好處是你只需要發(fā)送一次用戶(hù)名和密碼 - 就可以獲得令牌。至于使用私鑰簽名的 header 信息,基本上沒(méi)有機會(huì )對它們進(jìn)行編碼。就算有人截獲了信息——誰(shuí)在乎呢 ;)
英文原文:https://yellow.systems/blog/rest-security-basics

聯(lián)系客服