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>

        JWT(JSON Web Token)簡介、原理與用法

        共 3345字,需瀏覽 7分鐘

         ·

        2023-01-14 16:06

        JSON Web Token(縮寫 JWT)是目前最流行的跨域認(rèn)證解決方案,本文介紹它的原理和用法。

        一、跨域認(rèn)證的問題

        互聯(lián)網(wǎng)服務(wù)離不開用戶認(rèn)證。一般流程是下面這樣。

        1、用戶向服務(wù)器發(fā)送用戶名和密碼。

        2、服務(wù)器驗證通過后,在當(dāng)前對話(session)里面保存相關(guān)數(shù)據(jù),比如用戶角色、登錄時間等等。

        3、服務(wù)器向用戶返回一個 session_id,寫入用戶的 Cookie。

        4、用戶隨后的每一次請求,都會通過 Cookie,將 session_id 傳回服務(wù)器。

        5、服務(wù)器收到 session_id,找到前期保存的數(shù)據(jù),由此得知用戶的身份。

        這種模式的問題在于,擴(kuò)展性(scaling)不好。單機(jī)當(dāng)然沒有問題,如果是服務(wù)器集群,或者是跨域的服務(wù)導(dǎo)向架構(gòu),就要求 session 數(shù)據(jù)共享,每臺服務(wù)器都能夠讀取 session。

        舉例來說,A 網(wǎng)站和 B 網(wǎng)站是同一家公司的關(guān)聯(lián)服務(wù)?,F(xiàn)在要求,用戶只要在其中一個網(wǎng)站登錄,再訪問另一個網(wǎng)站就會自動登錄,請問怎么實現(xiàn)?

        一種解決方案是 session 數(shù)據(jù)持久化,寫入數(shù)據(jù)庫或別的持久層。各種服務(wù)收到請求后,都向持久層請求數(shù)據(jù)。這種方案的優(yōu)點是架構(gòu)清晰,缺點是工程量比較大。另外,持久層萬一掛了,就會單點失敗。

        另一種方案是服務(wù)器索性不保存 session 數(shù)據(jù)了,所有數(shù)據(jù)都保存在客戶端,每次請求都發(fā)回服務(wù)器。JWT 就是這種方案的一個代表。

        二、JWT 的原理

        JWT 的原理是,服務(wù)器認(rèn)證以后,生成一個 JSON 對象,發(fā)回給用戶,就像下面這樣。

              {
        ??"姓名":?"張三",
        ??"角色":?"管理員",
        ??"到期時間":?"2018年7月1日0點0分"
        }

        以后,用戶與服務(wù)端通信的時候,都要發(fā)回這個 JSON 對象。服務(wù)器完全只靠這個對象認(rèn)定用戶身份。為了防止用戶篡改數(shù)據(jù),服務(wù)器在生成這個對象的時候,會加上簽名(詳見后文)。

        服務(wù)器就不保存任何 session 數(shù)據(jù)了,也就是說,服務(wù)器變成無狀態(tài)了,從而比較容易實現(xiàn)擴(kuò)展。

        三、JWT 的數(shù)據(jù)結(jié)構(gòu)

        實際的 JWT 大概就像下面這樣。

        28078ff29520b0b5140d6852d6b0fc9a.webp

        它是一個很長的字符串,中間用點(.)分隔成三個部分。注意,JWT 內(nèi)部是沒有換行的,這里只是為了便于展示,將它寫成了幾行。

        JWT 的三個部分依次如下。

        • Header(頭部)

        • Payload(負(fù)載)

        • Signature(簽名)

        寫成一行,就是下面的樣子。

              
                Header
                .Payload
                .Signature
                

        93b1bf9a705c3e32d56be5595b8d9187.webp

        下面依次介紹這三個部分。

        3.1 Header

        Header 部分是一個 JSON 對象,描述 JWT 的元數(shù)據(jù),通常是下面的樣子。

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

        上面代碼中,alg屬性表示簽名的算法(algorithm),默認(rèn)是 HMAC SHA256(寫成 HS256);typ屬性表示這個令牌(token)的類型(type),JWT 令牌統(tǒng)一寫為JWT

        最后,將上面的 JSON 對象使用 Base64URL 算法(詳見后文)轉(zhuǎn)成字符串。

        3.2 Payload

        Payload 部分也是一個 JSON 對象,用來存放實際需要傳遞的數(shù)據(jù)。JWT 規(guī)定了7個官方字段,供選用。

        • iss (issuer):簽發(fā)人

        • exp (expiration time):過期時間

        • sub (subject):主題

        • aud (audience):受眾

        • nbf (Not Before):生效時間

        • iat (Issued At):簽發(fā)時間

        • jti (JWT ID):編號

        除了官方字段,你還可以在這個部分定義私有字段,下面就是一個例子。

              {
        ??"sub":?"1234567890",
        ??"name":?"John?Doe",
        ??"admin":?true
        }

        注意,JWT 默認(rèn)是不加密的,任何人都可以讀到,所以不要把秘密信息放在這個部分。

        這個 JSON 對象也要使用 Base64URL 算法轉(zhuǎn)成字符串。

        3.3 Signature

        Signature 部分是對前兩部分的簽名,防止數(shù)據(jù)篡改。

        首先,需要指定一個密鑰(secret)。這個密鑰只有服務(wù)器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認(rèn)是 HMAC SHA256),按照下面的公式產(chǎn)生簽名。

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

        算出簽名以后,把 Header、Payload、Signature 三個部分拼成一個字符串,每個部分之間用"點"(.)分隔,就可以返回給用戶。

        3.4 Base64URL

        前面提到,Header 和 Payload 串型化的算法是 Base64URL。這個算法跟 Base64 算法基本類似,但有一些小的不同。

        JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/?token=xxx)。Base64 有三個字符+/=,在 URL 里面有特殊含義,所以要被替換掉:=被省略、+替換成-,/替換成_?。這就是 Base64URL 算法。

        四、JWT 的使用方式

        客戶端收到服務(wù)器返回的 JWT,可以儲存在 Cookie 里面,也可以儲存在 localStorage。

        此后,客戶端每次與服務(wù)器通信,都要帶上這個 JWT。你可以把它放在 Cookie 里面自動發(fā)送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請求的頭信息Authorization字段里面。

              
                Authorization:?Bearer?<token>
                

        另一種做法是,跨域的時候,JWT 就放在 POST 請求的數(shù)據(jù)體里面。

        五、JWT 的幾個特點

        (1)JWT 默認(rèn)是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次。(2)JWT 不加密的情況下,不能將秘密數(shù)據(jù)寫入 JWT。(3)JWT 不僅可以用于認(rèn)證,也可以用于交換信息。有效使用 JWT,可以降低服務(wù)器查詢數(shù)據(jù)庫的次數(shù)。(4)JWT 的最大缺點是,由于服務(wù)器不保存 session 狀態(tài),因此無法在使用過程中廢止某個 token,或者更改 token 的權(quán)限。也就是說,一旦 JWT 簽發(fā)了,在到期之前就會始終有效,除非服務(wù)器部署額外的邏輯。(5)JWT 本身包含了認(rèn)證信息,一旦泄露,任何人都可以獲得該令牌的所有權(quán)限。為了減少盜用,JWT 的有效期應(yīng)該設(shè)置得比較短。對于一些比較重要的權(quán)限,使用時應(yīng)該再次對用戶進(jìn)行認(rèn)證。(6)為了減少盜用,JWT 不應(yīng)該使用 HTTP 協(xié)議明碼傳輸,要使用 HTTPS 協(xié)議傳輸。

        瀏覽 37
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報
        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>
            四虎成人视频| 欧美视频一| 国产高清AV无码| 女同三区| 男女网站在线观看| 女同二人91| 夜夜撸视频| 亚洲一区二区成人网站戴套| 久久草在线观看| 欧美丰满少妇人妻精品| 黄色影片在线观看| 国产黄片免费在线观看| 亚洲人妻无码一区| 国产亚洲久一区二区三区| 欧美AAA在线观看| 一区二区三区电影网| 日韩在线观看av| 黄色A片免费| 免费av观看| 97免费视频在线观看| 91在线无码精品入口电车| 91精品国产综合久久久蜜臀图片| 91精品人妻人人爽| 色伊人网| 女人自慰在线观看| 中字一区人妻水多多| 懂色成人av影院| 亚洲小说图片AV在线| 99精品在线观看| 亚洲不卡视频| 成人无码免费毛片A片| 激情丁香五月| 熟女无码| 国产黄网| 日韩精品三区| AA片在线观看视频在线播放| 国产精品一区在线观看| 亚洲无码视频观看| 五月丁香啪| 人妻少妇视频| 成人网在线视频| 成人在线视频观看| 波多野结衣无码高清| 中文字幕免费高清| 欧美日韩中文字幕无码| 午夜福利成人| 欧美日本国产| 亚洲中文字幕av| 日韩一级黄片| 详情:绿帽夫妻多人运动开淫啪-91n | 人妻久操| 2017天天干天天射| 亚洲综合片| 人人操人人爱人人妻| 男女草比视频| 大肉大捧视频免费观看| 九九九av| 韩国成人无码| 91干干| 小明看台湾成人永久免费视频网站| 久久久精品欧美| 日本一级视频| 欧美一级棒| 久操成人| 97人妻人人揉人人躁人人| 精品免费| 五月激情六月丁香| 黄色av免费在线观看| 亚洲免费专区| 五月激情视频| www黄片| 99热| 抠骚逼| 免费看a的网站| 国产女人18毛片水真多18| 一级片AA| 91成人电影院| 午夜在线无码| 懂色AV成人| 黄色三级av| 日本高清视频免费观看| 国产三级片精品| 综合色婷婷| 成人激情在线观看| 上床网站| 无码精品视频| 一本一道久久综合狠狠躁牛牛影视| 91欧美| 国产精品乱草| 国产高清无码免费视频| 日韩美女在线视频| 国产精品国产三级国产AⅤ| 欧美性猛交ⅩXXX乱大交| 亚洲天堂影音先锋| 91在线一区二区三区| 日本一区二区三区免费观看| 成人视频在线观看黄色18 | 黄色三级网站| 波多野结衣无码流出| 麻豆精品在线播放| 成人中文字幕在线视频| 午夜福利在线播放| 亚韩av| 永久免费黄色视频| 日本五十路熟女视频| 91天天射| 强伦轩人妻一区二区电影| 人人草人人干| 中文字幕浅井香舞被黑人俘虏| 午夜成人福利视频| 亚洲日本一区二区三区| 国精品无码一区二区三区在线秋菊| 在线观看亚洲中文字幕| 波多野结衣大战黑人| 97人妻精品一区二区三区图片| 国产美女av| 亚洲影院在线观看| 香蕉福利视频| 免费观看色情视频| 91精品国产人妻| 日本亚洲精品秘入口A片| www.99在线| 日韩一级免费电影| 五月婷婷激情综合| 久久亚洲欧美| 波多野结衣AV无码| 亚洲成人一区二区在线观看 | 新狠狠干| 西西888WWW大胆视频| 成人小说亚洲一区二区三区| www污| 东京热在线视频观看| 国产成人A| 色天堂影院| 小草久久95| 色婷婷五月激情| 国产精品乱伦片| 高清无码第一页| 黄片天堂| 一级片在线免费观看| 日韩黄色网| 日韩AV无码免费| 久久久久中文字幕| 国产成人无码一区二区在线播放 | 久色婷婷在线| 亚洲av网站在线观看| 我和岳m愉情XXXⅩ视频| 丝袜乱伦| 青青草在线视频免费观看| 北条麻妃无码视频| 黑人中文字幕| 色中色AV| www.豆花视频成人版| 日本熟妇一区二区三区| 国产久久这里只有精品视频| 五夜福利成人视频| 国产一级A片在线观看| 伊人精品| 人妻黄色视频| 俺来也俺就去www色情网| 日本Sm/调教/捆绑/紧缚| 三级无码av| 偷自拍| 黄色免费一级片| 国产在线视频一区| 在线无码一区| 天天日很很操| 狼人综合视频| 韩国人妻无码| 毛片毛片毛片毛片毛片毛片| a国产| 日韩99在线观看| 亚洲videos| 欧美一区三区| 久久伊人大| 91成人精品一区在线播放| 俩小伙3p老熟女露脸| 国产精品午夜在线| 中文字幕在线观看日本| 成人三级片在线| 久久天天| 天天操夜夜操视频免费高清| 黄色视频免费网站| 日本99热| 一区二区三区四区五区在线| 久久精品视频观看| 好好日视频| 二区三区免费视频| 91绿帽人妻-ThePorn| 91在线视频| 91精品少妇| 综合激情AV| 久大香蕉| a在线观看| 国产AV美女| 成人免费黄色视频网站| 2025国产成人精品一区| 99人妻视频| 黄色视频网站日本| 黄色av免费在线| 美女操逼网站| 免费a片在线观看| 色av影音先锋无吗一区| 手机在线毛片| 先锋影音中文字幕| 壹屌探花| 欧美插插插| 特级西西西88大胆无码| 免费A片观看| 中文字幕成人电影| 婷婷色片| 国产无遮挡又黄又爽又色视频| 伊人久久免费| 91精品婷婷国产综合久久韩漫| 亚洲成人性爱在线| 中文字幕黄色片| 中文精品字幕人妻熟女| 夫妻成人免费看片一区二区| 深爱五月天| 久久精品苍井空免费一区二| 亚洲自拍偷拍视频| 久久精品水多多www| 国产成人精品无码片子的价格| 无码人妻在线| 色播五月丁香| 男人的天堂视频在线观看| 日韩成人一级片| 高清无码一区二区三区四区| 欧美激情色色| 黄片网站在线免费观看| 91久久国产综合久久91精品网站| 91免费观看视频| 一区二区中文字幕| 欧美成人大片| 91人妻人人操人人爽| 国产又爽又黄视频| 91视频网站免费观看| 国产香蕉在线观看| 黄色操逼视频| 一级黄在线观看| 大地99中文在线观看| 四虎精品一区二区三区| 亚洲图片中文字幕| 黄色成人网址| 91久久国产| 人人澡人人妻人人爽| 91艹逼| 中文字幕一区二区三区四虎在线| AV无码精品| 操人视频网站| 人人肏人人摸| 天堂成人在线视频| 影音先锋色AV| 在线播放JUY-925被丈夫上司侵犯的第7天 | 水蜜桃成人在线| 在线免费观看视频黄| 水果派av解说| 久操手机在线| 91成人福利视频| 操逼视频国产| 天天干天天在线观看| 无码颜射| 99精品免费视频| 亚洲日韩精品欧美一区二区yw| 日本一区二区三区在线观看网站| 激情视频网址| 国产黄色视频在线播放| 日韩射| 国产成人在线播放| 少妇人妻一级A毛片| 奇米一区| 亚洲AV日韩AV永久无码网站| 黄色大片在线播放| 欧美成人精品欧美一级私黄| 欧美伊人网在线观看| 欧美性生交18XXXXX无码| 国产成人精品电影| 一级黄色在线观看| 骚网站在线观看| 91免费视频在线| 在线免费观看国产视频| 一级黄色操逼视频| 国产啊啊啊| 欧美老妇另类BBwBBw| 麻豆激情| 鸭子AV| 99热免费精品| 大黑鸡巴视频| 操逼专区| 一级黄色网| 香蕉黄色三级片| 国产亚洲成人综合| 国产精品国产精品国产专区不片| 91一区二区在线观看| 水蜜桃视频在线| 亚洲日韩电影| 中文字幕精品一级A片| 欧美日韩无码| 夏目あきら被续侵犯7天| 国产第一夜|