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 条评论
登录 后参与评论

相关文章

来自专栏零基础使用Django2.0.1打造在线教育网站

关于HTTP不能不说的秘密

超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最为广泛的一种网络协议。所有WWW文件都必须遵守这个标准。设计...

653
来自专栏木头编程 - moTzxx

小程序 POST请求不到数据的一种情况

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

933
来自专栏Java技术栈

分布式Session共享解决方案

Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session...

3456
来自专栏小程序·云开发官方专栏

关于小程序的基础库

原文链接:https://godbasin.github.io/2018/09/23/wxapp-basic-lib/

892
来自专栏FreeBuf

ProxyChains实现自动添加代理逃避检测

使用爬虫爬取网站或者使用扫描器扫描目标时经常会遇到扫描频率较为频繁导致IP被封或者限制访问的情况,这时候我们就需要考虑利用IP代理的方式不断的变换IP进行爬虫和...

2935
来自专栏企鹅号快讯

基于 Swoole 的微信扫码登录

随着微信的普及,扫码登录方式越来越被现在的应用所使用。它因为不用去记住密码,只要有微信号即可方便快捷登录。微信的开放平台原生就有支持扫码登录的功能,不过大部分人...

2339
来自专栏Java职业技术分享

后端技能树修炼:基于队列的流量削峰模式

在分布式架构中,前端一个请求会经过后端的多个服务的处理才返回结果,这时就可能会存在一种情况,在间歇性高负载情况下,某个服务 B 的处理能力不能满足负载的需求,从...

440
来自专栏BeJavaGod

文档!重要的事情说第四遍~

之前我有提过文档的事,标题是《文档!文档!文档!重要的事情说三遍!》,其中提到的文档工具是使用wiki来管理文档,当然也能配合jira来分发任务,以及管理bug...

2663
来自专栏开源优测

有那么几张图给大家看看

531
来自专栏企鹅号快讯

PhpSploit:一款隐蔽性极强的后渗透利用框架

今天给大家介绍的是一款名叫PhpSploit的远程控制框架,该工具可以帮助攻击者在客户端与Web服务器端之间建立隐蔽性极强的交互式链接(类似Shell)。简而言...

1879

扫码关注云+社区