JWT 全稱 JSON WEB TOKEN,所以它本質上也是個 token,JWT 由 Header、Payload、Signature 三部分組成,結構上類似 JSON 物件,最后經 base64 編碼后生成 xxx.yyyyy.zzzz 形式的 token 字串,
1)Header:描述了 token 的基本資訊,比如 token 型別與簽名用的演算法
header = '{"typ":"JWT", "alg":"HS256"}' # HS256 表示使用 HMAC-SHA256 生成簽名
2)Payload:載荷,它包含宣告(要求),宣告是關于物體(通常是用戶)和其他資料的宣告,宣告有三種型別: registered, public 和 private,
-
Registered claims : 這里有一組預定義的宣告,它們不是強制的,但是推薦,比如:
iss: 該JWT的簽發者 sub: 該JWT所面向的用戶 aud: 接收該JWT的一方 exp(expires): 什么時候過期,這里是一個Unix時間戳 iat(issued at): 在什么時候簽發的 -
Public claims : 公共的宣告可以添加任何的資訊,一般添加用戶的相關資訊或其他業務需要的必要資訊,但不建議添加敏感資訊,因為該部分在客戶端可解密,
-
Private claims : 私有宣告是提供者和消費者所共同定義的宣告,用于在同意使用它們的各方之間共享資訊,并且不是注冊的或公開的宣告,一般不建議存放敏感資訊,因為base64是對稱解密的,意味著該部分資訊可以歸類為明文資訊,
{
"iat":1422779638,
"name": 'zhangsan'
}
3)Signature:簽名,用于接收方校驗訊息在傳遞程序中是否被篡改、偽造,關于簽名演算法:
- 哈希演算法:MD5、SHA-1、SHA-256、HMAC-SHA256 等
- 特點:屬于哈希演算法,計算數字摘要,不可逆,有碰撞
- 生成簽名:MD5 簽名通常先按照一定規則排列待簽名資料,進行加鹽(拼key),然后使用 MD5 摘要演算法計算摘要,得到的散列值即為 sign
- MD5 驗簽即按照相同的規則排列待簽名資料,使用相同的 key,然后使用 MD5 摘要演算法計算摘要,對比自己得到的 sign 值和對方傳過來的 sign 值是否相等
- 加密演算法:RSA、DSA、ECDS 等
- 特點:屬于加密演算法,對資料進行加解密,可逆
- 生成簽名:使用 MD5、SHA-256 等演算法計算待簽名字串的「數字摘要」,使用私鑰加密,生成「加密數字摘要」
- 驗證簽名:對「加密數字摘要」通過公鑰進行解密,生成「數字摘要2」,比較「數字摘要」與「數字摘要2」,結果相同則簽名驗證通過
注:加密和簽名是兩回事,加密的目的是防止資訊泄露,簽名的目的是防止篡改和偽造,Token 本身并沒有任何加密機制,它依賴于 HTTPS 的通道保密能力,不過應該可以自己為Token增加加密機制,這就帶來了額外的開銷,
下面來看官網的一張圖:

JWT 與 Session 對比
Session 是將用戶資訊、授權串列等都存在服務器,然后將 sessionId(或者摘要)通過 cookie 發送給客戶端,這個 id 很短,相比 jwt 更節省網路開支,服務器每次收到 id 也很容易拿到資料,
Jwt 也是通過 cookie 發送給客戶端,只不過 Jwt 傳遞的資料更長(因為資料里包含了用戶 id、簽名等);待服務端收到用戶請求時再嘗試解密,如果解密成功代表沒有被篡改,并讀取內容,
=> Session 是空間換時間;Token 是時間換空間,兩者各有千秋,并不是誰就有什么巨大優勢,
關于 JWT 如何進行鑒權請參考:
- 【專案雜記】JWT(中):專案中使用 JWT 時用到的工具類
- 【專案雜記】JWT(下):使用 JWT 鑒權整體邏輯實體
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/260649.html
標籤:區塊鏈
上一篇:什么是GIS+?
下一篇:Markdown學習筆記
