http://www.nikest.com/web/jswd/2015/0303/128138.html
Session即回话,指一种持续性的、双向的连接。Session与Cookie在本质上没有区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制。Session也是一个通用的标准,但在不同的语言中实现有所不同。针对Web网站来说,Session指用户在浏览某个网站时,从进入网站到浏览器关闭这段时间内的会话。由此可知,Session实际上是一个特定的时间概念。
使用Session可以在网站的上下文不同页面间传递变量、用户身份认证、程序状态记录等。常见的形式就是配合Cookie使用,实现保存用户登录状态功能。和Cookie一样,session_start() 必须在程序最开始执行,前面不能有任何输出内容,否则会出现警告。PHP的Session默认通过文件的方式实现,即存储在服务器端的Session文件,每个Session一个文件。
Session通过一个称为PHPSESSID的Cookie和服务器联系。Session是通过sessionID判断客户端用户的,即Session文件的文件名。sessionID实际上是在客户端和服务端之间通过HTTP Request 和 HTTP Response传来传去。sessionID按照一定的算法生成,必须包含在 HTTP Request 里面,保证唯一性和随机性,以确保Session的安全。如果没有设置 Session 的生成周期, sessionID存储在内存中,关闭浏览器后该ID自动注销;重新请求该页面,会重新注册一个sessionID。如果客户端没有禁用Cookie,Cookie在启动Session回话的时候扮演的是存储sessionID 和 Session 生存期的角色。Session过期后,PHP会对其进行回收。
假设客户端禁用Cookie,可以通过URL或者隐藏表单传递sessionID;php.ini中把session.use_trans_sid 设成1,那么连接后就会自己加Session的ID。
Session以文件的形式存放在本地硬盘的一个目录中,当比较多时,磁盘读取文件就会比较慢,因此把Session分目录存放。
对于访问量大的站点,用默认的Session存储方式并不适合,较优的方法是用Data Base存取Session。在大流量的网站中,Session入库存在效率不高、占据数据库connection资源等问题。针对这种情况,可以使用Memcached、Redis等Key-Value数据存储方案实现高并发、大流量的Session存储。
1. Cookie运行在客户端,Session运行在服务端,对吗?
A:不完全正确。Cookie是运行在客户端,有客户端进行管理;Session虽然是运行在服务器端,但是sessionID作为一个Cookie是存储在客户端的。
2. 浏览器禁止Cookie,Cookie就不能用了,但Session不会受浏览器影响,对吗?
A:错。浏览器禁止Cookie,Cookie确实不能用了,Session会受浏览器端的影响。很简单的实验,在登录一个网站后,清空浏览器的Cookie和隐私数据,单机后台的连接,就会因为丢失Cookie而退出。当然,有办法通过URL传递Session。
3. 浏览器关闭后,Cookie和Session都消失了,对吗?
A:错。存储在内存中额Cookie确实会随着浏览器的关闭而消失,但存储在硬盘上的不会。更顽固的是Flash Cookie,不过现在很多系统优化软件和新版浏览器都已经支持删除Flash Cookie。百度采用了这样的技术记忆用户:Session在浏览器关闭后也不会消失,除非正常退出,代码中使用了显示的unset删除Session。否则Session可能被回收,也有可能永远残留在系统中。
4. Session 比 Cookie 更安全吗? 不应该大量使用Cookie吗?
A:错误。Cookie确实可能存在一些不安全因素,但和JavaScript一样,即使突破前端验证,还有后端保障安全。一切都还要看设计,尤其是涉及提权的时候,特别需要注意。通常情况下,Cookie和Session是绑定的,获得Cookie就相当于获得了Session,客户端把劫持的Cookie原封不动地传给服务器,服务器收到后,原封不动地验证Session,若Session存在,就实现了Cookie和Session的绑定过程。因此,不存在Session比Cookie更安全这种说法。如果说不安全,也是由于代码不安全,错误地把用作身份验证的Cookie作为权限验证来使用。
5. Session是创建在服务器上的,应该少用Session而多用Cookie,对吗?
A:错。Cookie可以提高用户体验,但会加大网络之间的数据传输量,应尽量在Cookie中仅保存必要的数据。
6. 如果把别人机器上的Cookie文件复制到我的电脑上(假设使用相同的浏览器),是不是能够登录别人的帐号呢?如何防范?
A:是的。这属于Cookie劫持的一种做法。要避免这种情况,需要在Cookie中针对IP、UA等加上特殊的校验信息,然后和服务器端进行比对。
7. 在IE浏览器下登录某网站,换成Firefox浏览器是否仍然是未登录状态?使用IE登录了腾讯网站后,为什么使用Firefox能保持登录状态?
A:不同浏览器使用不同的Cookie管理机制,无法实现公用Cookie。如果使用IE登录腾讯网站,使用Firefox也能登录,这是由于在安装腾讯QQ软件时,你的电脑上同时安装了针对这两个浏览器的插件,可以识别本地已登录QQ号码进而自动登录。本质上,不属于共用Cookie的范畴。