Springboot 整合jwt
2021-02-16 00:21
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)
下面的序列图展示了该过程:
中文流程介绍:
- 用户使用账号和密码发出POST登录请求;
- 服务器使用私钥创建一个JWT;
- 服务器返回这个JWT给浏览器;
- 浏览器将该JWT串放在请求头中向服务器发送请求;
- 服务器验证该JWT;
- 返回响应的资源给浏览器。
说了这么多JWT到底如何应用到我们的项目中,下面我们就使用SpringBoot 结合 JWT完成用户的登录验证。
应用流程
-
初次登录生成JWT流程图
-
用户访问资源流程图
搭建SpringBoot + JWT工程
pom 依赖
io.jsonwebtoken jjwt0.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
下一篇:Python学习————反射