日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GD项目回顾之JWT

發(fā)布時(shí)間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GD项目回顾之JWT 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.JWT是什么?

詳細(xì)的解釋是:Json web token (JWT)是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519)。該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。

簡單理解的話: JWT是一個(gè)開放標(biāo)準(zhǔn),它定義了一種緊湊的、自包含的方式,用于作為JSON對(duì)象在各方之間安全地傳輸信息,且該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。

是不是還有點(diǎn)迷糊?那就請接著往下看。

2.起源:

說到JWT,就需要先來聊一下傳統(tǒng)的session認(rèn)證和基于token的認(rèn)證的區(qū)別。

2.1傳統(tǒng)的session認(rèn)證

我們知道,http協(xié)議本身是一種無狀態(tài)的協(xié)議,而這就意味著如果用戶向我們的應(yīng)提用供了用戶名和密碼來進(jìn)行用戶認(rèn)證,那么下一次請求時(shí),用戶還要再一次進(jìn)行用戶認(rèn)證才行,因?yàn)楦鶕?jù)http協(xié)議,我們并不能知道是哪個(gè)用戶發(fā)出的請求,所以為了讓我們的應(yīng)用能識(shí)別是哪個(gè)用戶發(fā)出的請求,我們只能在服務(wù)器存儲(chǔ)一份用戶登錄的信息,這份登錄信息會(huì)在響應(yīng)時(shí)傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時(shí)發(fā)送給我們的應(yīng)用,這樣我們的應(yīng)用就能識(shí)別請求來自哪個(gè)用戶了,這就是傳統(tǒng)的基于session認(rèn)證。

但是這種基于session的認(rèn)證使應(yīng)用本身很難得到擴(kuò)展,隨著不同客戶端用戶的增加,獨(dú)立的服務(wù)器已無法承載更多的用戶,而這時(shí)候基于session認(rèn)證應(yīng)用的問題就會(huì)暴露出來:

Session: 每個(gè)用戶經(jīng)過我們的應(yīng)用認(rèn)證之后,我們的應(yīng)用都要在服務(wù)端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內(nèi)存中,而隨著認(rèn)證用戶的增多,服務(wù)端的開銷會(huì)明顯增大。

擴(kuò)展性: 用戶認(rèn)證之后,服務(wù)端做認(rèn)證記錄,如果認(rèn)證的記錄被保存在內(nèi)存中的話,這意味著用戶下次請求還必須要請求在這臺(tái)服務(wù)器上,這樣才能拿到授權(quán)的資源,這樣在分布式的應(yīng)用上,相應(yīng)的限制了負(fù)載均衡器的能力,這也意味著限制了應(yīng)用的擴(kuò)展能力。

CSRF: 因?yàn)槭腔赾ookie來進(jìn)行用戶識(shí)別的, cookie如果被截獲,用戶就會(huì)很容易受到跨站請求偽造的攻擊。

2.2基于token的鑒權(quán)機(jī)制

基于token的鑒權(quán)機(jī)制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶的認(rèn)證信息或者會(huì)話信息。這就意味著基于token認(rèn)證機(jī)制的應(yīng)用不需要去考慮用戶在哪一臺(tái)服務(wù)器登錄了,這就為應(yīng)用的擴(kuò)展提供了便利。

流程上是這樣的:

  • 用戶使用用戶名密碼來請求服務(wù)器
  • 服務(wù)器進(jìn)行驗(yàn)證用戶的信息
  • 服務(wù)器通過驗(yàn)證發(fā)送給用戶一個(gè)token
  • 客戶端存儲(chǔ)token,并在每次請求時(shí)附送上這個(gè)token值
  • 服務(wù)端驗(yàn)證token值,并返回?cái)?shù)據(jù)
  • 這個(gè)token必須要在每次請求時(shí)傳遞給服務(wù)端,它應(yīng)該保存在請求頭里, 另外,服務(wù)端要支持CORS(跨來源資源共享)策略,一般我們在服務(wù)端這么做就可以了Access-Control-Allow-Origin: *。

    那么我們現(xiàn)在回到JWT的主題上。

    3. JSON Web Token的結(jié)構(gòu)是什么樣的

    第一部分為頭部(header),第二部分為載荷(payload,,類似于飛機(jī)上承載的物品),第三部分是簽證(signature)。每部分中間使用點(diǎn)(.)分隔,比如:xxxxx.yyyyy.zzzzz。

    3.1header

    jwt的頭部承載兩部分信息:

    • 聲明類型,這里是jwt
    • 聲明加密的算法 通常直接使用 HMAC SHA256

    完整的頭部就像下面這樣的JSON:

    {"alg": "HS256","typ": "JWT" }

    然后將頭部進(jìn)行base64加密(該加密是可以對(duì)稱解密的),構(gòu)成了第一部分。

    3.2playload

    載荷就是存放有效信息的地方。這個(gè)名字像是特指飛機(jī)上承載的貨品,這些有效信息包含三個(gè)部分

    • 標(biāo)準(zhǔn)中注冊的聲明
    • 公共的聲明
    • 私有的聲明

    標(biāo)準(zhǔn)中注冊的聲明 (建議但不強(qiáng)制使用) :

    • iss: jwt簽發(fā)者
    • sub: jwt所面向的用戶
    • aud: 接收jwt的一方
    • exp: jwt的過期時(shí)間,這個(gè)過期時(shí)間必須要大于簽發(fā)時(shí)間
    • nbf: 定義在什么時(shí)間之前,該jwt都是不可用的.
    • iat: jwt的簽發(fā)時(shí)間
    • jti: jwt的唯一身份標(biāo)識(shí),主要用來作為一次性token,從而回避重放攻擊。

    公共的聲明

    公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息,但不建議添加敏感信息,因?yàn)樵摬糠衷诳蛻舳丝山饷堋?/p>

    私有的聲明

    私有聲明是提供者和消費(fèi)者所共同定義的聲明,一般不建議存放敏感信息,因?yàn)閎ase64是對(duì)稱解密的,意味著該部分信息可以歸類為明文信息。

    定義一個(gè)payload:

    {"sub": "1234567890","name": "zhangsan","admin": true }

    然后將其進(jìn)行base64加密,得到Jwt的第二部分。

    3.3signature

    jwt的第三部分是一個(gè)簽證信息,這個(gè)簽證信息由三部分組成,防止內(nèi)容被處篡改:

    • header (base64后的)
    • payload (base64后的)
    • secret

    這個(gè)部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進(jìn)行加鹽secret組合加密,然后就構(gòu)成了jwt的第三部分。

    var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret');

    將這三部分用,連接成一個(gè)完整的字符串,構(gòu)成了最終的jwt:

    注意:secret是保存在服務(wù)器端的,jwt的簽發(fā)生成也是在服務(wù)器端的,secret就是用來進(jìn)行jwt的簽發(fā)和jwt的驗(yàn)證,所以,它就是你服務(wù)端的私鑰,在任何場景都不應(yīng)該流露出去。一旦客戶端得知這個(gè)secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。

    如何應(yīng)用

    一般是在請求頭里加入Authorization,并加上Bearer標(biāo)注:

    fetch('api/user/1', {
    ? headers: {
    ??? 'Authorization': 'Bearer ' + token
    ? }
    })

    服務(wù)端會(huì)驗(yàn)證token,如果驗(yàn)證通過就會(huì)返回相應(yīng)的資源。整個(gè)流程就是這樣的:

    4.總結(jié)

    4.1優(yōu)點(diǎn)

    • 因?yàn)閖son的通用性,所以JWT是可以進(jìn)行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
    • 因?yàn)橛辛藀ayload部分,所以JWT可以在自身存儲(chǔ)一些其他業(yè)務(wù)邏輯所必要的非敏感信息。
    • 便于傳輸,jwt的構(gòu)成非常簡單,字節(jié)占用很小,所以它是非常便于傳輸?shù)摹?/li>
    • 它不需要在服務(wù)端保存會(huì)話信息, 所以它易于應(yīng)用的擴(kuò)展

    4.2安全相關(guān)

    • 不應(yīng)該在jwt的payload部分存放敏感信息,因?yàn)樵摬糠质强蛻舳丝山饷艿牟糠帧?/li>
    • 保護(hù)好secret私鑰,該私鑰非常重要。
    • 如果可以,請使用https協(xié)議

    總結(jié)

    以上是生活随笔為你收集整理的GD项目回顾之JWT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。