Cookie简介Cookie 是由服务器生成,发送给浏览器,浏览器把 Cookie 以 kv 形式保存到本地。浏览器每次向服务器发出请求,就会自动附上这段信息。每个 Cookie 的大小一般不能超过 4KB,一个 web 站点最多可以设置 20个 Cookie,一个浏览器最多可以设置 300个 Cookie。同时 Cookie 也具有时效性,超过设置的时效,系统就会自动清除。用途会话管理:记录用户的登录状态,访问状态(例如导航,用户的注册流程等);个性化信息:记忆用户相关的信息(例如记忆上一次登录的用户的QQ号码)和用户自定义的一些功能(例如google将搜索设置:使用语言、每页的条数等,保存在一个COOKIE里);记录用户的行为:最典型的是公司的TCSS系统。它使用Cookie来记录用户的点击流和某个产品或商业行为的操作率和流失率。缺点Cookie 会被附加在每个 HTTP 请求中,所以无形中增加了流量;由于在 HTTP 请求中的 Cookie 是明文传递的,所以安全性成问题,除非用HTTPS;Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。SessionSession 就是“会话”,当用户打开某个 web 应用时,便与 web 服务器产生一次 session。服务器使用 session 把用户的信息临时保存在了服务器上,用户离开网站后 session 会被销毁,相对 cookie 更安全。cookie 和 session 执行流程客户端发送一个http请求到服务器端;服务器端接受客户端请求后,建立一个session,并生成sessionID设置进Cookie头并发送一个http响应到客户端;在客户端发起的第二次请求,假如服务器给了set-Cookie,浏览器会自动在请求头中添加cookie;服务器接收请求,分解cookie,验证信息,核对成功后返回response给客户端Session 和 Cookie 一般都是结合使用的。用 session 只需要在客户端保存一个id,实际上大量数据都是保存在服务端,所以当访问增多,session 会比较占用服务器的性能。简而言之, 将登陆信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。Tokentoken 也称作令牌,由uid+time+sign[+固定参数]。token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 所谓无状态就是服务端并不会保存身份认证相关的数据。uid: 用户唯一身份标识;time: 当前时间的时间戳;sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接;固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库。token在客户端一般存放于localStorage,cookie,或sessionStorage中。token认证流程:用户登录,成功后服务器返回Token给客户端;客户端收到数据后保存在客户端;客户端再次访问服务器,将token放入headers中;服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码。token可以抵抗csrf,cookie+session不行假如用户正在登陆银行网页,同时登陆了攻击者的网页,并且银行网页未对csrf攻击进行防护。攻击者就可以在网页放一个表单,该表单提交src为http://www.bank.com/api/transfer,body为count=1000&to=Tom。倘若是session+cookie,用户打开网页的时候就已经转给Tom1000元了.因为form 发起的 POST 请求并不受到浏览器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域发送 POST 请求,形成 CSRF 攻击。在post请求的瞬间,cookie会被浏览器自动添加到请求头中。但token不同,token是开发者为了防范csrf而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交的表单无法通过服务器过滤,也就无法形成攻击。分布式情况下的session和token我们已经知道session时有状态的,一般存于服务器内存或硬盘中,当服务器采用分布式或集群时,session就会面对负载均衡问题。负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享session。这个问题也可以将session存在一个服务器中来解决,但是就不能完全达到负载均衡的效果。当今的几种解决session负载均衡的方法。而token是无状态的,token字符串里就保存了所有的用户信息客户端登陆传递信息给服务端,服务端收到后把用户信息加密(token)传给客户端,客户端将token存放于localStroage等容器中。客户端每次访问都传递token,服务端解密token,就知道这个用户是谁了。通过cpu加解密,服务端就不需要存储session占用存储空间,就很好的解决负载均衡多服务器的问题了。这个方法叫做JWT(Json Web Token)总结session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session。依赖cookiecookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。需要开发者手动添加。jwt只是一个跨域认证的方案原文地址:彻底弄懂session,cookie,token