1、什么是token?
参考回答:
定义:token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
使用场景:
在实际应用中,客户端频繁的向服务端请求数据,服务端需要去数据库查询用户名和密码,来验证对比用户名和密码是否正确,这样操作会给数据库造成很大压力,由此就出现的token 的应用场景,当用户第一次登录后,服务器生成一个token返回给客户端,以后客户端只需带上这个token给服务端发送数据即可,无需带上用户名和密码。
实现原理:
基于token的身份验证过程如下:
1、客户端使用用户名和密码请求登录;
2、服务端收到请求,去验证用户名和密码;
3、验证成功后,服务端会签发一个token,再把token发送给客户端;
4、客户端收到token后会把token存储起来,并每次向服务端请求资源的时候都需要带着服务端签发的token;
5、服务端收到请求,然后验证客户端请求里面的带着的token,如果验证成功,就向客户端返回请求的数据。
2、token与session、cookie有什么区别
1、Cookie:
Cookie由服务器生成,发送给浏览器,浏览器将Cookie以kv形式保存到某个目录下的文本文件内,下次请求同一网站时会带着该Cookie发送给服务器
2、Session:
服务器给每个客户端分配不同的“身份标识”,即Session,其保存在服务器上,用户离开网站后Session就会被销毁
3、Token:
Token相比Cookie、Session主要有以下优势,这也是它们之间的主要区别:
1)无状态、可扩展
token机制在服务端不需要存储session信息,因为token自身包含登录用户的信息,只需要在客户端cookie或者介质存储状态信息,因此,在客户端存储token是无状态的,并且能够被扩展。也因正因如此,负载均衡器能够将用户信息从一个服务传到其他服务器上
2)安全性
请求中发送token而不在是发送cookie,这样能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不用于认证。不将信息存储在session中,让我们少了对session的操作。token是有时效的,一段时间之后用户需要重新认证,而且token有撤回的操作,通过token revocation可以使一个特定的token或者一组相同认证的token无效
3)跨平台
当你的客户端是一个原生平台(ios、Android)时,Cookie是不被支持的(你需要通过Cookie容器处理),这时采用token认证机制就会简单得多。
4)基于标准化
API可以采用标准化的JSON Web Token(JWT),这个标准已经存在多个后端库(.NET、Ruby、Java、Python、PHP)和多家公司的支持(Firebase,Google,Microsoft)
5)支持跨域访问
Cookie是不允许跨域访问的,但token机制是不存在这个问题的,只需要传输的用户认证信息通过HTTP头传输即可
6)更适用CDN
可以通过内容分发网路请求服务端的所有资料(如:javascript、HTML、图片等),而服务端只需要提供API即可