session和cookie原理透彻分析
一直以来对session和cookie这个两个的原来有点不明确。上次去公司面试的时候就有这个面试题,心里一直都想搞清楚这两个的原理,但是一直没有好的理解,所幸今晚翻了以前看十八哥的视频,非常透彻的讲解了这两个的原理,所以打算写下自己的心得。
什么是cookie?
很简单的说就是存储某个常量的值,只要开启cookie,存贮某个常量的值,就可以很轻松的在整个项目中拿到这个常量的值了。cookie是存贮在客户端的,也就是存贮在本地磁盘的某个文件夹中,存贮方式是json格式,也就是key:value方式。
一般格式为:{“xx2″:”xxx”}
xx2为常量
xxx为xx2的值
运行原理:
第一次访问:客户端(头信息没有cookie)–>请求服务器–>服务器响应客户端(头信息带着cookie的明文)
第二次+N次访问:客户端(头信息带着cookie的明文)–>请求服务器(接受判断cookie)–>响应客户端(头信息不带cookie)
什么是session?
也是存贮某个常量的值,但是与cookie有两点是不一样的:
1:session是存储在服务器端
2:session会有一个身份标识
一般格式为:xx1{“xx2″:”xxx”}
xx1为身份标识
xx2为常量
xxx为xx2的值。
运行原理:
第一次访问:客户端(头信息没有cookie)–>请求服务器(生成session,并保存在服务器端)–>响应客户端(头信息带cookie明文,但是这个cookie存贮的是session的身份标识)
第二次+N次访问:客户端(头信息带着cookie明文,也就是session的身份标识)–>请求服务器(查找对应的session的身份标识,然后判断里面的值信息)–>响应客户端
为什么说cookie不安全呢?
首先你要先了解cookie的运行原理:服务器端在代码中声明了一个cookie常量,客户端如果访问到此申明的常量,服务器端就会响应一个cookie常量给客户端,客户端就会保存这个cookie常量到本地文件中(浏览器未禁止cookie的前提下),然后客户端每次去访问服务器的时候,都会带上这个cookie常量访问。这样问题就来了,如果我的登录逻辑里面有一个判断,如下:
if($_COOKIE[‘a’] == ‘vip’){
//这里写跳转到vip的页面等逻辑代码
}else{
//这里写跳转到普通用户的页面等逻辑代码
}
很明显,如果cookie常量a的值如果不是vip那就会跳转到普通用户页面,如果是vip就会跳转到vip的页面。cookie是保存在本地文件上的,我们是可以直接修改的,设想一下,如果我把cookie常量a的值修改为vip,那么不就可以去到vip用户的页面了吗?(本例子只是针对cookie不安全的解释,实际开发不会这样做)这样子就不安全了。
如何解决cookie的安全呢?
很明显,cookie可以存贮一些安全系数低的数据,但是像后台登录账号密码就必须要安全系数高了。前面讲到了session里面有一个身份标识,这个身份标识就能排上用场了。上面讲到session的运行原理是需要身份标识才能找到对应的存贮信息,所以如果你在客户端修改了cookie存贮的session身份标识id,那就会在服务器端找不到对应的存贮信息,这样就安全性就大大增加了。
session虽然安全,但是不要多用,因为session是存贮在服务器端上的,大量使用会占用很多的空间,当然如果网站设计合理,每段时间自动清理session,那么还是建议使用session的。
面试题有很多提到是不是禁用了cookie是否还能用session。
按照上面的原理确实是没错的,因为cookie存贮session的身份标识id,如果禁用了,那么cookie 就无法存贮session的id,那么也就无法向服务器发送cookie请求了,也就没发去获取session里面的数据了。所以保存在服务器端的那个session也就作废了,没什么用。
但是现在是有技术可以实现禁用cookie,session还能继续用,网上有很多的资源,在此我就不多写了。
今天早上起来思路更清晰了,所以再更新下思路。
cookie原理:客户端第一次请求服务器端的时候,服务器会返回一个cookie给客户端,这个cookie会贮存在本地磁盘某个地方,但是服务器端不会存这个cookie。当客户端第二次+N次请求服务器端的时候,会在头信息携带这个cookie去请求服务器端,服务器端检测到这个cookie就直接用了,所以说不安全。
session原理:客户端第一次请求服务器端的时候,服务器会返回一个cookie给客户端,这个cookie是保存为session的身份id,也会贮存在本地磁盘某个地方,服务器也会存贮,但是存的是session,格式上面写有。当客户端第二次+N此请求服务器端的时候,会在头信息携带这个cookie去请求服务器,服务器端检测到这个cookie会直接按照cookie里面的session身份id去寻找session里面对应的id数据,然后再响应客户端。所以说非常安全。因为就算你改了cookie,你也只是改了cookie里面的session身份id,如果你改了这个id,那么服务器上就会找不到对应的session身份id数据。
以上纯属个人见解,如果有错欢迎矫正,如果要转载,请标明出处,谢谢!