PHP网络技术(六)——session及与cookie的比较

PHP网络技术(六)

——session及与cookie的比较

(原创内容,转载请注明来源,谢谢)

一、概念

session是持续的、双向性的连接。其是通过在cookie中存储sessionID,实现session的传递,以区分不同用户的session。

与cookie的存储方式不同,session存储在服务端,每个session一个文件进行存储。通过上述的sessionID,可以获取不同的session文件。session文件名是sess_32位随机字符串,里面的内容形如:变量名|类型:长度:值。

PHP在使用session之前,需要有session_start()命令。

二、原理

由于HTTP不支持服务端保存客户端的信息,因此引入session的概念。

session通过一个称为PHPSESSID的cookie和服务器联系,其通过sessionID判断客户端的用户,即session的文件名。因此,通常情况下,使用session前提是浏览器支持且启用cookie(浏览器不支持的情况下也可以使用,具体实现方式下面会提到)。

session实际上是在客户端和服务器之间通过HTTP Request和HTTP Response进行互传,其中sessionID按照特定的算法生成,包含在HTTP Request里面,具有唯一性和随机性。

和cookie一样,如果没有设置失效时间,浏览器关闭后session文件自动注销,当重新请求时会重新注册一个sessionID。当客户端没有禁用cookie,cookie会在启用session会话时存储sessionID及其生命周期,也可以通过cookie设置session的生命周期。方法如下:

         setcookie(session_name(),session_id(), time()+3600, ‘/’, ‘127.0.0.1’, false, true)

设置了session过期方式,则在过期后由浏览器进行回收,如果未过期,则浏览器关闭后再打开仍有效。

三、浏览器禁用cookie时的处理方式

默认情况下,由cookie存储sessionID,并且自动发送给服务端,服务端由此进行判断sessionID并且取出相应的session文件。但是,如果浏览器禁止了session,则无法通过cookie获取sessionID,则需要另辟蹊径。

常用的做法是通过URL将sessionID从客户端传递给服务端,服务端采用get的方式获取并从服务端本地获取相应sessionID对应的session文件。如果没有则获取失败。

代码如下;

客户端:client.php

         $sessionName= session_name();
         $sessionID= session_id();
         echo‘<a href=”server.php?’.$sessionName.’=’.$sessionID.’”>跳转</a>’;

服务端: server.php

         $sessionName= session_name();
         $sessionID= $_GET[$sessionName];
         session_id($sessionID);
         session_start();

四、session存储

当有大量的session进行操作时,则对session进行存储并取出的效率更高。通常的做法是实现PHP的接口session_set_save_handler(callback open, callback close, callbackread, callback write, callback destroy, callback gc)。

另外,由于在关系型数据库中存储效率较低,建议采用非关系型数据库或缓存进行存储,如memcache或redis,效率会更高。

五、关于cookie与session

1)存储位置

cookie数据存放在客户的浏览器上,session数据放在服务器上,但是sessionID作为一个cookie存储在客户端(除非客户端禁用cookie,则需要使用上述url传参的方式实现)。

2)安全性

session相对cookie来说安全,但是cookie和session的安全性差距不大,因为cookie和session是通过sessionID绑定的,因此获取到cookie后,发送给服务器,服务器通过cookie就会进行验证。因此,安全性主要还是需要在代码中进行实现。

另外,为了防止cookie劫持(将其他人的电脑里的cookie复制到自己的电脑,使自己有其他人电脑的cookie,进而进行相应的操作),下需要在cookie中加入IP、UA等特殊信息,并在服务器进行比对。

3)跨软件

由于cookie是不同的客户端各自存储,因此不同的浏览器无法共用cookie。而session由于是存储在服务器,因此不受软件影响。但是由于sessionID是存储在cookie中的,因此通常情况下跨浏览器也无法正确读取到session。

4)资源占用

cookie在每次HTTP请求中都会发出,无论是客户端还是服务端,因此cookie主要是占用带宽。session是存储在服务端,并不进行传输,因此不占带宽,但是由于存储在服务端,因此占用服务端的存储并且读写session占用服务端的IO。

因此,高并发情况下,服务端需要同时读取多个session文件,对服务端造成压力较大,cookie存在的问题则是占用带宽较多。

因此减轻服务器性能方面需要使用cookie,减少网络压力使用session。

5)限制条件

每个cookie保存的数据不能超过4kb,且一般浏览器对每个域名下的cookie还有数量的限制,另外浏览器也可以设置禁止cookie。就此方面来说,session不受限制。

6)使用场景

通常情况下,cookie用于安全性不那么高的地方,如记住用户名。并且可以在使用cookie时通过判断IP、UA或其他加密信息进行校验,防止cookie劫持。要存储用户名也可以将用户名通过md1等不可逆算法加盐或者其他方式进行加密,并且后台再次进行判断,达到保存密码的功能。

验证登陆的功能通常用session实现。即在登陆页面验证成功后,将内容写入session。并且,为了在后面的每个页面都进行判断,当判断成功时,会再次重设session的时间;当验证失败或者超时导致session注销,则跳转到登陆页。这就是实现超时没有操作需要重新登陆的原理。在mvc或其他单一入口的方式下,通常会将验证session和重设时间的方法写在basecontroller(基类),其他文件继承该类进行验证session信息与重置session过期时间。

——written by linhxx 2017.07.24

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小二的折腾日记

服务器-Nginx模块化结构

习惯上将Nginx分为:核心模块、标准模块、可选HTTP模块、邮件服务模块和第三方模块五大类。

792
来自专栏编程坑太多

一个简单的Django项目

1534
来自专栏决胜机器学习

RabbitMQ(六) ——RPC模式

RabbitMQ(六)——RPC模式 (原创内容,转载请注明来源,谢谢) 一、概述 RabbitMQ的RPC模式,支持生产者和消费者不在同一个系统中,即允许远程...

3675
来自专栏liulun

在CentOS上搭建PHP服务器环境

 您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/ ...

5058
来自专栏程序员八阿哥

python中os.path 与sys.path

看别人写的代码,会发现两个和路径设置有关的模块 os 和sys。 python 中我们会使用这两个模块和文件路径, 创建文件 之类的 操作。 使用ubunt...

941
来自专栏web编程技术分享

【php增删改查实例】第二十一节 - 用户修改功能19.1 添加用户修改的按钮

2054
来自专栏惨绿少年

OpenSUSE 服务器系统部署

1、准备 1.1 下载系统 下载地址:https://software.opensuse.org/distributions/leap     目前的最新版本为...

4457
来自专栏linux系统运维

rsync通过服务同步,linux系统日志,screen工具

2014
来自专栏小狼的世界

使用phpize给PHP动态添加扩展

2、执行phpize。/home/fltrpsrv2/srv2/bin/phpize

1662
来自专栏smy

windows下操作linux虚拟机映射网络驱动器中文件提示chmod权限不足解决方案

为了方便操作,linux虚拟机会通过windows下连接网络驱动器的方式共享自己的文件,对于前端来说,我想把gulp放在windows磁盘,操作虚拟机中的php...

1933

扫码关注云+社区

领取腾讯云代金券