Cookie起源于W3C在设计cookie时实际考虑的是记录用户在一段时间内访问web应用的行为路径。由于HTTP协议是无状态协议,当用户的访问请求结束后,后端服务器无从得知下一次访问是否来自上次访问的用户。cookies的作用就在这里。由于请求是由同一个客户端发出的,每次请求都会携带服务器上次访问时设置的信息,这样服务器就可以根据之前保存在cookie中的值来做。适当的处理(访问用户的区分等)。该函数解决了客户端和服务器之间的无状态。一般来说,当用户通过HTTP协议访问服务器时,服务器会根据需要设置一些cookie信息(Key/Value键值对),并给这些数据加上一些限制条件,然后返回给客户端浏览器响应头的形式。当用户下次访问服务器时满足条件时,将数据全部带回服务器。流程介绍客户端浏览器发送请求时,会根据自己的设置在相应的条件下查找并解析cookie信息。如果找到,则设置相应的请求头信息,然后发送请求,否则直接发送请求。服务器设置$_COOKIE后,会通过响应头返回给浏览器。注意:Cookies是在header中发送的,所以之前不能有任何输出。缺点是每次请求都会携带所有的cookie信息,容易造成不必要的带宽浪费。每个浏览器对同一域名下cookies的数量和每个cookies的总大小(4kb)都有相应的限制。数据存储在客户端,容易被拦截和篡改,不安全。客户端可以禁用cookie,从而导致无功能。难以管理,大型系统中的每个应用程序都会有自己的cookie,加上上面的限制,容易发生数据拦截,导致数据丢失。Session基于以上缺点,Session来了。流程介绍当服务器(默认设置)接受一个请求时,首先会检查$_COOKIE中是否存在名为PHPSESSID的键值对(值为服务器生成的SESSION_ID:bebfaf6c745c1a6e5f341baf2178113b)。如果不存在(第一次请求),会自动生成SESSION_ID,写入$_COOKIE数组(名称为PHPSESSID,值为SESSION_ID),然后通过响应头返回给浏览器。如果存在(不是第一次请求),则根据value值从set目录中获取对应的文件,反序列化后写入$_SESSION数组,以供后续使用。当服务器设置$_SESSION时,这个$_SESSION只会在内存中维护。当脚本执行结束时,$_SESSION会自动序列化写入SESSION_ID对应的文件(创建或覆盖)。优点只将会话标识符放在cookie中,减少带宽传输。可以存储大量信息,基本没有空间限制。数据存储在服务器端,安全。可以集中管理。联系SESSION为了识别会话,需要将唯一的SESSION_ID传输到客户端。一般情况下使用cookies进行传输,当然也可以采用其他方式进行传输。Session安全扩展上面的分析表明,Session需要通过SESSION_ID来识别客户端,这会带来安全隐患。当SESSION_ID落入第三方时,服务器将无法判断是否是合法请求。一个简单的防御措施就是在每次请求时,生成一个新的SESSION_ID,并关联相应的数据,并删除旧的SESSION_ID。
