SpringBoot+JWT完成token验证
一、JWT是什么
JWT的全称为json web token。是一种生成token的方式。一般我们访问一个系统的流程就是:请求登录接口,该接口会返回一个token,为了防止对象数据被篡改,生成JSON时会加上签名,请求其他接口都要带上token,token验证通过才能访问成功,而JWT就是生成token的一种机制。广义上讲JWT是一个标准的名称;狭义上讲JWT指的就是用来传递的那个token字符串。
二、JWT的组成
JWT含有三个部分:
- 头部(header)
- 载荷(payload)
- 签证(signature)
2.1 头部(header)
头部一般有两部分信息:类型、加密的算法(通常使用HMAC SHA256)
头部一般使用base64加密:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
解密后:
{ "typ":"JWT", "alg":"HS256" }
2.2 载荷(payload)
该部分一般存放一些有效的信息。JWT的标准定义包含五个字段:
- iss:该JWT的签发者
- sub:该JWT所面向的用户
- aud:接收该JWT的一方
- exp(expires):什么时候过期,这里是一个Unit的时间戳
- iat(issued at):在什么时候签发的
2.3签证(signature)
JWT最后一个部分。该部分是使用了HS256加密后的数据;包含三个部分:
- header(base64后的)
- payload(base64后的)
- secret 私钥,secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和JWT的验证,所以,它就是你服务端的秘钥,在任何场景都不应该流露出去。一旦客户端得知这个secret,那就意味着客户端可以自我签发JWT了。
2.4 解密调试器
官网的加密串解密调试器:https://jwt.io/#debugger-io
三、如何使用JWT?
3.1 工作原理
在身份鉴定的实现中,传统的方法是在服务端存储一个 session,但是如果是大并发系统服务器内存占用将不可控,给客户端返回一个 cookie。而使用JWT之后,当用户使用它的认证信息登录系统之后,会返回给用户一个JWT, 用户只需要本地保存该 token(通常使用localStorage,也可以使用cookie)即可。当用户希望访问一个受保护的路由或者资源的时候,通常应该在Authorization头部使用Bearer模式添加JWT,其内容格式:
Authorization: Bearer <token>
请求header形如:
fetch('api/users', { headers: { 'Authorization': 'Bearer ' + token } })
Postman发起JWT请求Header的key为Authorization
,Header的value为Bearer <token>
,示意
因为用户的状态在服务端内容中是不存储的,所以这是一种无状态的认证机制。服务端的保护路由将会检查请求头 Authorization 中的JWT信息,如果合法,则允许用户的行为。由于JWT是自包含的,因此减少了需要查询数据库的需要。JWT的这些特征使得我们可以完全依赖无状态的特性提供数据API服务。因为JWT并不使用Cookie的,所以你可以在任何域名提供你的API服务而不需要担心跨域资源共享问题(CORS)。
3.2 流程介绍:
- 用户使用账号和密码发出POST登录请求;
- 服务器使用私钥创建一个JWT;
- 服务器返回这个JWT给浏览器;
- 浏览器将该JWT串放在请求头中向服务器发送请求;
- 服务器验证该JWT
参考博客:https://www.jianshu.com/p/161fbab47a49,https://blog.csdn.net/tang_seven/article/details/127498184