|
首先,从应用层面来讲,cookie和session属于同范畴,但是从技术层面来讲,二者完全不在同一层级上的。
## 原理
cookie是一种将K-V以一种序列化的形式存放于数据传递的过程中间,即:浏览器(我们通俗点来讲)和服务器之间的数据交互中,数据会在浏览器内存储一份,通过HTTP头内带数据传递。
session是一种,将K存放于这个过程中间(浏览器到服务器的数据传递过程),V存放于服务端(默认是文件,也可以使MYSQL,MC,REDIS等自己写的服务),这里面会包含两部分:
1. 传递过程
2. 服务端数据存储
传递过程,默认是通过cookie,K的存储在浏览器内,有时也可以通过query get的方式,那么这时,它存储在哪里?有可能是页面,有可能是服务器返回的链接,最终的展现是浏览器的页面上。所以,说:session存储在浏览器或者服务器端的,答案都不完整。
数据存储,默认是文件,一般在文件目录:/tmp 下,但是你也可以设置为mysql等其它的服务存储。那么有了这些,服务器端的压力可以很好的摊分,为什么?我可以对数据做哈希散列,可以内存存储(共享内存),这些消耗的代价都小于文件。当然也是在一定程度上的。
以上两点,技术上,不在同一层面。
## cookie真的不安全么
cookie有很多的问题,当然安不安全也看怎么来用。
首先我们来说安全性。如果你真的要把用户名、用户ID等数据通过cookie来存,那么确实有伪造的可能。但是,如果稍做一点安全技术,就可以这么干了。为什么?一种很常用的方法是做有效性验证。什么是有效性验证?既然我们担心有人篡改cookie的数据,那么我们对cookie的数据做一次加密,并且把加密后的串也通过cookie传递就行。这样,只要他们破解不了我的算法,就没法伪造我的数据。目前,百度就是这么用的。但是有的时候,我们又放弃这么用,为什么?
因为,带宽问题。cookie是有域为前提的,也就是说,符合cookie域下的所有的请求都会带着这些数据。那么,你想想看,那些 js、css文件的请求,带着这么多的没有用的数据到处传递,是不是很占用带宽?所以,像新浪、百度等会有专门的静态文件服务器,并且请求域名不一样。就是这个原因。
## session是一种技术过程,不是一个技术名称
跟cookie不同,session是一个将K暴露、V由服务器解析的技术,不是一个具体的PHP技术(这么表达好像也没表达清楚)。你说它安全?它安全么?
session是有的id是唯一的,但是也是存在碰撞的(理论概率非常低),并且非常容易伪造。为什么?如果你的服务器垃圾回收时间间隔太长,那么V的部分就不会清除。不会清除就意味着你可以通过伪造ID来通过验证。怎么伪造?劫持别人的cookie呗(一般情况下)。那么,这个时候你会说它安全么?
ID生成规则,从PHP手册上来看,有MD5和rsa两种,不过貌似可以有扩展(我还没有看细节)
## 过期时间
几乎没有人答出来这个过期时间,cookie的过期时间通过setcookie可以设置,那么session的怎么搞?PHP.ini里配置,也可以脚本内配置(全局的)。
一个脚本可以设置多个过期时间的cookie,但是貌似session一个脚本一个过期时间。为什么?自己想
session的过期时间,分浏览器部分和服务器部分,浏览器部分比较严格,于浏览器的机制有关,一般情况下比较准时。但是session不同,它是通过垃圾回收来进行清除的。垃圾回收机制默认为1%的概率,也就是每次脚本运行是,会有1%的概率触发。那么,你想想,即使你在浏览器的sessionkey失效了,但是服务器端并不是这么认为的,那么又回来了,它安全么?
## 应用层面
session已经是一个术语了,不是具体的单个技术。它是一个流程,或者是一个过程。虽然你可以使用php的session当做cookie来用。
看到这里,回头看看你们的答案,真的是准确的么?(以上我只是把我能想到的点都答出来了,一般情况下,你能说出session是一种过程,那么你就通过了)
|
|