[筆記] JWT Java Json Web Token (一)

jwt實現

JWT簡單介紹

  • Json web token (JWT), 是爲了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準。該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登陸(SSO)場景。JWT的聲明通常被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也能夠增長一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。也就是說JWT是Token的一種表述性聲明規範。

JWT(Json Web Token)

JWT生成編碼後的樣子

  • 結構相似 xxx.yyy.zzz
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImF1ZCI6IuWkqeihjOWBpeeuoeeQhueUqOaItyIsImF1ZGllbmNlIjoid2ViIiwibmJmIjoxNTA3Njg0OTQyLCJpc3MiOiJ3d3cuMW9uZS5jbiIsImV4cCI6MTUwNzY4Njc0MiwiaWF0IjoxNTA3Njg0OTQyLCJqdGkiOjEwMDB9.GGF0kFbxNk2ezzuXEJVBZyyL4e4BYMdpse73cSDrUut7cbVyYuLG1CNr8RI7eI3VHz9sdCB14Kesi8rP-v3VJA
  • base64解析以後
{
	"body":{  
		"sub":"admin",  
		"aud":"用戶",  
		"audience":"web",  
		"nbf":1507684942,  
		"iss":"www.z201.cn",  
		"exp":1507686742,   
		"iat":1507684942,   
                 "jti":1000
	},
	"header":{
		"typ":"JWT",
		"alg":"HS512"
	},
	"signature":"GGF0kFbxNk2ezzuXEJVBZyyL4e4BYMdpse73cSDrUut7cbVyYuLG1CNr8RI7eI3VHz9sdCB14Kesi8rP-v3VJA"
}

JWT的構成

  • 第一部分咱們稱它爲頭部(header),第二部分咱們稱其爲載荷(body),第三部分是簽證(signature)。

header

  • jwt的頭部承載兩部分信息:
  • 聲明類型,這裏是jwt
  • 聲明加密的算法 一般直接使用 HMAC HS512
  • 完整的頭部就像下面這樣的JSON:
{
  'typ': 'JWT', //
  'alg': 'HS512'
}
  • 而後將頭部進行base64加密(該加密是能夠對稱解密的),構成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9

body

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

  • 標準中註冊的聲明github

    • 公共的聲明web

    • 私有的聲明算法

    • 標準中註冊的聲明 (建議但不強制使用) :json

  • iss: jwt簽發者安全

  • sub: jwt所面向的用戶服務器

  • aud: 接收jwt的一方網絡

  • exp: jwt的過時時間,這個過時時間必需要大於簽發時間分佈式

  • nbf: 定義在什麼時間以前,該jwt都是不可用的.編碼

  • iat: jwt的簽發時間

  • jti: jwt的惟一身份標識,主要用來做爲一次性token,從而回避重放攻擊。

  • eyJzdWIiOiJhZG1pbiIsImF1ZCI6IuWkqeihjOWBpeeuoeeQhueUqOaItyIsImF1ZGllbmNlIjoid2ViIiwibmJmIjoxNTA3Njg0OTQyLCJpc3MiOiJ3d3cuMW9uZS5jbiIsImV4cCI6MTUwNzY4Njc0MiwiaWF0IjoxNTA3Njg0OTQyLCJqdGkiOjEwMDB9
  • 而後將Body進行base64加密(該加密是能夠對稱解密的),構成了第二部分.

"body":{
		"sub":"admin",
		"aud":"用戶",
		"audience":"web",
		"nbf":1507684942,
		"iss":"www.z201.cn",
		"exp":1507686742,
		"iat":1507684942,
		"jti":1000
	}

signature

  • jwt的第三部分是一個簽證信息,這個簽證信息由三部分組成:
  • header (base64後的)
  • body(base64後的)
  • secret
"signature":"GGF0kFbxNk2ezzuXEJVBZyyL4e4BYMdpse73cSDrUut7cbVyYuLG1CNr8RI7eI3VHz9sdCB14Kesi8rP-v3VJA"
  • 這個部分須要base64加密後的header和base64加密後的body使用.鏈接組成的字符串,而後經過header中聲明的加密方式進行加鹽secret組合加密,而後就構成了jwt的第三部分。

  • 最後將signature進行base64加密(該加密是能夠對稱解密的),構成了第三部分。

  • 密鑰secret是保存在服務端的,服務端會根據這個密鑰進行生成token和驗證,因此須要保護好。

JWT注意事項

  • body不要存放敏感信息,由於該部分用base64編碼,在客戶端是可解的;
  • 服務端保護好secret私鑰,一旦客戶端得帶私匙就能夠本身簽發 JWT 了;

jwt擴展

  • 由於token是保留到客戶端,因此服務端secret保護變得額外重要,建議將配置信息中secret加密後使用。不建議全局使用同一secret加密。
  • REST風格推薦使用json傳輸數據,因此能夠採用signature進行數據加密後提交。signature每次刷新都會更新因此安全級別將提升不少。
相關文章
相關標籤/搜索