JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间做为JSON对象安全地传输信息。因为此信息是通过数字签名的,所以能够被验证和信任。前端
更多信息能够查看官网:jwt.io/introductio…算法
http协议是一种无状态的协议,而这就意味着若是用户向咱们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,由于根据http协议,咱们并不能知道是哪一个用户发送的请求,因此为了让咱们的应用能识别是哪一个用户发出的,咱们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给咱们的应用,这样咱们的应用个就能识别请求来自哪一个用户了,这就是传统的基于sessino认证。浏览器
基于token的鉴权机制相似于http协议也是无状态的,它不须要在服务端去保留用户的认证信息或会话信息。这也就意味着JWT认证机制的应用不须要去考虑用户在哪一台服务器登陆了,这就为应用的扩展提供了便利。安全
认证流程以下:bash
先来看一张JWT的信息的截图:服务器
从上图能够看到,JWT含有三部分:头部(header)、载荷(payload)、签名(signature)。cookie
JWT的头部有两部分信息:session
头部示例以下:并发
{
"alg": "HS256",
"typ": "JWT"
}
复制代码
头部通常使用base64加密,加密后密文:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9机器学习
该部分通常存放一些有效的信息。JWT的标准定义包含五个字段:
载荷示例以下:
{
"sub": "1234567890",
"name": "Java碎碎念",
"iat": 1516239022
}
复制代码
前面两部分都是使用Base64进行编码的,即前端能够解开知道里面的信息。signature 须要使用编码后的header和payload以及咱们提供的一个密钥,而后使用header中指定的签名算法(HS256)进行签名。签名的做用是保证 JWT 没有被篡改过。
三个部分经过.链接在一块儿就是咱们的 JWT 了,因此咱们生成的JWT以下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkphdmHnoo7noo7lv7UiLCJpYXQiOjE1MTYyMzkwMjJ9.LLJIkhJs6SVYlzn3n8fThQmhGutjTDI3RURTLtHV4ls
复制代码
注意:密钥就是用来进行JWT的签发和JWT的验证,因此,它就是你服务端的私钥,在任何场景都不该该泄露出去。
JWT主要使用场景以下:
这是JWT使用最多的场景,一旦用户登陆,每一个后续的请求将包括JWT,从而容许用户访问该令牌容许的路由、服务和资源。
JWT能够用在各方之间安全地传输信息,由于JWT能够进行签名,因此您能够肯定发件人是他们所说的人。另外,因为签名是使用标头和有效负载计算的,所以您还能够验证内容是否未被篡改。
到此JWT的基础和认证原理已经讲完了,下一篇文章将介绍下SpringBoot中整合JWT,敬请期待哦。
推荐阅读
1.利用SpringBoot+Logback手写一个简单的链路追踪
3.SpringBoot中如何灵活的实现接口数据的加解密功能?
5.Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?
限时领取免费Java相关资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高并发分布式、大数据、机器学习等技术。 关注下方公众号便可免费领取: