链接:shotCathttps://juejin.im/post/5c6e6063f265da2da53ec8f3
Token是用户身份的验证方式,通常叫它:令牌。当用户第一次登录后,服务器生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。还可以把不变的参数也放进Token,避免多次查库。
Token就象一个护照。第一次需要在前台验证你的身份(通过你的用户名和密码),如果你成功验证了自己,你就可以取得这个通行证。当你走进大楼的时候(试图从调用API获取资源),你会被要求验证你的护照,而不是在前台重新验证。
大概的流程是这样的:
1, 客户端使用用户名和密码请求登录;
2, 服务端收到请求,去验证用户名与密码;
3, 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端;
4, 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里;
5, 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token;
6, 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据;
总的来说就是客户端在首次登陆以后,服务端再次接收http请求的时候,就只认token了,请求只要每次把token带上就行了,服务器端会拦截所有的请求,然后校验token的合法性,合法就放行,不合法就返回401(鉴权失败)。
1.Token 完全由应用管理,所以它可以避开同源策略. (Cookie是不允许垮域访问的,token不存在)
2.Token 可以避免 CSRF 攻击(也是因为不需要cookie了)
3.Token 可以是无状态的,可以在多个服务间共享
4.Token 支持手机端访问(Cookie不支持手机端访问)
服务器只需要对浏览器传来的Token值进行解密,解密完成后进行用户数据的查询,如果查询成功,则通过认证.所以,即时有了多台服务器,服务器也只是做了Token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。
1.占带宽: 正常情况下token要比 session_id更大,需要消耗更多流量,挤占更多带宽.(不过几乎可以忽略)
2.性能问题: 相比于session-cookie来说,token需要服务端花费更多的时间和性能来对token进行解密验证.其实Token相比于session-cookie来说就是一个"时间换空间"的方案.