JWT介绍&了解

JWT

1. JWT介绍

JWT介绍:

  • WT的全称是json web token 。是一种令牌,。是为了在网络应用环境中传递声明(token令牌)而执行的一种基于json的开发标准(RFC7519).。

  • 这个token被设置的紧凑而安全。特别适用于分布式单点登录(SSO)场景

  • JWT的声明一般是在身份提供者和服务器提供者之间传递被认证的用户身份信息。以便于从资源服务器获取资源。该token可以直接用于被认证和加密

单点登录:有很多项目,但是只用登录一次,相当于,QQ号授权后,可以登录很多应用。

流程上来看:

  1. 用户用用户名和密码登录服务器
  2. 服务器根据用户名和密码验证身份
  3. 验证成功以后,服务器使用jwt产生一个token发送给客户端
  4. 客户端将token保存下载,在以后的每一次请求中将token带上
  5. 服务器可以使用一个过滤器验证token是否有效,如果有效则继续执行,无效则去登录
  6. 这个token必须在每次请求的时候传递给服务器,发送给服务器的时候可以保存在请求头中,服务器一般需要支持CORS策略

JWT结构:
JWT 是由三段信息构成的,将三段信息用 . (点)连接在一次就构成了JWT的字符串:、
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6ImM2OTI3NzAxLTNmNmMtNDA2NS1hOGFiLWNiOWUwMzUzOTViMiIsImlhdCI6MTYxODQ2OTMxMiwiZXhwIjoxNjE4NDcyOTEyfQ.mo3xwud0tH9Tjx2UQUXZohPUBgZhbGsjmG6yUGcrODU

JWT的三段构成:

第一部分:header

jwt的header部分承载了两部分信息:
	声明类型:JWT(如何产生的)
	加密算法:HS256
	完整头部信息如下:
	{"typ":"JWT","alg":"HS256"}
	将这一部分头部信息使用Base64加密后得到
	eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

base64加密是对称的,可以通过base64解密

第二部分:Payload(载荷)

载荷就是存放有效信息的地方,这个信息中包含了三部分
   
    公有的声明
    	公有的声明可以添加任何信息进去,一般添加用户相关的信息或者业务相关的信息,不建议添加敏感信息,因为这部分用户可以在客户端解密
  
    私有的声明
    	是提供者和消费者共同定义的声明,一般也不建议存放敏感信息,也可以解密的
  
    注册的声明 (建议但不强制)
    iss: jwt的签发者
    sub: jwt面向的用户
    aud: 接收jwt的一方
    exp: jwt的过期时间,这个时间一定要大于签发时间
    iat: jwt的签发时间
    nbf: 定义在什么时间之前,jwt是不可用的
    jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
    
    例:
    定义一个载荷
    {"sub":"1234567890","name":"John Doe","admin":true,"jti":"c6927701-3f6c-4065-a8ab-cb9e035395b2","iat":1618469312,"exp":1618472912}
    使用Base64加密后如下
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImp0aSI6ImM2OTI3NzAxLTNmNmMtNDA2NS1hOGFiLWNiOWUwMzUzOTViMiIsImlhdCI6MTYxODQ2OTMxMiwiZXhwIjoxNjE4NDcyOTEyfQ

第三部分:签证Signing

这部分的信息是由三部分组成
header(加密后的)
payload(加密后的)
secret

将上面的三部分使用.连接成字符串,然后将这个字符串使用header中定义的加密算法进行加盐加密,得到第三部分

加密方式如下:
HS256(Base64(header).Base64(payload),secret)

最后得到 mo3xwud0tH9Tjx2UQUXZohPUBgZhbGsjmG6yUGcrODU
需要注意的是secret 是保存在服务器的,jwt的生成也是在服务器生成的,所以secret可以看做进行jwt的签发的盐值。所以secret算是服务器的私钥,在任何情况下都不能将私钥暴露出去。一旦客户端知道了这个私钥,那就意味着客户端可以自我签发jwt了。

使用jwt

添加依赖 :

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>

版权声明:本文为Sunblogy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。