发展历程
天地混沌之初,web应用就只是用来浏览文档,那时大家都很high,谁也不知道谁是谁,每一次新的请求就是一次全新的开始。
但是愚蠢的人类,想要和某腾爸爸聊天了,想向未来的某云爸爸交钱了,大家需要相互认识,上帝想出了一个叫cookie的东西,就像他的中文甜点一样,每个人手里都可以有一份甜点,甜点就是每个人的标识,当你不要他的时候就可以吃下去(删除他),这时任何人都认不出你是谁了,人类又high了。但是上帝不high了,如果有人强了你的甜点,你的身份就可以被伪造了。为了恢复秩序,上帝就自己造了一种叫session(会话)的种族,用户登录以后,服务器会给每个人分配一个session(session是住在服务器里面的)这样每个人都有了自己的标识,也不用担心安全问题,人类又high起来了。但是上帝又不high了,人类越来越多,session也越来越多,终于服务器他炸了。最后上帝和密码之神造了一个儿子,来优化session的不足之处,他叫token。token完全不用像session和cookie那样保存用户信息,他只用负责信息的加解密验证,这样上帝和人类都high起来了。这是一个完美幸福的故事。
咳咳。。。闸们言归正传
Cookies
cookies,就是保存在本地的K-V形式的数据,用来记录个人信息,在发送请求时一并发送给服务器以便服务器识别身份。此方法对服务器压力小。浏览器可以禁用cookies。
在有效期上cookie分为会话cookie和持久化cookie。
若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般保存在内存里。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。这种生命期为浏览器会话期的cookie被称为持久化cookie。
Session
Session,就是保存在服务器端的K-V数据,也是用来记录个人信息。在用户登录之后,服务器会给客户端发送一个session_id,客户端每次发送请求都会发送此id,以便服务端识别身份。由于数据都保存在服务器,因此不用担心暴露敏感信息,但是相较cookies而言对服务器压力大很多。
session大多数时候是通过cookie来存储session_id的。比如下图
但是当浏览器禁止了cookie而无法使用此保存方法的时候,则可通过url重写来实现session_id的发送。
在有效期上,session的Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器该Session就会失效,迫于服务端压力,也不能保存过长时间。
Token
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
Token的验证方式流程和session,cookie都不太一样。token把一个叫签名的字符串和数据一起发送给客户端,这个签名是数据的一个加密(使用SHA等算法,使用一个只有服务端才知道的密钥),下次客户端再把数据发送往服务器时,我只需要用相同的算法对数据进行一次加密计算,假如得到的结果和发送过来的token签名不同,则验证不通过,这样就保证了数据的不可篡改性。这样token以服务器的计算资源为代价,换取了空间,大大减少了服务器的压力。