一直想写一篇有关Cookie和Session的文章,作为一个phper,会话控制的知识必然要熟知,下面我来浅谈一下对两个单词的解读。参考过的书籍有《图解HTTP》、《PHP核心技术与最佳实践》。
【Cookie和Session是干什么的】
对于这个老生常谈的问题,我们得先从HTTP协议说起。众所周知,HTTP协议是互联网应用最为广泛的一种网络协议(虽然这句话是百度的),当我们在浏览器地址栏中输入想要访问的网址,按下回车,web页面展示在我们面前,这一系列客户端与服务器端的通信都是建立在HTTP协议上的。
关键点来了,HTTP协议自身是一种不保存状态的协议,每当发送新的请求就会有对应新的响应产生,不保留之前一切的请求或响应报文的信息。但是这种无状态的协议对某些业务处理终究是不友好的,比如记录用户的登录状态、未登录用户购物车加购信息等等,于是为了保持状态、实现功能,引入了Cookie和Session会话跟踪技术,或者说是保持客户端与服务器端会话连接状态的机制。
【先说Cookie】
上来先用Javascript创建Cookie:
<script type="text/javascript"> document.cookie="username=lws"; </script>
还可以用PHP创建Cookie:
<?php setcookie('username','lws');
核心要说的是,Cookie是独立于语言存在的,事实上并不是由某种语言创建的,而是这些语言给浏览器发送HTTP指令间接操作实现的。因此Cookie是由浏览器实现和管理的,数据存储在客户端上,客户端脚本均能读取到。
存储在内存中的Cookie会随着浏览器的关闭而消失,而存储在硬盘中的Cookie不受影响,例如flash cookie理论上只能通过硬盘清理。
【再谈Session】
用PHP环境搭建的网站,我们通过浏览器控制台可以看到在一次HTTP会话中(并不只是一次请求),Cookie里面存储着一个叫做PHPSESSID的东西,这就是PHP对应Session机制的sessionID,它也是存储在服务器端的Session文件的文件名:
说白了就是用一个随机ID在客户端与服务器端传来传去。在服务器端可以用Session存储用户的状态、信息等等,通过sessionID验证客户端用户。如果浏览器禁用了Cookie,可以通过URL或者隐藏表单传递sessionID。如果浏览器关闭,存储在客户端内存中的sessionID就会自动注销,再次请求该页面时重新注册sessionID,但是服务器端的Session文件不会立刻删除,这个取决于服务器端设置的Session生命周期。
示例如下,用PHP设置Session的生命周期为1小时( 过期后PHP会对其进行回收):
<?php $lifetime=3600; //有效期1小时 session_start(); setcookie(session_name(),session_id(),time()+$lifetime,"/");
【安全性分析】
总是会听到Session比Cookie更安全的言论,实际上Cookie和Session属于一种绑定的关系,获得Cookie就相当于获得了Session,Cookie被伪造之后原封不动传给服务器照样可以通过Session验证,所以不存在谁比谁更安全。只是Session存储于服务器,没有Cookie存储于客户端在浏览器上那么显而易见而已。
【版权声明】感谢转载,转载请注明出处。 李维山博客http://msllws.top