OAuth2 vs JWT,到底怎么選?
本文會(huì)詳細(xì)描述兩種通用的保證API安全性的方法:OAuth2和JSON Web Token (JWT)
假設(shè):
你已經(jīng)或者正在實(shí)現(xiàn)API; 你正在考慮選擇一個(gè)合適的方法保證API的安全性;
JWT和OAuth2比較?
要比較JWT和OAuth2?首先要明白一點(diǎn)就是,這兩個(gè)根本沒(méi)有可比性,是兩個(gè)完全不同的東西。
JWT是一種認(rèn)證協(xié)議 JWT提供了一種用于發(fā)布接入令牌(Access Token),并對(duì)發(fā)布的簽名接入令牌進(jìn)行驗(yàn)證的方法。令牌(Token)本身包含了一系列聲明,應(yīng)用程序可以根據(jù)這些聲明限制用戶(hù)對(duì)資源的訪(fǎng)問(wèn)。 OAuth2是一種授權(quán)框架 另一方面,OAuth2是一種授權(quán)框架,提供了一套詳細(xì)的授權(quán)機(jī)制(指導(dǎo))。用戶(hù)或應(yīng)用可以通過(guò)公開(kāi)的或私有的設(shè)置,授權(quán)第三方應(yīng)用訪(fǎng)問(wèn)特定資源。既然JWT和OAuth2沒(méi)有可比性,為什么還要把這兩個(gè)放在一起說(shuō)呢?實(shí)際中確實(shí)會(huì)有很多人拿JWT和OAuth2作比較。標(biāo)題里把這兩個(gè)放在一起,確實(shí)有誤導(dǎo)的意思。很多情況下,在討論OAuth2的實(shí)現(xiàn)時(shí),會(huì)把JSON Web Token作為一種認(rèn)證機(jī)制使用。這也是為什么他們會(huì)經(jīng)常一起出現(xiàn)。
JSON Web Token (JWT)
JWT在標(biāo)準(zhǔn)中是這么定義的:
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS). -RFC7519 https://tools.ietf.org/html/rfc7519
JWT是一種安全標(biāo)準(zhǔn)。基本思路就是用戶(hù)提供用戶(hù)名和密碼給認(rèn)證服務(wù)器,服務(wù)器驗(yàn)證用戶(hù)提交信息信息的合法性;如果驗(yàn)證成功,會(huì)產(chǎn)生并返回一個(gè)Token(令牌),用戶(hù)可以使用這個(gè)token訪(fǎng)問(wèn)服務(wù)器上受保護(hù)的資源。
一個(gè)token的例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
一個(gè)token包含三部分:
header.claims.signature
了安全的在url中使用,所有部分都 base64 URL-safe進(jìn)行編碼處理。
Header頭部分頭部分簡(jiǎn)單聲明了類(lèi)型(JWT)以及產(chǎn)生簽名所使用的算法。
{??"alg"?:?"AES256",??"typ"?:?"JWT"}
Claims聲明
聲明部分是整個(gè)token的核心,表示要發(fā)送的用戶(hù)詳細(xì)信息。有些情況下,我們很可能要在一個(gè)服務(wù)器上實(shí)現(xiàn)認(rèn)證,然后訪(fǎng)問(wèn)另一臺(tái)服務(wù)器上的資源;或者,通過(guò)單獨(dú)的接口來(lái)生成token,token被保存在應(yīng)用程序客戶(hù)端(比如瀏覽器)使用。一個(gè)簡(jiǎn)單的聲明(claim)的例子:
{??"sub":?"1234567890",??"name":?"John?Doe",??"admin":?true}
Signature簽名
簽名的目的是為了保證上邊兩部分信息不被篡改。如果嘗試使用Bas64對(duì)解碼后的token進(jìn)行修改,簽名信息就會(huì)失效。一般使用一個(gè)私鑰(private key)通過(guò)特定算法對(duì)Header和Claims進(jìn)行混淆產(chǎn)生簽名信息,所以只有原始的token才能于簽名信息匹配。? ?
這里有一個(gè)重要的實(shí)現(xiàn)細(xì)節(jié)。只有獲取了私鑰的應(yīng)用程序(比如服務(wù)器端應(yīng)用)才能完全認(rèn)證token包含聲明信息的合法性。所以,永遠(yuǎn)不要把私鑰信息放在客戶(hù)端(比如瀏覽器)。
OAuth2是什么?
這里簡(jiǎn)單說(shuō)一下涉及到的基本概念。最新面試題整理好了,點(diǎn)擊Java面試庫(kù)小程序在線(xiàn)刷題。
Roles角色應(yīng)用程序或者用戶(hù)都可以是下邊的任何一種角色:
Client Types客戶(hù)端類(lèi)型這里的客戶(hù)端主要指API的使用者。它可以是的類(lèi)型:
Client Profile客戶(hù)端描述OAuth2框架也指定了集中客戶(hù)端描述,用來(lái)表示應(yīng)用程序的類(lèi)型:
使用HTTPS保護(hù)用戶(hù)密碼
一些重要的實(shí)施考慮在做選擇之前,參考一下下邊提到的幾點(diǎn)。
結(jié)論
做結(jié)論前,我們先來(lái)列舉一下 ?JWT和OAuth2的主要使用場(chǎng)景。另外,系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺(tái)發(fā)送:面試,可以在線(xiàn)閱讀。
JWT使用場(chǎng)景
無(wú)狀態(tài)的分布式API
JWT的主要優(yōu)勢(shì)在于使用無(wú)狀態(tài)、可擴(kuò)展的方式處理應(yīng)用中的用戶(hù)會(huì)話(huà)。服務(wù)端可以通過(guò)內(nèi)嵌的聲明信息,很容易地獲取用戶(hù)的會(huì)話(huà)信息,而不需要去訪(fǎng)問(wèn)用戶(hù)或會(huì)話(huà)的數(shù)據(jù)庫(kù)。
在一個(gè)分布式的面向服務(wù)的框架中,這一點(diǎn)非常有用。? ?但是,如果系統(tǒng)中需要使用黑名單實(shí)現(xiàn)長(zhǎng)期有效的token刷新機(jī)制,這種無(wú)狀態(tài)的優(yōu)勢(shì)就不明顯了。最新面試題整理好了,點(diǎn)擊Java面試庫(kù)小程序在線(xiàn)刷題。
優(yōu)勢(shì)
快速開(kāi)發(fā) 不需要cookie JSON在移動(dòng)端的廣泛應(yīng)用 不依賴(lài)于社交登錄 相對(duì)簡(jiǎn)單的概念理解
限制
Token有長(zhǎng)度限制 Token不能撤銷(xiāo) 需要token有失效時(shí)間限制(exp) OAuth2使用場(chǎng)景
在作者看來(lái)兩種比較有必要使用OAuth2的場(chǎng)景:
外包認(rèn)證服務(wù)器
上邊已經(jīng)討論過(guò),如果不介意API的使用依賴(lài)于外部的第三方認(rèn)證提供者,你可以簡(jiǎn)單地把認(rèn)證工作留給認(rèn)證服務(wù)商去做。? ?也就是常見(jiàn)的,去認(rèn)證服務(wù)商(比如facebook)那里注冊(cè)你的應(yīng)用,然后設(shè)置需要訪(fǎng)問(wèn)的用戶(hù)信息,比如電子郵箱、姓名等。
當(dāng)用戶(hù)訪(fǎng)問(wèn)站點(diǎn)的注冊(cè)頁(yè)面時(shí),會(huì)看到連接到第三方提供商的入口。用戶(hù)點(diǎn)擊以后被重定向到對(duì)應(yīng)的認(rèn)證服務(wù)商網(wǎng)站,獲得用戶(hù)的授權(quán)后就可以訪(fǎng)問(wèn)到需要的信息,然后重定向回來(lái)。
來(lái)源:https://mp.weixin.qq.com/s/GjhIv_l2hcPGDQWUimdZ0A
歡迎關(guān)注“Java引導(dǎo)者”,我們分享最有價(jià)值的Java的干貨文章,助力您成為有思想的Java開(kāi)發(fā)工程師!
