既然是區(qū)別和聯(lián)系钧椰,首先就要分別對(duì)雙方的內(nèi)容思想有所了解:
Oauth2:
??????? 是一種安全的授權(quán)框架,提供了一套詳細(xì)的授權(quán)機(jī)制符欠。用戶或應(yīng)用可以通過公開的或私有的設(shè)置嫡霞,授權(quán)第三方應(yīng)用訪問特定資源。它詳細(xì)描述了系統(tǒng)中不同角色希柿、用戶诊沪、服務(wù)前端應(yīng)用(比如API),以及客戶端(比如網(wǎng)站或移動(dòng)App)之間怎么實(shí)現(xiàn)相互認(rèn)證曾撤。
??????? Oauth2定義了一組想當(dāng)復(fù)雜的規(guī)范端姚。涉及到:Roles角色、Client Types客戶端類型挤悉、Client Profile客戶端描述渐裸、Authorization Grants認(rèn)證授權(quán)、Endpoints終端等装悲。
JWT:
??????? 提供了一種用于發(fā)布接入令牌(Access Token),并對(duì)發(fā)布的簽名接入令牌進(jìn)行驗(yàn)證的方法昏鹃。 令牌(Token)本身包含了一系列聲明,應(yīng)用程序可以根據(jù)這些聲明限制用戶對(duì)資源的訪問衅斩。
??????? JWT是一種安全標(biāo)準(zhǔn)盆顾。基本思路就是用戶提供用戶名和密碼給認(rèn)證服務(wù)器畏梆,服務(wù)器驗(yàn)證用戶提交信息信息的合法性您宪;如果驗(yàn)證成功,會(huì)產(chǎn)生并返回一個(gè)Token(令牌)奠涌,用戶可以使用這個(gè)token訪問服務(wù)器上受保護(hù)的資源宪巨。
??????? 一個(gè)token包含三部分:header、claims溜畅、signature
??????? header:? 頭部分簡(jiǎn)單聲明了類型(JWT)以及產(chǎn)生簽名所使用的算法捏卓。
????????{ "alg" :"AES256", "typ" :"JWT"}
??????? claims:? 聲明
??????? 聲明部分是整個(gè)token的核心,表示要發(fā)送的用戶詳細(xì)信息慈格。有些情況下怠晴,我們很可能要在一個(gè)服務(wù)器上實(shí)現(xiàn)認(rèn)證遥金,然后訪問另一臺(tái)服務(wù)器上的資源;或者蒜田,通過單獨(dú)的接口來生成token稿械,token被保存在應(yīng)用程序客戶端(比如瀏覽器)使用。 以下一個(gè)簡(jiǎn)單的聲明例子:
??????? { "sub":"1234567890", "name":"John Doe", "admin":true}
??????? Signature:? 簽名
??????? 簽名的目的是為了保證上邊兩部分信息不被篡改冲粤。如果嘗試使用Bas64對(duì)解碼后的token進(jìn)行修改美莫,簽名信息就會(huì)失效。一般使用一個(gè)私鑰(private key)通過特定算法對(duì)Header和Claims進(jìn)行混淆產(chǎn)生簽名信息梯捕,所以只有原始的token才能于簽名信息匹配厢呵。
??????? 這里有一個(gè)重要的實(shí)現(xiàn)細(xì)節(jié)。只有獲取了私鑰的應(yīng)用程序(比如服務(wù)器端應(yīng)用)才能完全認(rèn)證token包含聲明信息的合法性傀顾。所以襟铭,永遠(yuǎn)不要把私鑰信息放在客戶端(比如瀏覽器)。
JWT和Oauth2的應(yīng)用場(chǎng)景的區(qū)別:
jwt應(yīng)用場(chǎng)景:? 無狀態(tài)的分布式API
??????? JWT的主要優(yōu)勢(shì)在于使用無狀態(tài)锣笨、可擴(kuò)展的方式處理應(yīng)用中的用戶會(huì)話蝌矛。服務(wù)端可以通過內(nèi)嵌的聲明信息,很容易地獲取用戶的會(huì)話信息错英,而不需要去訪問用戶或會(huì)話的數(shù)據(jù)庫。在一個(gè)分布式的面向服務(wù)的框架中隆豹,這一點(diǎn)非常有用椭岩。
但是,如果系統(tǒng)中需要使用黑名單實(shí)現(xiàn)長(zhǎng)期有效的token刷新機(jī)制璃赡,這種無狀態(tài)的優(yōu)勢(shì)就不明顯了判哥。
優(yōu)勢(shì)
??????? 快速開發(fā)
??????? 不需要cookie
??????? JSON在移動(dòng)端的廣泛應(yīng)用
??????? 不依賴于社交登錄
??????? 相對(duì)簡(jiǎn)單的概念理解
限制
??????? Token有長(zhǎng)度限制
??????? Token不能撤銷
??????? 需要token有失效時(shí)間限制(exp)
Oauth2應(yīng)用場(chǎng)景:
1)外包認(rèn)證服務(wù)器
??????? 上邊已經(jīng)討論過,如果不介意API的使用依賴于外部的第三方認(rèn)證提供者碉考,你可以簡(jiǎn)單地把認(rèn)證工作留給認(rèn)證服務(wù)商去做塌计。
??????? 也就是常見的,去認(rèn)證服務(wù)商(比如facebook)那里注冊(cè)你的應(yīng)用侯谁,然后設(shè)置需要訪問的用戶信息锌仅,比如電子郵箱、姓名等墙贱。當(dāng)用戶訪問站點(diǎn)的注冊(cè)頁面時(shí)热芹,會(huì)看到連接到第三方提供商的入口。用戶點(diǎn)擊以后被重定向到對(duì)應(yīng)的認(rèn)證服務(wù)商網(wǎng)站惨撇,獲得用戶的授權(quán)后就可以訪問到需要的信息伊脓,然后重定向回來。
優(yōu)勢(shì)
??????? 快速開發(fā)
??????? 實(shí)施代碼量小
??????? 維護(hù)工作減少
2)大型企業(yè)解決方案
??????? 如果設(shè)計(jì)的API要被不同的App使用魁衙,并且每個(gè)App使用的方式也不一樣报腔,使用OAuth2是個(gè)不錯(cuò)的選擇株搔。
??????? 考慮到工作量,可能需要單獨(dú)的團(tuán)隊(duì)纯蛾,針對(duì)各種應(yīng)用開發(fā)完善邪狞、靈活的安全策略。當(dāng)然需要的工作量也比較大茅撞!這一點(diǎn)帆卓,OAuth2的作者也指出過:
優(yōu)勢(shì)
??????? 靈活的實(shí)現(xiàn)方式
??????? 可以和JWT同時(shí)使用
??????? 可針對(duì)不同應(yīng)用擴(kuò)展
總結(jié):
??????? 總而言之,Oauth2和jwt是完全不同的兩種東西米丘,一個(gè)是授權(quán)認(rèn)證的框架剑令,另一種則是認(rèn)證驗(yàn)證的方式方法(輕量級(jí)概念)。OAuth2不像JWT一樣是一個(gè)嚴(yán)格的標(biāo)準(zhǔn)協(xié)議拄查,因此在實(shí)施過程中更容易出錯(cuò)吁津。盡管有很多現(xiàn)有的庫,但是每個(gè)庫的成熟度也不盡相同堕扶,同樣很容易引入各種錯(cuò)誤碍脏。在常用的庫中也很容易發(fā)現(xiàn)一些安全漏洞。
注意:
??????? 兩種方案都需要SSL安全保護(hù)稍算,也就是對(duì)要傳輸?shù)臄?shù)據(jù)進(jìn)行加密編碼典尾。安全地傳輸用戶提供的私密信息,在任何一個(gè)安全的系統(tǒng)里都是必要的糊探。否則任何人都可以通過侵入私人wifi钾埂,在用戶登錄的時(shí)候竊取用戶的用戶名和密碼等信息。