Springboot 整合jwt

2021-02-16 00:21

阅读:493

JWT的组成

  JWT含有三个部分:

  • 头部(header)
  • 载荷(payload)
  • 签证(signature)

  头部(header)
  头部一般有两部分信息:类型加密的算法(通常使用HMAC SHA256)
  头部一般使用base64加密:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
  解密后:

{
    "typ":"JWT",
    "alg":"HS256"
}

  载荷(payload)
  该部分一般存放一些有效的信息。JWT的标准定义包含五个字段:

  • iss:该JWT的签发者
  • sub:该JWT所面向的用户
  • aud:接收该JWT的一方
  • exp(expires):什么时候过期,这里是一个Unit的时间戳
  • iat(issued at):在什么时候签发的

  签证(signature)
  JWT最后一个部分。该部分是使用了HS256加密后的数据;包含三个部分:

  • header(base64后的)
  • payload(base64后的)
  • secret 私钥

  secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的秘钥,在任何场景都不应该流露出去。一旦客户端得知这个secret,那就意味着客户端可以自我签发JWT了。

JWT特点

  • 紧凑:意味着这个字符串很小,甚至可以放在URL参数,POST Parameter中以Http Header的方式传输。
  • 自包含:传输的字符串包含很多信息,别人拿到以后就不需要多次访问数据库获取信息,而且通过其中的信息就可以知道加密类型和方式(当然解密需要公钥和密钥)。

如何使用JWT?

  在身份鉴定的实现中,传统的方法是在服务端存储一个 session,给客户端返回一个 cookie,而使用JWT之后,当用户使用它的认证信息登录系统之后,会返回给用户一个JWT, 用户只需要本地保存该  token(通常使用localStorage,也可以使用cookie)即可。

  当用户希望访问一个受保护的路由或者资源的时候,通常应该在 Authorization 头部使用 Bearer 模式添加JWT,其内容格式:

Authorization: Bearer >技术图片

   因为用户的状态在服务端内容中是不存储的,所以这是一种无状态的认证机制。服务端的保护路由将会检查请求头 Authorization 中的JWT信息,如果合法,则允许用户的行为。由于JWT是 自包含的,因此,减少了需要查询数据库的需要。

JWT的这些特征使得我们可以完全依赖无状态的特性提供数据API服务。因为JWT并不使用Cookie的,所以你可以在任何域名提供你的API服务而不需要担心跨域资源共享问题(CORS)

  下面的序列图展示了该过程:

技术图片

 

中文流程介绍:

  1. 用户使用账号和密码发出POST登录请求;
  2. 服务器使用私钥创建一个JWT;
  3. 服务器返回这个JWT给浏览器;
  4. 浏览器将该JWT串放在请求头中向服务器发送请求;
  5. 服务器验证该JWT;
  6. 返回响应的资源给浏览器。

说了这么多JWT到底如何应用到我们的项目中,下面我们就使用SpringBoot 结合 JWT完成用户的登录验证。

应用流程

  • 初次登录生成JWT流程图

     技术图片
  • 用户访问资源流程图

    技术图片

技术图片

搭建SpringBoot + JWT工程

  pom 依赖    

       io.jsonwebtoken
			jjwt
			0.9.0

  application.properties

##jwt配置
# 代表这个JWT的接收对象,存入audience
audience.clientId=
# 密钥, 经过Base64加密, 可自行替换
audience.base64Secret=
# JWT的签发主体,存入issuer
audience.name=
# 过期时间,时间戳
audience.expiresSecond=

 

源码下载地址:https://github.com/pyygithub/JWT-DEMO.git

 

 


评论


亲,登录后才可以留言!