[笔记] 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每次刷新都会更新因此安全级别将提升不少。
相关文章
相关标签/搜索