参考:
https://zhuanlan.zhihu.com/p/141485129
一、session、token、cookie三者之间的关系
关于session、token、cookie的文章已经很多了,本文只想结合自己的理解重新整理一遍自己的思路。谈谈对三者的看法。
1、session是在服务端,从实现的数据结构上看类似于hashmap,当然内部原理没有深究,具体实现应该不是用hashmap实现的,毕竟要保证线程安全。session只是为了保存同一客户端发送过来的请求,通过客户端发送过来的唯一标识符来判断是哪一个用户,是否生效等相关信息。
2、cookie是保存在客户端的文本信息,每次请求会携带cookie相关信息。第一点说到了客户端会通过唯一标识符去服务端请求验证,如果使用的是tomcat服务器,这个唯一标识符一般是jsession,客户端请求tomcat服务器,服务器会生成一个jsession返回给客户端,客户端就可以把这个jsession保存到cookie中,以后每次请求都带上,服务端就都会认识了。
3、token令牌,产生的主要目的是减少服务端的数据库查询次数,在单点登录设计中也可以解决跨域问题和jsession不一致问题。token是客户端在第一次请求时带上用户信息和其它信息发送给服务端,服务器校验用户名和密码成功后生成一个token返回给客户端,客户端每次请求都会带上这个token,服务端会每次拦截token,如果token通过则返回数据给前台,如果没有则拦截,跳转登录页面。
二、sessionid和token有什么不同
我看了很多关于这方面的介绍,一直没懂都是服务器生成sessionid和token,保存在session里面,然后返回给客户端,客户端下次请求带上这个唯一标识符,然后通过后台校验,感觉这有什么不一样嘛?
通过我深入的研究才明白,token和sessionid是有很大不同的,token是无状态的,且随机的,每次都会刷新,所以能有效防止以下问题:
1、表单重复提交
2、防止csrf请求攻击
先简单介绍下什么是csrf攻击:
那么利用token是怎么有效的阻止的呢?
因为token是无状态的,所以不会主动在请求的去添加,初次之外,token是随机,会经常刷新,所以在外部代码控制的前提下是不会携带正确的token信息去请求的,这就有效组织了跨站攻击。
对于阻止cors的原理也是也是一样,至于什么什么是cors,可以参考这一篇文章cors跨域之简单请求与预检请求
简单来说token起到的作用也是一样,在首次请求的时候获取token,后面再次发起跨域请求的时候带上这个token,至于第三方恶意代码为什么不能伪造身份也是因为token是无状态和随机的,不会在去请求的时候自动带上token信息。跟cookie信息有本质上的区别,cookie都是有状态的,每次请求会自动带上,很容易被利用。
三、再说说session
这个相信就很容易理解了,通过客户端的唯一标识存储了相关的客户对象,下次请求来了之后拦截查询校验就好了。存在的问题就是分布式,如果多个服务器之间没有将同一个请求请求到同一台服务器就会造成session失效,例如客户端第一次请求的是服务器A,但是第二个请求请求的是服务器B,这个时候就会造成sessionid失效的问题,这对于用户体验来说无疑是致命的。不过现在有了很多的解决办法,使用最多最好的是将session信息存储在redis里面,这样各个服
务直接在redis里取就可以解决session同步的问题了。除此之外还可以解决单点登录session共享的问题。
四、老生常谈的cookie信息
cookie信息是保存在客户端的身份标识信息,长期有效,如果浏览器关了,下次打开如果cookie还在,浏览器会自动带上cookie信息,如果后台校验成功,就不用再重新登录了,给用户的体验较好,但是也带来了一些副作用,例如我前面介绍的csrf跨站请求就是利用了这一点。