Cookie是远程浏览器端存储数据并用于跟踪和识别用户的机制。从实现上说Cookie是存储在客户端上的一小段数据,客户端通过HTTP协议和服务端进行Cookie交互。
Cookie独立于语言的存在,并不由哪种编程语言实现的,而这些语言则是实现对Cookie的间接操作(发送HHTTP指令,浏览器收到指令操作Cookie并返回给服务器),因此Cookie是由浏览器实现和管理的
Cookie没有显式的删除函数,如果想删除Cookie,应该将Cookie的expire设置为过期时间。
PHP语言的setcookie()等函数必须在输出数据之前调用,和header()函数相同,不然会报错。
原因:Cookie是HTTP头的一部分,即先发送或请求Cookie,然后才有data域。
每个域名下面cookie个数是有限制的,IE 50个 FF 150个 ,超过直接删除旧的。
Cookie虽然带来好的用户体验,但是不能滥用,会增加带宽:一旦cookie被设置在域下,则请求该域名下的一个资源,浏览器和服务器之间都可能存在cookie的上行和下行流量。
Cookie的存储位置:
1、浏览器内存中(没设置过期时间)
2、每个域名下一个文本文件
3、FF存在对应目录下的sqllite文件中
关闭浏览器Cookie并不会随之消失,除非设置该cookie的过期时间为空。
cookie跨域-单点登录SSO(CSA)
本地存储localStorage:
使用本地localStorage的原因:
1、由于每个域名下的每个Cookie最多存储4KB
2、数据不可靠永远无法知道是不是自己把数据堵满了还是别人把你的数据改了
3、还有就是每次HTTP请求都会把Cookie带上造成流量浪费。
注意点:HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候需要自己进行类型转换。
新特性:HTML5除了基本的读写操作外,还提供了storage事件对键值对的改变进行监听。
SESSION详解:
Session即会话,指一种持续的、双向的连接。
Session实现方式有:1、URL重新 2、Cookie 3、通过在Cookie中存储SessionID实现Session传递。
和Cookie基本一样,session_start()必须在程序最开始执行,前面不能有任何输出内容。
PHP的session存储:
1、默认是通过文件的方式实现,即存储的服务器端的session文件,每个session一个文件。(扩展:当一个目录的文件数超过2000时,读写这个目录就会非常慢。解决版本:对存放目录多级散列,PHP.ini中session.save_path设置)
2、存储在数据库,MYSQL选MEMORY存储引擎
3、存储到Memcached和Redis等
Session工作原理:
Session通过 一个称为PHPSESSID的cookie和服务器联系。Session是通过SessionID判断客户端用户的,即Session文件名。(HTTP协议本身不能支持服务器端保存客户端的状态信息,为了解决这个问题引入了Session)
SessionID实际上是在客户端和服务器端之间通过HTTP Request和HTTP Response传来传去。
怎么保证SessionID安全:按照一定算法生成,必须包含在HTTP Request里面,保证唯一性和随机性。
session过期后PHP会进行回收,因此Session并非都随着浏览器关闭而消失。
Session和Cookie的区别:
本质上没有任何区别,都是对HTTP协议的局限性而提出来的一种保持客户端和服务器间的保持会话连接状态的机制。
如果没有禁用Cookie,Cookie在启动Session会话的时候扮演的是存储sessionId和session生成周期的角色。
SessionID作为一个Cookie是存储在客户端,除此之外session是运行在服务器端,Cookie是运行在客户端。
误区:
1、session是运行在服务器端,Cookie是运行在客户端。
答:错,SessionID作为一个Cookie是存储在客户端。
2、Session比Cookie安全?
答:通常情况下,Cookie和Session是绑定的,获得Cookie就相当于获得了Session,客户端把劫持的Cookie和Session原封不动的传给服务器,服务器接收后原封不动的验证Session,若Session存在,就实现了cookie和session的绑定过程,因此不存在session比cookie更安全的说法。
不安全只能是说代码不安全,错误的把用作身份验证的cookie作为权限来验证使用。
3、如何防止劫持了cookie能登录账号问题?
答:需要在cookie中针对IP、UA等加上特殊的校验信息,然后和服务器端进行比对。