文章不保證最新,最新版請到博客 www.huborui.com/ 查看。html
JSON Web Token
是一個很是簡單實用的規範,經過它能夠在客戶端和服務端以前傳遞安全可靠的數據。web
jwt 由三部分組成:算法
將這三部分用 .
鏈接起來就構成一個 jwt(header.payload.signature
)。json
下面就經過這三個部分道出從 jwt 生成到獲取數據的原理。安全
header 描述 jwt 的基本信息,如類型、簽名所用算法等。服務器
{ // 類型爲 JWT "typ": "JWT", // HS256 算法 "alg": "HS256" }
對 header 進行 Base64
編碼,獲得第一部分。ui
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
沒錯,Base64 編碼並非加密方式,能夠還原的!不加密咱們的 jwt 還安全麼?繼續看下去。編碼
payload 是攜帶數據的地方,咱們能夠將須要傳遞到服務端的數據放在 payload 內。加密
既然咱們的寶貝數據放在 payload,那它會不會被加密?設計
不會!仍是 Base64 編碼,能夠還原的!因此不要往裏面放貴重的數據。
{ // 官方定義了 5 個字標識一些信息 // jwt 簽發者 "iss": "god", // 在何時簽發 "iat": 1441525213, // exp 何時過時 Unix 時間戳 "exp": 1441525324, // 接收 jew 的用戶 "aud": "xxx@yyy.com" // jwt 面向的用戶 "sub": "xxx@yyy.com" // 剩下的就能夠本身定義了 "userID": 12345, ... }
依舊 Base64 編碼,獲得第二部分的字符串和 header 用 .
拼在一塊兒。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0
別急,是否是以爲都是明文的數據,服務器如何判斷 jwt 的真假呢?下面就到了簽名加密環節。
在簽名環節,咱們須要提供一個只有你知道的密鑰(secret),對連在一塊兒的 header 和 payload 用 HS256
算法加密,獲得加密後的字符串,和前面的拼在一塊兒:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcm9tX3VzZXIiOiJCIiwidGFyZ2V0X3VzZXIiOiJBIn0.rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
三部分合體成功!jwt 構形成功!
是否能僞造 jwt 呢?仔細想一想就知道,若是你不知道服務端的密鑰,手動修改 header 或 payload 的任何部分,獲得的 Base64 編碼就不同了,新的編碼通過密鑰生成的簽名確定和舊的不一樣。沒有正確的簽名,服務器會直接返回錯誤。
服務器驗證一個 jwt 的過程也很簡單:
jwt 的核心就是密鑰,擁有密鑰就擁有生成 jwt 的權利(千萬不能泄露)。
payload 中的數據不是加密的,不要放敏感數據。