session和cookie原理透彻分析

liyuzhao8年前学习记录1758

一直以来对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数据。

以上纯属个人见解,如果有错欢迎矫正,如果要转载,请标明出处,谢谢!


相关文章

探讨mysql编程形参的in,out,inout型

探讨mysql编程形参的in,out,inout型

mysql的形参可以传入数值,也可以传入变量,下面来探讨一下:先探讨in和out型:delimiter $create procedure p2(in a int , out b int)begind...

探讨mysql的权限问题

不管是本地连接数据库还是远程连接数据库,要想连接成功必须要有四样:1:host   –>连接地址2:user  –>连接账号3:password  –>...

用mysql创建触发器

学习创建触发器:触发器的定义就是,当执行增删改查等操作就会触发执行sql语句。 先创建两个表:dongwu表和购买buy表,数据字典如下:动物表:Create table dongwu(Dw...

探索sql合并插入+事务性能问题

探索sql合并插入+事务性能问题准备:1:为了方便默认用thinkphp5框架来测试,直接下载官方的thinkphp5框架,部署到本地的环境,开启debug调试来追踪sql语句。2:新建一个表为tes...

centos7.4 安装lnmp

centos7.4 安装lnmp

最近购买了两天云服务器,所以环境需要重新配置下。采用php7.2+nginx+mysql5.7 .安装步骤:yum的安装?1yum updateyum安装nginx安装nginx最新源?12yum l...

redis在centos7 自启动,并用service启动或者关闭

redis在centos7 自启动,并用service启动或者关闭

1.为了让redis-server能在系统启动时自动运行,需要将redis服务作为守护进程(daemon)来运行,我们回/usr/local/cluster/7000/目录中找到一个redis.con...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。