1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        認(rèn)證姿勢(shì)-Jwt-基礎(chǔ)篇

        共 3395字,需瀏覽 7分鐘

         ·

        2021-10-28 14:04

        點(diǎn)擊上方藍(lán)色字體,關(guān)注我們

        一、定義

        JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

        Json Web Token簡(jiǎn)稱Jwt,是一種開(kāi)放標(biāo)準(zhǔn) (RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間數(shù)據(jù)作為JSON對(duì)象安全地傳輸信息。數(shù)據(jù)信息經(jīng)過(guò)數(shù)字簽名,可以被驗(yàn)證和信任。JWT可以使用秘密(使用 HMAC算法)或使用RSAECDSA公鑰/私鑰對(duì)進(jìn)行簽名。Jwt中簽名加密解密主要依靠加密令牌簽名令牌,加密令牌將信息進(jìn)行加密,避免其他方知道對(duì)應(yīng)聲明的信息內(nèi)容,簽名令牌驗(yàn)證加密信息中聲明的完整性,當(dāng)使用公鑰/私鑰對(duì)對(duì)令牌進(jìn)行簽名時(shí),簽名還證明只有持有私鑰的一方才是對(duì)其進(jìn)行簽名的一方 。

        二、結(jié)構(gòu)

        一個(gè)jwt包含以下結(jié)構(gòu):

        • Header

        • Payload

        • Signature

        各個(gè)部分以點(diǎn).進(jìn)行分隔,xxxx.yyyy.zzzz。

        1、Header

        頭部由令牌類型Jwt以及簽名使用的加密算法類型組成,例如HMAC SHA256RSA。該部分由Base64Url方式進(jìn)行編碼。

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

        2、Payload

        負(fù)載部分,包含了聲明部分,聲明是對(duì)用戶實(shí)體信息以及附加數(shù)據(jù)信息的聲明,分為三種類型,registered聲明、public聲明和private聲明。

        registered聲明,為一組系列規(guī)則預(yù)定義的可用的,可互操作的聲明,例如iss(發(fā)行者)、exp(到期時(shí)間)sub(主題)aud(受眾)等。聲明名稱僅僅三個(gè)字符,在自定義時(shí)需要注意該細(xì)節(jié)。該部分同樣由Base64Url進(jìn)行編碼。

        public聲明,為使用JWT的人隨意定義,為避免沖突,用戶自定義時(shí),應(yīng)盡量避開(kāi)[官方規(guī)范]https://www.iana.org/assignments/jwt/jwt.xhtml中包含的聲明。

        private聲明,由同意使用它們的各方之間共享信息而創(chuàng)建的自定義信息。

        案例如下:

        ?{
        ? ? ?"sub":"testsub",
        ? ? ?"name":"ggcy",
        ? ? ?"iat":1516239022
        ?}

        需要注意的是,在 HeaderPayload 中避免存放涉及到私密內(nèi)容,整體信息防篡改,但是對(duì)信息并不負(fù)責(zé),數(shù)據(jù)內(nèi)容的安全性,這里是讀者需要注意的地方。

        3、Signature

        創(chuàng)建指紋,需要以下幾個(gè)部分,Header、Payload、一個(gè)秘鑰,其中 HeaderPayload 都是需要 Base64Url 進(jìn)行編碼,幾個(gè)部分最終由 Header 定義的加密算法進(jìn)行加密。具體抽象邏輯如下:

        ?HMACSHA256(
        ? ?base64UrlEncode(header) + "." +
        ? ?base64UrlEncode(payload),
        ? ?secret)

        案例如下:header

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

        payload

        ?{
        ? "sub": "1234567890",
        ? "name": "John Doe",
        ? "iat": 1516239022
        ?}

        signature

        ?HMACSHA256(
        ? base64UrlEncode(header) + "." +
        ? base64UrlEncode(payload),
        ? your-256-bit-secret
        ?)
        ?
        ?//生成結(jié)果如下
        ?SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

        組合Jwt,結(jié)構(gòu)如下:xxx.yyy.zzz,內(nèi)容每一部分由.,進(jìn)行間隔。

        ?eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

        如果覺(jué)得以上內(nèi)容過(guò)于枯燥,想要更具體的體會(huì)對(duì)應(yīng)的各個(gè)部分的內(nèi)容,可以訪問(wèn)Jwt官方提供的在線Jwt生成頁(yè)面,https://jwt.io/#debugger-io,進(jìn)行嘗試測(cè)試。

        三、工作流程

        1、用戶請(qǐng)求特定的授權(quán)鏈接進(jìn)行認(rèn)證授權(quán),獲取對(duì)應(yīng)用戶憑證。

        2、用戶憑證登錄成功后,用戶能夠獲取到一個(gè)帶有 Jwt 的返回結(jié)果,獲取到的 Jwt 僅僅是在有效時(shí)間內(nèi)能夠正常使用,操作有效時(shí)間,就將失效。

        3、當(dāng)用戶要訪問(wèn)對(duì)應(yīng)受到權(quán)限保護(hù)的 Api 和資源時(shí),都需要頭部帶有對(duì)應(yīng)有效的 Jwt ,通常在 Header 中,參數(shù)作為 Authorization ,參數(shù)內(nèi)置格式為 Beaer {token} 的方式,附帶到當(dāng)前的請(qǐng)求中。

        四、好處和不足

        說(shuō)了工作原理,那對(duì)應(yīng)使用 Jwt 有什么好處?或者說(shuō)有什么優(yōu)缺點(diǎn)?

        首先考慮一個(gè)問(wèn)題,傳統(tǒng)的憑證下發(fā)方式都有哪些?

        簡(jiǎn)單網(wǎng)絡(luò)令牌 (SWT) 和安全斷言標(biāo)記語(yǔ)言令牌 (SAML)

        1、好處

        1)結(jié)構(gòu)上

        相比Xml,Json的結(jié)構(gòu)更加緊湊,字符串進(jìn)行編碼時(shí),占用的空間更少。

        2)安全上

        SWT 只能由使用 HMAC 算法的共享秘密對(duì)稱簽名,JWTSAML 令牌可以使用 X.509 證書(shū)形式的公鑰/私鑰對(duì)進(jìn)行簽名,使用 Xml 在避免引入隱藏的安全相對(duì)于 Json 是更困難的。

        3)使用上

        Json 解釋器對(duì)于大多數(shù)編程語(yǔ)言來(lái)說(shuō),更加方便,能夠?qū)⒔Y(jié)構(gòu)直接映射到對(duì)象上,操作上更加便捷。Jwt中攜帶的公開(kāi)信息,也能為跨系統(tǒng)交互提供一定的輔助操作。

        2、不足

        1)不是銀彈

        Jwt 并沒(méi)有解決傳統(tǒng) SessionCookie 、OIDC(OpenId Connect) 等方式的跨域和 XSS 問(wèn)題。

        2)依賴秘鑰加密解密

        Jwt的生成和解密都需要依賴于 Secret ,常常需要以硬編碼方式嵌入到系統(tǒng)中(或配置文件),對(duì)于秘鑰的管控,影響了系統(tǒng)的安全性指數(shù)。

        3)客戶端控制缺失

        一旦生成 Jwt 下發(fā)到客戶端,保存在 Jwt 中的信息將對(duì)使用者來(lái)說(shuō),有效期間內(nèi),可視為透明,如果想要像 Session 那樣進(jìn)行遠(yuǎn)程控制異常賬戶,就需要使用更多的手段去彌補(bǔ)。

        4)冗余的數(shù)據(jù)開(kāi)銷

        本質(zhì)上,對(duì)于 Session 來(lái)說(shuō),Jwt的數(shù)據(jù)長(zhǎng)度是比前者大的,如果不對(duì)Payload的長(zhǎng)度進(jìn)行限制,實(shí)際長(zhǎng)度和內(nèi)容大小的優(yōu)勢(shì)將不復(fù)存在。

        五、總結(jié)

        從以上對(duì) Jwt 的學(xué)習(xí)過(guò)程中,可以了解到,Jwt 只是一種在用戶認(rèn)證授權(quán)過(guò)程中,采取的一種比較簡(jiǎn)單并且防信息篡改的憑證方式,并不是事事都能估計(jì)和全面的銀彈,使用時(shí)應(yīng)當(dāng)依據(jù)實(shí)際情況進(jìn)行選擇。

        六、參考鏈接

        [1]JWT-JSON WEB TOKEN使用詳解及注意事項(xiàng):https://cloud.tencent.com/developer/article/1542175 [2] ?Jwt 介紹https://jwt.io/introduction


        往期推薦



        點(diǎn)擊閱讀原文,更精彩~
        瀏覽 51
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            美女把尿口扒开让男人桶在线观看 | 2019中文字幕在线 | 操逼人| 国产精品久久久久久久免费看 | 自拍偷拍在线第一页 | 久久久久久亚洲视频 | 超碰在线 人人 | 黄片综合| 夜夜高潮夜夜爽精品欧美做爱 | 亚洲在线成人 |