<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    徹底搞懂JWT,看這篇就夠了!

    共 1812字,需瀏覽 4分鐘

     ·

    2020-09-23 18:29

    點擊上方藍色字體,選擇“標星公眾號”

    優(yōu)質(zhì)文章,第一時間送達

    ? 作者?|??聖潔?

    來源 |? urlify.cn/FNN7Ff

    66套java從入門到精通實戰(zhàn)課程分享

    什么是JWT

    Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準(RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。

    JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。

    JWT的構(gòu)成

    第一部分我們稱它為頭部(header)

    第二部分我們稱其為載荷(payload)

    第三部分是簽證(signature).

    header:

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

    • 聲明類型,這里是jwt

    • 聲明加密的算法 通常直接使用 HMAC SHA256

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

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

    playload:

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

    • 標準中注冊的聲明

    • 公共的聲明

    • 私有的聲明

    標準中注冊的聲明?(建議但不強制使用) :

    • iss: jwt簽發(fā)者

    • sub: jwt所面向的用戶

    • aud: 接收jwt的一方

    • exp: jwt的過期時間,這個過期時間必須要大于簽發(fā)時間

    • nbf: 定義在什么時間之前,該jwt都是不可用的.

    • iat: jwt的簽發(fā)時間

    • jti: jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。

    公共的聲明?:
    公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息,因為該部分在客戶端可解密.

    私有的聲明?:
    私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息,因為base64是對稱解密的,意味著該部分信息可以歸類為明文信息。

    定義一個payload:

    然后將其進行base64加密,得到Jwt的第二部分。

    ?signature:

    jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:

    • header (base64后的)

    • payload (base64后的)

    • secret  

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


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


    注意:secret是保存在服務(wù)器端的,jwt的簽發(fā)生成也是在服務(wù)器端的,secret就是用來進行jwt的簽發(fā)和jwt的驗證,

    所以,它就是你服務(wù)端的私鑰,在任何場景都不應(yīng)該流露出去。一旦客戶端得知這個secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。

    ?

    如何應(yīng)用

      在請求頭里加入Authorization,并加上Token標注:

    headers:?{?'Authorization':?'Token'?+?token??

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

    ?

    總結(jié)

    優(yōu)點

    • 因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。

    • 因為有了payload部分,所以JWT可以在自身存儲一些其他業(yè)務(wù)邏輯所必要的非敏感信息。

    • 便于傳輸,jwt的構(gòu)成非常簡單,字節(jié)占用很小,所以它是非常便于傳輸?shù)摹?/span>

    • 它不需要在服務(wù)端保存會話信息, 所以它易于應(yīng)用的擴展

    安全相關(guān)

    • 不應(yīng)該在jwt的payload部分存放敏感信息,因為該部分是客戶端可解密的部分。

    • 保護好secret私鑰,該私鑰非常重要。

    • 如果可以,請使用https協(xié)議




    粉絲福利:108本java從入門到大神精選電子書領(lǐng)取

    ???

    ?長按上方鋒哥微信二維碼?2 秒
    備注「1234」即可獲取資料以及
    可以進入java1234官方微信群



    感謝點贊支持下哈?

    瀏覽 37
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    亚洲综合网址 | 亚洲 欧美 视频 | 亚洲无码成人片 | 国产成人无码综合亚洲日韩不卡 | 午夜8050网站 |