日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

什么是JWT

Json web token(JWT)是為了網絡應用環境間傳遞聲明而執行的一種基于JSON的開發標準(RFC 7519),該token被設計為緊湊且安全的,特別適用于分布式站點的單點登陸(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密

起源

說起JWT,我們應該來談一談基于token的認證和傳統的Session認證的區別。

傳統的session認證

我們知道,http協議本身是一種無狀態的協議,而這就意味著如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協議,我們并不能知道是哪個用戶發送的請求,所以為了讓我們的應用能識別是哪個用戶發出的,我們只能在服務器存儲一份用戶登陸的信息,這份登陸信息會在響應時傳遞給服務器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的英喲個就能識別請求來自哪個用戶了,這就是傳統的基于sessino認證

但是這種基于session的認證使應用本身很難得擴展,隨著不用客戶端的增加,獨立的服務器已無法承載更多的用戶,而這個時候基于session認證應用的問題就會暴露出來

基于session認證所顯露的問題

Session:每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大

擴展性:用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,響應的限制了負載均衡器的能力,也意味著限制了應用的擴展性

CSRF:因為是基于cookie來進行用戶識別的,cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

基于token的鑒權機制

基于token的鑒權機制類似于http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或會話信息。這也就意味著機遇tokent認證機制的應用不需要去考慮用戶在哪一臺服務器登陸了,這就為應用的擴展提供了便利流程是這樣的

  • 用戶使用用戶名密碼請求服務器
  • 服務器進行驗證用戶信息
  • 服務器通過驗證發送給用戶一個token
  • 客戶端存儲token,并在每次請求時附加這個token值
  • 服務器驗證token,并返回數據

這個token必須要在每次請求時發送給服務器,它應該保存在請求頭中,另外,服務器要支持CORS(跨來源資源共享)策略,一般我們在服務端這么做就可以了 Access-Control-Allow-Origin:*

JWT的構成

JWT是由三部分構成,將這三段信息文本用鏈接構成了JWT字符串。就像這樣

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ9.Qjw1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U

第一部分我們稱它為頭部(header)第二部分我們稱其為載荷(payload,類似于飛機上承載的物品),第三部分是簽證(signature)

header

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

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

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

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

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

plyload

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

  • 標準中注冊的聲明
  • 公共的聲明
  • 私有的聲明

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

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

公共的聲明:

公共的聲明可以添加任何的信息,一般添加用戶的相關信息或其它業務需要的必要信息,但不建議添加敏感信息,因為該部分在客戶端可解密;

私有的聲明

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

定義一個payload

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

然后將其base64加密,得到jwt的一部分

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

Signature

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

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

這個部分需要base64加密后的header和base64加密后的payload使用“.”連接組成的字符串,然后通過header中聲明的加密方式進行加secret組合加密,然后就構成了jwt的第三部分

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

將這三部分用“.”連接成一個完整的字符串,構成了最終的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服務器端的,jwt的簽發也是在服務端的,secret就是用來進行jwt的簽發和jwt的驗證,所以它就是你服務端的私鑰,在任何場景都不應該流露出去,一旦客戶端得知這個secret,那就意味著客戶端可以自我簽發jwt了

應用

一般是在請求頭里加入Authorization,并加上Bearer標注:

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

服務端會驗證token,如果驗證通過就會返回相應的資源,整個流程就是這樣

JWT(JSON WEB TOKEN)為啥這么流行

 

總結

優點

  • 因為json的通用性,所以JWT是可以跨語言支持的,像C#,JAVAScript,NodeJS,php等許多語言都可以使用
  • 因為由了payload部分,所以JWT可以在自身存儲一些其它業務邏輯所必要的非敏感信息
  • 便于傳輸,jwt的構成非常簡單,字節占用很小,所以它是非常便于傳輸的
  • 它不需要在服務端保存會話信息,所以它易于應用的擴展

安全相關

  • 不應該在jwt的payload部分存儲敏感信息,因為該部分是客戶端可解密的部分
  • 保護好secret私鑰。該私鑰非常重要
  • 如果可以,請使用https協議

分享到:
標簽:JWT
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定