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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JWT(JSON Web Token)简介

發(fā)布時(shí)間:2025/1/21 javascript 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT(JSON Web Token)简介 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 一、JWT是什么
    • 二、跨域認(rèn)證問(wèn)題
    • 三、JWT原理
    • 四、JWT數(shù)據(jù)結(jié)構(gòu)
      • 1、header(頭部)
      • 2、Payload(負(fù)載)
      • 3、Signature
    • 五、JWT是如何工作的

一、JWT是什么

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

二、跨域認(rèn)證問(wèn)題

互聯(lián)網(wǎng)服務(wù)離不開(kāi)用戶認(rèn)證,一般流程如下:

  • 用戶向服務(wù)器發(fā)送用戶名和密碼。
  • 服務(wù)器驗(yàn)證通過(guò)后,在當(dāng)前對(duì)話(session)里面保存相關(guān)數(shù)據(jù),比如用戶角色、登錄時(shí)間等等。
  • 服務(wù)器向用戶返回一個(gè) session_id,寫入用戶的 Cookie。
  • 用戶隨后的每一次請(qǐng)求,都會(huì)通過(guò) Cookie,將 session_id 傳回服務(wù)器。
  • 服務(wù)器收到 session_id,找到前期保存的數(shù)據(jù),由此得知用戶的身份。
  • 這種模式的問(wèn)題在于,擴(kuò)展性(scaling)不好。單機(jī)當(dāng)然沒(méi)有問(wèn)題,如果是服務(wù)器集群,或者是跨域的服務(wù)導(dǎo)向架構(gòu),就要求 session 數(shù)據(jù)共享,每臺(tái)服務(wù)器都能夠讀取 session。

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

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

    三、JWT原理

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

    {"姓名": "張三","角色": "管理員","到期時(shí)間": "2018年7月1日0點(diǎn)0分" }

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

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

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

    實(shí)際返回給前端JWT數(shù)據(jù)結(jié)構(gòu)是這樣

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I kpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg Q

    是一個(gè)很長(zhǎng)的字符串,中間以(.)分割。注意JWT沒(méi)有換行的

    JWT三部分如下:

    Header(頭部) Payload(負(fù)載) Signature(簽名)

    1、header(頭部)

    header典型的由兩部分組成:token的類型(“JWT”)和算法名稱(比如:HMAC SHA256或者RSA等等)。

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

    然后,用Base64對(duì)這個(gè)JSON編碼就得到JWT的第一部分

    2、Payload(負(fù)載)

    JWT的第二部分是payload,它包含聲明(要求)。聲明是關(guān)于實(shí)體(通常是用戶)和其他數(shù)據(jù)的聲明。聲明有三種類型: registered, public 和private

    • Registered claims : 這里有一組預(yù)定義的聲明,它們不是強(qiáng)制的,但是推薦。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
    • Public claims : 可以隨意定義。
    • Private claims : 用于在同意使用它們的各方之間共享信息,并且不是注冊(cè)的或公開(kāi)的聲明。
      官方給了7個(gè)字段供選用
    iss (issuer):簽發(fā)人 exp (expiration time):過(guò)期時(shí)間 sub (subject):主題 aud (audience):受眾 nbf (Not Before):生效時(shí)間 iat (Issued At):簽發(fā)時(shí)間 jti (JWT ID):編號(hào)

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

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

    注意,不要在JWT的payload或header中放置敏感信息,除非它們是加密的。

    3、Signature

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

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

    五、JWT是如何工作的

    在認(rèn)證的時(shí)候,當(dāng)用戶用他們的憑證成功登錄以后,一個(gè)JSON Web Token將會(huì)被返回。此后,token就是用戶憑證了,你必須非常小心以防止出現(xiàn)安全問(wèn)題。一般而言,你保存令牌的時(shí)候不應(yīng)該超過(guò)你所需要它的時(shí)間。

    無(wú)論何時(shí)用戶想要訪問(wèn)受保護(hù)的路由或者資源的時(shí)候,用戶代理(通常是瀏覽器)都應(yīng)該帶上JWT,典型的,通常放在Authorization header中,用Bearer schema。

    header應(yīng)該看起來(lái)是這樣的:

    Authorization: Bearer

    服務(wù)器上的受保護(hù)的路由將會(huì)檢查Authorization header中的JWT是否有效,如果有效,則用戶可以訪問(wèn)受保護(hù)的資源。如果JWT包含足夠多的必需的數(shù)據(jù),那么就可以減少對(duì)某些操作的數(shù)據(jù)庫(kù)查詢的需要,盡管可能并不總是如此。

    如果token是在授權(quán)頭(Authorization header)中發(fā)送的,那么跨源資源共享(CORS)將不會(huì)成為問(wèn)題,因?yàn)樗皇褂胏ookie。

    鳴謝:
    http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html https://www.cnblogs.com/cjsblog/p/9277677.html

    總結(jié)

    以上是生活随笔為你收集整理的JWT(JSON Web Token)简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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