由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。
对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密
码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码
存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能
只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。
假如你存储 $admin 变量来 表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的
时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,
这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?
所以说这样非常的不安全。
而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 session 文件的内容,
因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,
以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。
而且可以减少每次为了验证 Cookie 而传递密码的不安全性了,即使密码进行了 md5 加密,也是
很容易被截获的。假如你没有使用 SSL 安全协议的话,session 验证只需要传递一次。
当一台WWW服务器运行时,可能有若干个用户浏览正在运行这台服务器上的网站。当每个用户首次
与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配
一个SessionID,用以标识这个用户的唯一身份。
这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID
自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,
将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,
服务器怎样才能知道到底是哪个用户提交了哪个表单呢。
Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置
Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,
重新注册一个 session ID。