<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OAuth2 vs JWT,到底怎么選?

          共 5109字,需瀏覽 11分鐘

           ·

          2021-11-11 21:42

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          轉(zhuǎn)自:樂(lè)傻驢
          鏈接:www.jianshu.com/p/1f2d6e5126cb

          本文會(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è)完全不同的東西。

          先來(lái)搞清楚JWT和OAuth2究竟是干什么的~

          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)。基本思路就是用戶提供用戶名和密碼給認(rèn)證服務(wù)器,服務(wù)器驗(yàn)證用戶提交信息信息的合法性;如果驗(yàn)證成功,會(huì)產(chǎn)生并返回一個(gè)Token(令牌),用戶可以使用這個(gè)token訪問(wèn)服務(wù)器上受保護(hù)的資源。

          一個(gè)token的例子:

          eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

          一個(gè)token包含三部分:

          header.claims.signature

          了安全的在url中使用,所有部分都 base64 URL-safe進(jìn)行編碼處理。

          Header頭部分頭部分簡(jiǎn)單聲明了類型(JWT)以及產(chǎn)生簽名所使用的算法。

          {??"alg"?:?"AES256",??"typ"?:?"JWT"}

          Claims聲明


          聲明部分是整個(gè)token的核心,表示要發(fā)送的用戶詳細(xì)信息。有些情況下,我們很可能要在一個(gè)服務(wù)器上實(shí)現(xiàn)認(rèn)證,然后訪問(wèn)另一臺(tái)服務(wù)器上的資源;或者,通過(guò)單獨(dú)的接口來(lái)生成token,token被保存在應(yīng)用程序客戶端(比如瀏覽器)使用。一個(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)不要把私鑰信息放在客戶端(比如瀏覽器)。

          OAuth2是什么?

          相反,OAuth2不是一個(gè)標(biāo)準(zhǔn)協(xié)議,而是一個(gè)安全的授權(quán)框架。它詳細(xì)描述了系統(tǒng)中不同角色、用戶、服務(wù)前端應(yīng)用(比如API),以及客戶端(比如網(wǎng)站或移動(dòng)App)之間怎么實(shí)現(xiàn)相互認(rèn)證。

          The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. -RFC6749 https://tools.ietf.org/html/rfc6749

          這里簡(jiǎn)單說(shuō)一下涉及到的基本概念。最新面試題整理好了,點(diǎn)擊Java面試庫(kù)小程序在線刷題。

          Roles角色應(yīng)用程序或者用戶都可以是下邊的任何一種角色:

          Client Types客戶端類型這里的客戶端主要指API的使用者。它可以是的類型:

          Client Profile客戶端描述OAuth2框架也指定了集中客戶端描述,用來(lái)表示應(yīng)用程序的類型:

          Authorization Grants認(rèn)證授權(quán)認(rèn)證授權(quán)代表資源擁有者授權(quán)給客戶端應(yīng)用程序的一組權(quán)限,可以是下邊幾種形式:

          OAuth2框架需要下邊幾種終端:

          從上邊這些應(yīng)該可以看出,OAuth2定義了一組相當(dāng)復(fù)雜的規(guī)范。點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          使用HTTPS保護(hù)用戶密碼

          在進(jìn)一步討論OAuth2和JWT的實(shí)現(xiàn)之前,有必要說(shuō)一下,兩種方案都需要SSL安全保護(hù),也就是對(duì)要傳輸?shù)臄?shù)據(jù)進(jìn)行加密編碼。? ?

          安全地傳輸用戶提供的私密信息,在任何一個(gè)安全的系統(tǒng)里都是必要的。否則任何人都可以通過(guò)侵入私人wifi,在用戶登錄的時(shí)候竊取用戶的用戶名和密碼等信息。

          一些重要的實(shí)施考慮在做選擇之前,參考一下下邊提到的幾點(diǎn)。

          時(shí)間投入OAuth2是一個(gè)安全框架,描述了在各種不同場(chǎng)景下,多個(gè)應(yīng)用之間的授權(quán)問(wèn)題。有海量的資料需要學(xué)習(xí),要完全理解需要花費(fèi)大量時(shí)間。甚至對(duì)于一些有經(jīng)驗(yàn)的開(kāi)發(fā)工程師來(lái)說(shuō),也會(huì)需要大概一個(gè)月的時(shí)間來(lái)深入理解OAuth2。這是個(gè)很大的時(shí)間投入。相反,JWT是一個(gè)相對(duì)輕量級(jí)的概念??赡芑ㄒ惶鞎r(shí)間深入學(xué)習(xí)一下標(biāo)準(zhǔn)規(guī)范,就可以很容易地開(kāi)始具體實(shí)施。

          出現(xiàn)錯(cuò)誤的風(fēng)險(xiǎn)OAuth2不像JWT一樣是一個(gè)嚴(yán)格的標(biāo)準(zhǔn)協(xié)議,因此在實(shí)施過(guò)程中更容易出錯(cuò)。盡管有很多現(xiàn)有的庫(kù),但是每個(gè)庫(kù)的成熟度也不盡相同,同樣很容易引入各種錯(cuò)誤。在常用的庫(kù)中也很容易發(fā)現(xiàn)一些安全漏洞。當(dāng)然,如果有相當(dāng)成熟、強(qiáng)大的開(kāi)發(fā)團(tuán)隊(duì)來(lái)持續(xù)OAuth2實(shí)施和維護(hù),可以一定成都上避免這些風(fēng)險(xiǎn)。

          社交登錄的好處在很多情況下,使用用戶在大型社交網(wǎng)站的已有賬戶來(lái)認(rèn)證會(huì)方便。如果期望你的用戶可以直接使用Facebook或者Gmail之類的賬戶,使用現(xiàn)有的庫(kù)會(huì)方便得多。

          結(jié)論

          做結(jié)論前,我們先來(lái)列舉一下 ?JWT和OAuth2的主要使用場(chǎng)景。另外,系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺(tái)發(fā)送:面試,可以在線閱讀。

          JWT使用場(chǎng)景

          無(wú)狀態(tài)的分布式API

          JWT的主要優(yōu)勢(shì)在于使用無(wú)狀態(tài)、可擴(kuò)展的方式處理應(yīng)用中的用戶會(huì)話。服務(wù)端可以通過(guò)內(nèi)嵌的聲明信息,很容易地獲取用戶的會(huì)話信息,而不需要去訪問(wèn)用戶或會(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ù)小程序在線刷題。


          優(yōu)勢(shì)

          • 快速開(kāi)發(fā)
          • 不需要cookie
          • JSON在移動(dòng)端的廣泛應(yīng)用
          • 不依賴于社交登錄
          • 相對(duì)簡(jiǎn)單的概念理解

          限制

          • Token有長(zhǎng)度限制
          • Token不能撤銷
          • 需要token有失效時(shí)間限制(exp)
          • OAuth2使用場(chǎng)景

          在作者看來(lái)兩種比較有必要使用OAuth2的場(chǎng)景:

          外包認(rèn)證服務(wù)器

          上邊已經(jīng)討論過(guò),如果不介意API的使用依賴于外部的第三方認(rèn)證提供者,你可以簡(jiǎn)單地把認(rèn)證工作留給認(rèn)證服務(wù)商去做。? ?也就是常見(jiàn)的,去認(rèn)證服務(wù)商(比如facebook)那里注冊(cè)你的應(yīng)用,然后設(shè)置需要訪問(wèn)的用戶信息,比如電子郵箱、姓名等。

          當(dāng)用戶訪問(wèn)站點(diǎn)的注冊(cè)頁(yè)面時(shí),會(huì)看到連接到第三方提供商的入口。用戶點(diǎn)擊以后被重定向到對(duì)應(yīng)的認(rèn)證服務(wù)商網(wǎng)站,獲得用戶的授權(quán)后就可以訪問(wèn)到需要的信息,然后重定向回來(lái)。

          推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:

          https://github.com/javastacks/spring-boot-best-practice


          優(yōu)勢(shì)

          • 快速開(kāi)發(fā)
          • 實(shí)施代碼量小
          • 維護(hù)工作減少
          大型企業(yè)解決方案

          如果設(shè)計(jì)的API要被不同的App使用,并且每個(gè)App使用的方式也不一樣,使用OAuth2是個(gè)不錯(cuò)的選擇。? ?最新面試題整理好了,點(diǎn)擊Java面試庫(kù)小程序在線刷題。

          考慮到工作量,可能需要單獨(dú)的團(tuán)隊(duì),針對(duì)各種應(yīng)用開(kāi)發(fā)完善、靈活的安全策略。當(dāng)然需要的工作量也比較大!這一點(diǎn),OAuth2的作者也指出過(guò):

          To be clear, OAuth 2.0 at the hand of a developer with deep understanding of web security will likely result is a secure implementation. However, at the hands of most developers – as has been the experience from the past two years – 2.0 is likely to produce insecure implementations. hueniverse - OAuth 2.0 and the Road to Hell

          優(yōu)勢(shì)

          • 靈活的實(shí)現(xiàn)方式
          • 可以和JWT同時(shí)使用
          • 可針對(duì)不同應(yīng)用擴(kuò)展


          參考:
          • http://jwt.io - JWT官方網(wǎng)站,也可以查看到使用不同語(yǔ)言實(shí)現(xiàn)的庫(kù)的狀態(tài)。
          • http://oauth.net/2/ OAuth2官方網(wǎng)站, 也也可以查看到使用不同語(yǔ)言實(shí)現(xiàn)的庫(kù)的狀態(tài)。
          • OAuth 2 tutorials - Useful overview of how OAuth 2 works
          • Oauth2 Spec issues Eran Hammer’s (推進(jìn)OAuth標(biāo)準(zhǔn)的作者) views on what went wrong with the OAuth 2 spec process. Whatever your own opinion, good to get some framing by someone who understand’s key aspects of what make a security standard successful.
          • Thoery and implemnetation: with Laravel and Angular Really informative guide to JWT in theory and in practice for Laravel and Angular.

          加鋒哥微信:?java1239??
          圍觀鋒哥朋友圈,每天推送Java干貨!

          瀏覽 31
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码喷水 | 美女扣逼网站 | 97精品人妻一区二区 | 亚洲性爱一区二区三区 | 三级在线视频观看 |