什么是JWT
JSON Web Tokens(JWT)是一种Web令牌技术标准,由于前后端分离项目不能使用Session,目前普遍使用JWT来进行身份验证。JWT使用Header、Payload和Signature三部分内容生成Token。
Header:通常由alg和typ两部分组成,alg代表使用的算法,有多种算法可以选择,具体可查看官网相关说明,官网地址:https://jwt.io;typ代表token的种类,固定就是JWT,使用Base64Url算法将Header转换成的字符串就是JWT的第一部分。
Payload:载荷,一组用于确认前端用户身份和一些附加信息的键值对,比如用户名和token的签发日期、过期日期等信息。这些键值对的键叫Claims(声明),官网将Claims分为三种:registered, public, and private claims。
- Registered claims:JWT预定义的声明,共有7种,不强制使用。
- Public claims:公共的声明,用户可以自行定义名称,但是需要在IANA JSON Web Token Registry(IANA是互联网数字分配机构)中注册以防止重名,这玩意儿用不到。
- Private claims:私有的声明。自定义的键,只要前后端沟通好每个键代表什么,就可以使用token在前后端共享一些数据。
Payload可以任意组合以上三种声明承载数据,大部分情况下我们都会用到预定义声明的exp,来定义token的失效时间,使用Base64Url算法将Payload转换成的字符串就是JWT的第二部分,由于Base64Url算法转换成的字符串可以使用工具还原数据,不应该在Payload中存放敏感信息,比如密码。
Signature:签名,一般需要一个密钥secret。将Header和Payload转换成的字符串加上secret,使用Header定义的算法进行加密,就生成了token。
Token的验证流程:
token签发:前端登录,后端根据账号密码确认身份,身份验证通过后,由后端生成token返回给前端,前端将token保存在localstorage或sessionStorage中,后端对login请求不做token验证,只做token签发。
token验证:后端除了login请求外,所有的api请求都要经过token验证。前端每次请求都需要携带token,通常放在请求头Header的Authorization字段中,后端对前端的请求携带的token进行解析并获取前端用户信息,验证通过则放行,验证不通过返回错误信息,前端跳转至登录页面。
Springboot+Redis+JJWT完成token验证
JWT只是一种技术标准,在JWT官网推荐了各类编程语言用于使用JWT的库,Java目前星数最多的是JJWT。
- 引入依赖包
- 创建token工具类,用于生成和验证token,生成的token应保存在redis中,解析时从redis读取token进行验证
- 创建登录拦截器用于验证token
- 创建拦截器配置类,将LoginInterceptor注册进去