好文推荐
网上很多人将token和cookie放在一起作比较,其实这是有问题的,token是作为认证和授权用的,而cookie则是客户端存储的方案,正确的比较应该是token与session的对比,以及cookie与local\session storage的对比。
token与session
从身份认证的角度上来看,两者是走的不一样的机制。
1、session机制通过在服务端维持会话状态,并将会话id存储到客户端cookie中,来达到识别用户状态的目的。
好处是方便,拿来即用。
但是问题也是存在的 。比如说当维持多个会话状态时,服务端的负载就有点大了。还有就是依赖于cookie,那么cookie存在的问题,在这里也存在。
2、token机制是通过验证签名方式来识别用户状态的,服务端需要做的工作是token的签署与验证,不需要维持会话状态,也就是说基于token方式的验证是无状态的,也不依赖于cookie。
cookie与local\session storage
这两者都是客户端存储方案,但也有着很大的不同。
1、用cookie来存储会话id的时候,设置httponly可以用来程度防御xss攻击,但却不能躲开xsrf攻击,必须借助其他方式,比如referer或者加一个随机数。
可以通过绑定到顶级域名的方式来实现多个子系统共享cookie,但是这种方式不够优雅,灵活性低。
2、local\session storage用来存储的时候,优点是容量大,而且增大xsrf攻击的难度,但是却不能抵御xss攻击,安全性问题严重。