Cookie与Session应该在HTTP协议中会有较准确详细的描述,这里我根据平时看到的资料总结自己的认识如下:
1,Cookie是存储在客户端电脑上面,具有name, domain, expire等属性。
2,出于安全考虑,不能够跨域取cookie,比如a.com的cookie只能由a.com, x.a.com, y.a.com等站点读取,b.com则不可以。
3,cookie具有有效期,一般默认是浏览器关闭则失效,要删除cookie,可以简单的将有效期设置为昨天。
4,客户端每次向服务器发送Request的时候均会自动带上cookie,因此cookie大小不能超过4KB;服务器端通常只是在响应客户端起初的请求时才发送cookie,这里应该是程序控制写入cookie才发送,否则Response不会带cookie。因为cookie主要是用于标示客户端用户的一些信息,而HTTP协议是stateless的,因此若客户端不带上cookie,服务器端无法识别其历史对话信息。
5,对于一些浏览器端禁用cookie的情况,可以通过URL参数或其他形式保留此信息。
6,Session是存储于服务器端,存储客户端会话信息,其实与cookie一样都是存储一些键值对。
7,既然http是stateless的,那么服务器端是如何将session与客户端对应的呢?这里猜想可能是在最初客户端请求时,服务器端为其生成一个session,并将sessionid告诉客户端,每次客户端通过cookie或者其他方式自动带上这个sessionid,那么服务器段就知道它对应哪个session了。并且位于服务器端的session对象可以存储较多的内容。
8,当sessionid被截取后可能会引发安全问题,比如另外一台客户端可以携带该sessionid发送请求模拟登陆,这时我们通常需要通过SSL来解决安全问题。若没有SSL机制,比较简单的办法就是在初始阶段存储客户端的ip地址,http_user_agent等信息,每次处理请求的时候进行一下校验。当然这仍然不是很安全。
9,为了防止黑客自动构造大量sessionid来模仿其他用户,可以在每次session初始化时调用regenerate方法:
<?php
session_start();
if (!isset($_SESSION['initiated'])) //这里是否会识别来自于特定终端的第一次请求,因为不可能每次请求的时候都重新产生一次id
{
session_regenerate_id();
$_SESSION['initiated'] = 1;
}
if (!isset($_SESSION['count'])) $_SESSION['count'] = 0;
else ++$_SESSION['count'];
echo $_SESSION['count'];
?>
10,sessionid的传递应该至少有2种,1种是基于cookie的,另外一种是基于get方法的,比如….?phpsessionid=2321
可以通过ini_set('session.use_only_cookies', 1);强制sessionid基于cookie传送,那么基于get方法的就失效了。