背景
因为http是一个无状态协议,不会记忆上一次请求,比如一些登录功能的请求,每次都需重新识别区分用户,而cookie、session和token的发明都能够明确服务端在为哪个客户端提供服务。
cookie
1、cookie是保存在客户端本地的数据,是一个很小的文本文件。
2、新用户访问,客户端浏览器发送http request,给服务端
3、服务端生成cookie给浏览器
4、浏览器,将服务器发送的cookie以键值对形式保存,至本地文件
5、在浏览器上,再一次请求同个网站,把该cookie发送给服务器,服务器检查到该请求有cookie,则知道与这个用户之前有过交互。
6、cookie的部分介绍:
cookie是存储在客户端上,所以浏览器加入了一些限制确保cookie不会被恶意使用:只允许被创建的域对cookie进行读写;
cookie的过期时间一般在关闭浏览器就会自动删除,当然也可以进行一些设置使其有效期更长一些;
同时不会占据太多磁盘空间,浏览器最多允许存300个cookie,每个文件大小也有4kB的限制,同时每个域的cookie数量是有限的,最多支持20个,如果达到上限,浏览器就会自动随机对cookie文件进行删除
session
1、session“会话”的意思,session是保存在服务器端的数据
2、当用户打开访问服务器时,此时服务器就会产生一次session,并且为客户端分配一个session_id,客户端保存下来。
之后客户端每次请求时都带着这个session_id,可以理解为客户端篡改也没用,因为服务端保存了这个session_id,会对请求的session_id进行校验。
3、服务器使用session把用户的信息临时保存在了服务器上一般是在内存,磁盘,或者数据库。用户离开网站后session会被销毁。
token
1、token的意思是“令牌”,是用户身份的验证方式,
2、当用户第一次登录后,服务器生成一个token,并将此token返回给客户端,客户端保存此token,
3、之后请求只需带上这个token前来请求数据即可,无需再次带上用户名和密码,
4、服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回数据。
5、同时token也可以设置有效期,可以在每次请求时验证token及有效期
token是无状态、可扩展,在服务端的内存中是不存储的,支持移动设备,跨程序调用,更加安全
以上看起来貌似都是请求时客户端携带“身份证”,服务端验证身份证来区分用户。下面看看他们几个的区别:
cookie 、session和token的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie的大小及文件数量是有限制的
3、cookie是不安全的,可以分析存放在本地的COOKIE通过发送模拟请求来刷接口。当然真正实现中肯定会有防篡改的机制,如使用只有客户端和服务端知道的秘钥生成签名,但由于cookie是明文,所以一般不会放敏感信息
4、session保存在服务端,自然相对安全,同时只需要在客户端保存一个session_id,能够解决cookie存在的安全性问题
5、session是存储在服务器的文件,如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失
6、token 可以避免 CSRF 攻击。token的状态是存储在客户端。token 可以是无状态的,顶多是失效后重新登录,同时可以在多个服务间共享
参考来源
https://blog.csdn.net/jikeehuang/article/details/51488020
https://www.cnblogs.com/moyand/p/9047978.html
https://www.jianshu.com/p/bd1be47a16c1
https://junyiseo.com/php/757.html
https://segmentfault.com/a/1190000017831088
综上个人建议:
将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie中
二、Session生命周期
Session保存在服务器端,为了获取更高的存取速度,服务器一般会把Session放在内存里面,每个用户都会有一个独立的Session。如果Session里面的内容太过复杂,当大量的用户访问服务器时,可能会导致内存溢出,所以我们的session内容应当适当的精简。当我们第一次访问服务器时,服务器会给我们自动创建一个Session,生成session后,只要用户继续访问,服务器就会更新session的最后访问时间,并且维护这个session。当用户访问服务器一次,无论是否读写了session,服务器都会认定这个session活跃(active)了一次.当越来越多的用户访问我们的服务器时,因此我们的session会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session删除。这个时间就是session的超时时间,过了超时时间,我们的session就会自动失效.
三、cookie禁用时,使用url地址重写
如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中
转:https://www.cnblogs.com/uncleyong/p/11158806.html#_label11
COOKIE & SESSION
1、存储位置不同
cookie的数据信息存放在客户端浏览器上。
session的数据信息存放在服务器上。
2、存储容量不同
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。
3、存储方式不同
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。
session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
4、隐私策略不同
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
5、有效期上不同
开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
6、服务器压力不同
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。
session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
7、浏览器支持不同
假如客户端浏览器不支持cookie:
cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。
运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。
假如客户端支持cookie:
cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
session只能在本窗口以及子窗口内有效。
8、跨域支持上不同
cookie支持跨域名访问。
session不支持跨域名访问。