JWT(JSON Web Token)是为了在网络应用环境中传递声明而执行的一种基于 JSON 的开放标准。JWT 的声明一般被用在身份提供者和服务提供者间传递被认证的用户身份信息, 以便从资源服务器获取资源。
比如在用户登录时,基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息的合法性;如果验证成功,会产生并返回一个 Token,后续请求用户带上这个 Token ,服务端就可以识别这个请求的身份信息。
JWT 由三部分构成,
第一部分是头部(Header);
第二部分是消息体(Payload);
第三部分是签名(Signature)。
一个 JWT 生成的 Token 格式为:
token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)
头部的信息通常由两部分内容组成,令牌的类型和使用的签名算法,比如下面的代码:
{ "alg": "HS256", "typ": "JWT" }
消息体中可以携带一些应用需要的信息,比如用户 ID,代码如下:
{ "id": "1001", "name": "yinjihuan"}
签名是用来判断消息在传递的路径上是否被篡改的,从而保证数据的安全性,格式如下:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
通过这三部分就组成了我们的 JSON Web Token。
如何使用请参考 Github:https://github.com/jwtk/jjwt
如上图所示:请求到达 Tomcat 后,可以调用单独的 Token 服务进行 Token 的生成,也可以将 Token 的生成逻辑封装成一个 jar 包来使用。需要注意的是如果用内嵌的方式,对应 Token 的加密配置要一致,否则会出现验证失败的情况。
Token 有点不好的地方在于无法主动让它失效,比如我们用 Session 的场景,用户退出登录,直接将 Session 信息在服务端删除即可,即使后面用相同的 Session 信息去请求,服务端也找不到对应的信息了。
Token 是一个加密的字符串,里面包含了用户的信息,加密算法,过期时间。如果过期时间设置的比较长,也就意味着在过期时间之前都可以使用。
如果要实现退出登录的功能,既然不能对 Token 本身的过期时间进行改造,那么可以使用一个黑名单的机制来进行过滤即可。将退出登录的 Token 存储起来,使用的地方去匹配是否注销了,然后进行拦截即可。
关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号猿天地发起人。
我整理了一份很全的学习资料,感兴趣的可以微信搜索「猿天地」,回复关键字 「学习资料」获取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分库分表,任务调度框架 XXL-JOB,MongoDB,爬虫等相关资料。