前言:
为什么要研究cookie、session和token呢?
我当前已经学习完了sql注入和部分xss攻击,其中都遇到了使用和获取cookie,不把cookie理解了,就无法完全理解黑客获取它的原因。同时深刻理解了这三者之间的关系,对于预防也有很大的指导意义。完全根据自己的理解写的,如果有错误请大神指点(说实话,感觉自己理解的不是特别的深刻)
session
session就是我们常说的会话,在iso模型中属于会话层,在tcp/ip中属于应用层,服务器通过什么来确定session呢?就是我们常说的五元组(sip,dip,sport,dport and protocol),对服务器而言对外提供的dip和dport及protocol是固定的,但是客户端的sip不会相同,及时sip相同了sport也绝对不会相同,因此五元组保证了session的唯一性。
再来说http协议,http协议是一个无状态协议,其无法是服务器记录下用户的状态,白话:当user每发送一个http请求时,服务器端都会建立一个session,当有多台服务器时,可能会出现同一用户访问到不同的服务器,如果应用需要关联同一个用户的不同操作,服务器就需要同步数据该用户的数据,最后导致每个用户的信息在每台服务器上都需要保持一份历史信息,对于珍贵的服务器资源将浪费极大。而且服务器为了证明是同一个用户,还要求用户不停的输入用户名和密码,用户得多恼火哈,并且应用程序还要调用数据库与当前输入的用户名和密码进行匹配计算,sql服务器需要的处理性能也是无法想象的。
此时cookie为解决这个问题应运而生,1993年3月(阿里巴巴1999年才成的)Netscape(网景)公司的前雇员卢·蒙特利发明了cookie,当时其为MCI公司开发电子商务应用程序,MCI不希望其服务器必须保留部分事务状态,这导致他们要求网景公司找到一种方法来将该状态存储在每个用户的计算机中, Cookie为可靠地实施虚拟购物车的问题提供了解决方案。
想象一下如果没有cookie的出现,某宝需要多少台服务器呀。
cookie
上面说了服务器需要关联用户的历史操作,并且通过客户端保存一些有效信息,来降低服务器端的存储压力,cookie的出现解决了这个问题,那么cookie是什么呢?其实cookie就是当用户第一次向服务器发送请求的时,服务器创建一个session,并将这个session命名为sessionID,然后服务器将这个sessionID发送给用户,以后服务器和user的交互就用这个sessionID作为识别不同用户的唯一标识。
一个完整的cookie和session应用过程:
有个问题没有得到解决,当同一用户访问到不同的web服务器了怎么办?
这个问题交个负载均衡去解决(我能想到的,不对请大神批评指正),负载均衡会维护一张sessionID与服务器关联的表格,这样就保证了在cookie失效之前,该用户始终访问的是同一台服务器。
再从抓包看一下服务器和客户端产生cookie的过程: