![ebcd60cdf28b76ee55a978f3f8334a26.png](https://i-blog.csdnimg.cn/blog_migrate/b2a63ba63ce420b042e65f7606d1dc59.png)
在web初期时代,也就是servlet时代,我们知道,一个用户要在一个电商网站进行注册登陆,那么网站必须有一个数据库,用来持久化保存用户的用户名密码的。
之所以放在数据库,就是因为其是存储在磁盘中,不会因为服务器的宕机而使得数据丢失。而存到磁盘类数据库是最方便的处理方式。
用户在登录的时候,经过和数据库的内容进行对比后,验证成功后。在servlet时代,我们有requset、response、session对象,这些对象当然现在还在使用,使用这些对象使得这个登录在一次跳转还是一次登录还是关闭浏览器之前一直处于登录状态。
不管如何,最长的时间就是在你关闭浏览器那刻,也就是说,重新打开浏览器重新打开网站要重新登录。
而如今的网站,你会发现登录都会保持好几天的时间。那么这个是如何做到的呢?
![b046977c944f9feabf40c1a20d2afad0.png](https://i-blog.csdnimg.cn/blog_migrate/8cb1cf06ba72166c091c5a9cacacdf14.jpeg)
那就不得不提出今天的主角JWT(JSON WEB TOKEN)
同servlet验证阶段一样,都需要数据库并进行用户名密码验证。经过验证之后,服务器这里会生成一个TOKEN,然后将其发送给浏览器,浏览器将其保存在cookie内,每次请求携带即可。
而说起TOKEN,它是如何保证用户的身份呢,这里先说说token的结构,它是由三个部分组成,看起来会是xxxx.yyyy.zzzz这个样子
- 第一部分 Header一般保存token类型和加密算法方式然后进行base64编码得到第一部分(这个只是编码,不是加密,可以反编码回去)
- 第二部分 Payload一般是用户和其他数据声明然后进行base64编码得到第二部分
- 第三部分 Signature用第一部分和第二部分编码过后的值加上服务器自己知道的密钥,然后使用第一部分声明的加密算法进行加密后得到第三部分
因为是编码,所以第二部分简单来说只会放用户名而不会放密码等敏感性数据。
为什么能保证用户即为本人?
- 外部人员获取了这条token后,由第一部分和第二部分进行反编码后得到了原有值,但是原有值是无密码的,因此不能获取到登录全信息。
- 外部人员也不能自己伪造token,因第三部分是经过加密的,是无法反解密的。而那个密钥是服务器自己知道的,因此外部人员无法伪装出这条token的第三部分,因此保证安全。
注意:当然如果你的密钥被别人发现,那么说什么也没有用。
一般给token设置一个有效期,只要用户用同一个浏览器不清除cookie就可以保证在有效期内一直是登陆状态。
除此之外,jwt技术当前最广泛应用的是单点登录(听起来很高大上是吧)。
比如说:你有一个百度账号,你在百度知道上面登录了你的账号之后,那么百度地图、百度网盘、百度贴吧等百度旗下产品,你都不需要登录。这就是单点登录。
而在当前微服务横行的时代,只需要剥出一个服务去做Token验证即可使所有服务应用这个服务,非常便利。
公众号回复github、博客等获取相应地址
如有其他情景想了解请留言