官术网_书友最值得收藏!

5.2 Web常見5種認證方式

由于Web的開放性,越來越多的企業(yè)將服務架設到網絡上,對于Web的認證最常見的有以下5種認證方式:HTTP Basic Auth、OAuth2、Cookie-Session Auth、Token Auth和JWT。

5.2.1 HTTP Basic Auth

HTTP Basic Auth是一種最古老的安全認證方式,這種方式就是在用戶訪問網站/API時,需要使用訪問的用戶名和密碼,由于此種方式容易泄露信息,所以現(xiàn)在使用得越來越少了。若想使用此種方式至少采用雙因素認證,除了用戶名與密碼,還需要使用一個類似動態(tài)的手機驗證碼才能驗證通過。

5.2.2 OAuth2

開放授權(Open Authorization,OAuth)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密資源,而無需將用戶名和密碼提供給第三方。比如,通過QQ、微信和微博等登錄第三方平臺。OAuth1.0版本發(fā)布后有許多安全漏洞,所以在OAuth2.0(以下簡寫為OAuth2)中完全廢止了OAuth1.0,OAuth2關注客戶端開發(fā)的簡易性,要么通過組織在資源擁有者和HTTP服務商之間被批準的交互動作代表用戶,要么允許第三方應用代表用戶獲得訪問的權限。

OAuth2認證和授權的過程中有這3個角色。

● 服務提供方:提供受保護的服務和資源,用戶在此存有數據。

● 用戶:在服務提供方存儲數據(照片、資料等)的人。

● 客戶端:服務調用方,它要訪問服務提供方的資源,需要在服務提供方進行注冊。

OAuth2認證和授權的過程如下。

1)用戶想操作存放在服務提供方的資源。

2)用戶登錄客戶端,客戶端向服務提供方請求一個臨時Token(令牌)。

3)服務提供方驗證客戶端的身份后,給它一個臨時Token。

4)客戶端獲得臨時Token后,將用戶引導至服務提供方的授權頁面,并請求用戶授權。(在這個過程中會將臨時Token和客戶端的回調鏈接/接口發(fā)送給服務提供方,服務提供方在用戶認證并授權后會回來調用這個接口)。

5)用戶輸入用戶名和密碼登錄,登錄成功后,可以授權客戶端訪問服務提供方的資源。

6)授權成功后,服務提供方將用戶引導至客戶端的網頁(調用第4步中的回調鏈接/接口)。

7)客戶端根據臨時Token從服務提供方獲取正式的Access Token(訪問令牌)。

8)服務提供方根據臨時Token及用戶的授權情況授予客戶端Access Token。

9)客戶端使用Access Token訪問用戶存放在服務提供方的受保護的資源。

5.2.3 Cookie-Session Auth

Cookie-Session認證機制就是為一次請求認證在服務器端創(chuàng)建一個Session對象,同時在客戶端的瀏覽器端創(chuàng)建一個Cookie對象,通過客戶端的Cookie對象與服務器端的Session對象匹配來實現(xiàn)狀態(tài)管理。默認的,當用戶關閉瀏覽器時,Cookie會被刪除。但可以通過修改Cookie的過期時間使Cookie在一定時間內有效。

基于Session認證所顯露的問題如下。

1)Session增多會增加服務器開銷。每個用戶經過系統(tǒng)的應用認證后,系統(tǒng)的應用都要在服務器端做一次記錄,以方便用戶下次請求的鑒別,通常Session都保存在內存中,隨著認證用戶的增多,服務器端的開銷會明顯增大。

2)分布式或多服務器環(huán)境中適應性不好。用戶認證后,服務器端做認證記錄,如果認證的記錄被保存在內存中,這意味著用戶下次請求必須在同一臺服務器上,這樣才能獲取授權的資源。在分布式的應用上,這種方式相應地限制了負載均衡器的能力,即限制了應用的擴展能力。不過,現(xiàn)在某些服務器可以通過設置粘性Session來做到每臺服務器之間的Session共享。

3)容易遭到跨站請求仿造攻擊。基于Cookie來進行用戶識別,如果Cookie被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

5.2.4 Token Auth

基于Token的鑒權機制類似于HTTP協(xié)議,是無狀態(tài)的,它不需要在服務器端保留用戶的認證信息或會話信息。這就意味著基于Token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄,這就為應用的擴展提供了便利。

基于Token的認證流程如下。

1)用戶使用用戶名和密碼來請求服務器。

2)服務器驗證用戶的信息。

3)服務器通過驗證發(fā)送給用戶一個Token。

4)客戶端存儲Token值,并在每次請求時附送這個Token值。

5)服務器端驗證Token值,并返回數據。

Token Auth的優(yōu)點如下。

● 支持跨域訪問:Cookie是不允許垮域訪問的,Token機制支持跨域訪問,前提是用戶認證信息通過HTTP頭傳輸。

● 無狀態(tài)(也稱服務器端可擴展行):Token機制在服務器端不需要存儲Session信息,因為Token自身包含了所有登錄用戶的信息,只需要在客戶端的Cookie或本地介質存儲狀態(tài)信息。

● 更適用的內容分發(fā)網絡(Content Delivery Network,CDN):可以通過內容分發(fā)網絡請求服務器端的所有資料(如JavaScript、HTML和圖片等),而服務器端只需提供API即可。

● 去耦:不需要綁定到一個特定的身份驗證方案。Token可以在任何地方生成,只要在API被調用時,Token可以生成調用即可。

● 更適用于移動應用:當客戶端是一個原生平臺(iOS、Android和Windows 8等)時,Cookie是不被支持的,此時采用Token認證機制會簡單得多。

5.2.5 JWT

JWT(JSON Web Token)作為一個開放的標準(RFC 7519),定義了一種簡潔、自包含的方法,用于通信雙方之間以JSON對象的形式安全地傳遞信息。因為數字簽名的存在,這些信息是可信的,JWT可以使用密鑰相關的哈希運算消息認證碼(Hash-based Message Authentlcation Code,HMAC)算法或RSA的公私秘鑰對進行簽名。

JWT身份認證的特點如下。

● 簡潔性:可以通過URL、POST參數或在HTTP header發(fā)送,因為數據量小,傳輸速度很快。

● 自包含性:負載中包含了所有用戶所需要的信息,避免了多次查詢數據庫。

下列場景中使用JWT是很有用的。

● 授權(Authorization):這是使用JWT最常見的場景。一旦用戶登錄,后續(xù)每個請求都將包含JWT,允許用戶訪問該令牌允許的路由、服務和資源。單點登錄是現(xiàn)在廣泛使用的JWT的一個特性,它的開銷很小,可以輕松地跨域使用。

● 信息交換(Information Exchange):對于安全地在各方之間傳輸信息而言,JSON Web Tokens無疑是一種很好的方式。因為JWT可以被簽名,例如,用公鑰/私鑰對可以確定發(fā)送者的身份。另外,由于簽名是使用頭和有效負載計算的,還可以驗證內容有沒有被篡改。

主站蜘蛛池模板: 铁岭县| 海安县| 平南县| 鹤庆县| 南雄市| 宝兴县| 遵化市| 大荔县| 吉林省| 海南省| 中牟县| 白朗县| 林周县| 河池市| 颍上县| 南京市| 自贡市| 宝应县| 微山县| 嘉荫县| 云南省| 张家港市| 永靖县| 永昌县| 嵊州市| 合山市| 通城县| 衡山县| 惠来县| 丰宁| 循化| 望奎县| 卫辉市| 桂林市| 邛崃市| 右玉县| 滨海县| 淮南市| 缙云县| 贵溪市| 涞源县|