对于初学者来说,大家对于token的理解不是很深,没关系,接下来我们一起来研究下token。
学习东西首先需要明白这个东西干什么用的,所以首先了解token的作用。有以下场景:
比如说刚刚我使用用户名和密码登录了一个网站(什么网站就无所谓了吧),然后一不小心关闭了浏览器,当我再次打开浏览器进入该网站时发现我已经退出了登录,这个时候我需要重新输入用户名和密码进行重新登录。如果是这样的话会很不友好。并且重新登录需要给服务器端发送用户名和密码,服务器端会根据发送过来的用户名且密码和数据库的用户名和密码进行比对,如果频繁的比较的话会造成服务器端的压力提升。有同学可能会想那有什么压力,不就是个比较嘛,但是同学你要想明白,一个网站在同一时间段内可不是你一个人在登录,这个就能够想明白了吧,所以这样做显然不合适吧。关于以上的描述你应该能够很好的理解吧。
举个例子吧:比如说你是一个门卫(当然你看肯定不是,要不然就不会在这里见面啦是不是),你的职责是负责给客户开门,并且要确认他的身份是不是业主,是业主才可以进入楼房。假设有一个家伙一上午频繁的出入10次,请问你是不是要开10次门,要确认10次身份?(当然你可能觉得觉得出入10次我就记住了,还确认什么确认,但是同学你要想明白,你现在就好比服务器端,服务器可是没有记忆能力的,一个客户端频繁向服务器发送请求,服务器可是不认识的,所以你可以把自己当成一个机器),那这样的话你的压力是不是暴增,烦也烦死了。所以有没有什么好的解决办法吗?那就是给每个客户发送一个令牌(比如门禁),以后他来之后只要带着令牌就可以了,你就不需要去验证身份了,是不是工作量就比较小了?
所以关于频繁给服务器端发送请求验证用户名和密码进行比对这件事是不是就好解决了呢?
如何解决:在浏览器第一次发送用户名和密码比对之后,服务器端会生成一串唯一的符号(令牌),然后响应时将这个令牌返回给客户端进行保存,以后只要我进入这个网站就把这个符号(令牌)发送给服务器端,因此服务器端知道你的身份之后就不需要到数据库进行比对了(因为你有令牌了),直接登录即可。那以上的这个令牌就是token了,token时在服务器端生成,响应时发送给客户端,客户端存在浏览器中(至于存储在什么地方,大家应该知道浏览器的存储技术有哪些吧,cookie/storage都是存储技术吧),以后发送请求带着你的token去服务器端就可以了。
流程如下:
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据