token、cookie和session三者的问题和解决方案

移动互联网的繁荣,出现很多客户端,不同于以往的浏览器,有的终端是不支持cookie的,传统浏览器cookie的模式不太适用。
用户数量的增多,传统的服务端存储session的方式,面对负载均衡多服务器的部署方式,不好解决用户登录的问题。
面对这两个问题,出现了token的验证方式,下面均益数一下三者的区别和问题,以及解决方案。

cookie:

cookie是存在浏览器的标识用户的方式,由服务端为每一个用户签发不同session id发给浏览器存储在cookie,下次访问会带上这个session id,服务端就知道这个访问是哪个用户了。

cookie面临的问题:
  • CSRF(跨站请求伪造)攻击,这个也好解决,很多框架都屏蔽这个问题
  • 有的客户端不支持cookie,需要手动设置,比如小程序
  • 浏览器对cookie有限制,不能手动设置cookie,对于混合嵌套的开发有问题,比如小程序跳转H5页面,不能携带cookie
  • 浏览器对单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

sesssion

session(会话),是存储在服务端标识用户的方式,服务端为每个用户生成不同的session id,还有与之相对应的信息,比如用户id和登录时间等。在php中,就是存储在超全局变量$_SESSION。通过服务端的session和浏览器的cookie一一对应,来区分这个用户是谁。

session面临的问题:
  • 负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享seesion。这个问题也可以将session存在一个服务器中来解决,但是就不能完全达到负载均衡的效果。
  • 每个客户端只需存储自己的session id,但是服务端却需要存储所有用户session id,对服务器也是一个压力

token

token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:sign(签名,经过加密后的数据),相当于上文提到的session id。token可以放在header、url中,在每次网络访问都携带,一般是写请求头header中。相比于cookie,你可以认为只是存储的地方参数不同而已。token相比于cookie就是有cookie的功能,没有cookie的限制。比如其他客户端不会限制header的cookie。token是cookie很好替代品。

解决方案

针对上面提到问题,人们想到的办法是用token代替cookie和seesion。一个token怎么替代两个的呢?
服务端把用户信息加密(token)传给客户端,客户端每次访问都返回token,服务端解密token,就知道这个用户是谁了。通过cpu加解密,服务端就不需要存储session id占用存储空间,就很好的解决负载均衡多服务器的问题了。这个方法叫jwt(json web token的缩写),各个语言的实现方式在这个网站上有https://jwt.io/

使用jwt有一个问题,就是不像cookie和session有自动过期的设置,这个token的状态和过期时间需要自己手动设置。比如说,token中存储用户登录的时间,服务端每次验证这个时间是否过期就可以了。

Leave a Reply

Your email address will not be published. Required fields are marked *