JWT简单介绍

大家好,我是IT修真院上海分院第6期学员,一枚正直善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务5中,JWT简单介绍。

一、背景介绍

JWT(Json Web Token)定义了一种使用Json形式在网络间安全地传递信息的简洁开放的标准(RFC 7519)。

二、知识剖析

为什么要使用JWT?

传统的session认证方案:

第一次用户认证请求通过时,服务器端存储用户的登录信息,然后在响应时传递给浏览器,浏览器保存为cookie,下次请求时把cookie发送给服务器,服务器根据cookie信息来识别是哪个用户。

传统的session认证弊端:

如果用户增多,Session认证就会暴露问题。因为每个用户在认证后,服务器都会记录Session,一般保存在内存中,随着认证用户增多,服务器开销也会增大。

将用户信息保存在服务器上,认证用户的后续请求都需要到这台保存了自己Session的服务器上验证Cookie。对负载均衡,应用扩展产生限制。

基于Token验证机制:

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

Token验证流程:

1、用户Login

2、服务端验证

3、将用户信息保存在Token中,发送给用户

4、客户端存储Token,并在以后的请求中带上这个Token

5、服务端解析、验证token值

6、服务端将请求数据返回客户端

JWT长什么样?

JWT由头部(Header)、载荷(Payload)、签名(签名)三部分组成。

jwt的头部(Header)承载两部分信息:{ "typ": "JWT", "alg": "HS256" }

typ:声明类型,这里是jwt。alg:声明加密算法,这里是SHA256。

载荷(Payload)就是存放有效信息的地方。这些有效信息包含三个部分:标准中注册的声明、公共的声明和私有的声明。

标准中注册的声明 (建议但不强制使用) :

iss: jwt签发者。

sub: jwt所面向的用户。

aud: 接收jwt的一方。

exp: jwt的过期时间,这个过期时间必须要大于签发时间。

nbf: 定义在什么时间之前,该jwt都是不可用的。

iat: jwt的签发时间。

jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明 :

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密。

私有的声明 :

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

签名(Signature):

将上面的两个编码后的字符串用句号.连接在一起(头部在前)拼接成新的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,就生成了JWT签名。

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

三、常见问题及解决方案

和Session方式存储id的差异:

Session方式存储用户id的最大弊病在于要占用大量服务器内存,对于较大型应用而言可能还要保存许多的状态。一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存储。

而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。除了用户id之外,还可以存储其他的和用户相关的信息,例如该用户是否是管理员、用户所在的分桶。

虽说JWT方式让服务器有一些计算压力(例如加密、编码和解码),但是这些压力相比磁盘I/O而言或许是半斤八两。

单点登录

Session方式来存储用户id,一开始用户的Session只会存储在一台服务器上。对于有多个子域名的站点,每个子域名至少会对应一台不同的服务器。

所以如果要实现在某个子域登录后,在其他的子域名下依然可以取到Session,这要求我们在多台服务器上同步Session。

使用JWT的方式则没有这个问题的存在,因为用户的状态已经被传送到了客户端。因此,我们只需要将含有JWT的Cookie的domain设置为顶级域名即可。

四、编码实战

五、拓展思考

JWT应该保存什么信息?

1、用于辨别用户的信息,如id,username

2、过期时间

3、用户的其余辨识信息:客户端的UA、IP等

六、参考文献

https://www.jianshu.com/p/576dbf44b2ae

http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/

七、更多讨论

PTT连接:PTT

视频连接:视频

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

快来与我一起学习吧~http://www.jnshu.com/login/1/22137050




你可能感兴趣的:(JWT简单介绍)