Cookie
①它是客户端浏览器保存用户信息的一种机制
②不同浏览器有不同的存储大小,但一般不超过4kb
③我们常用的记住密码,就是记录在Cookie中
Session
①它是在服务端保存信息
②数据结构为SessionID和Session内容,以及其它自定义的内容,如用户基础信息,权限信息等.
③它可以保存在集群,数据库,或者文件中.
简要流程如下
如登录
1.浏览器向服务端发起第一次登录请求
2.服务端为用户创建一个SessionId,并在响应内容(Cookie)中将该SessionId一并返回给浏览器,浏览器将这些数据保存到本地.
3.浏览器再次发起请求时,会自动把上次请求存储的Cookie数据携带给服务器.
4.服务器收到请求后,根据SessionId判断出是哪个用户,然后根据SessionId从Session库中获取用户的Session数据返回给浏览器.
如,购物车,添加完商品之后客户端可以通过Session来告诉服务端添加了哪些商品.
此外,Session是有过期时间的
Session生成之后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维持Session。如果超过了超时时间没访问过服务器,Session就会自动失效.
Token
我们前面知道,客户端与服务端一般通过Session来进行交互,客户传入一个SessionId,服务端判断是否存在,而Session的信息我们一般都需要存入到数据库的,那么频繁的交互就会带来性能问题.
那么Token就是服务端生成一个唯一的字符串,作为客户端请求的一个令牌.当客户端第一次访问服务端,服务端会根据传过来的唯一标识userId,运用一些算法,并加上密钥,生成一个Token,然后通过Base64编码一下将这个Token返回给客户端,客户端将这个Token保存起来(可以通过数据库或者文件的形式保存到本地).下次请求时,客户端只要带上这个Token,服务端运用相同的算法和秘钥去验证Token就好了.
这个和Session有什么区别呢?
Session一般我们都持久化到数据库,那么数据库就容易成为瓶颈.
而Token则是在内存中通过加密解密来进行计算,只要能标识出用户就好了.
最简单Token组成:
uid(用户的唯一身份标识),time(当前时间的时间戳),sign(签名,由Token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器).
对于同一个APP同一个手机当前只有一个Token;手机App会存储一个当前有效的Token。服务端也为Token设置一个有效期,每次APP请求的时候都验证Token和有效期.
网友评论