深入浅出剖析COOKIE与SESSION(基于PHP)

版权声明:转载请注明出处 https://blog.csdn.net/weixin_40325128/article/details/81736346

很多刚入门的小伙伴,可能对于cookie跟session都不会陌生,但是觉得这两个东西很相似,但不知道该如何去区分跟使用,虽然两者有很多相似之处,但是两者又有不少区别,这里给小伙伴们讲解一下,供大家学习分享,少走弯路。转帖请注明,侵删

共同点:session跟cookie都是服务器用于持久化用户信息的工具。

不同点:二者的存储方式和应用场景又有很大的不同

session:

session一般存储在服务器端,默认的情况下是以文件存储的方式进行保存(配置:session.save_handler = ”files”),存储路径为session.save_path   session将用户的信息序列化保存在一个文本当中

这种方式相对比较安全,但是也相对比较局限,待我慢慢道来

交互流程: 客户端(浏览器)在第一次访问服务器端(网站)的时候,会通过请求头,传递本地所存储的cookie

其中有一个cookie为PHPSESSID ,这个cookie是用来跟服务器进行交互的,相当于session读取的一把钥匙,服务器接收到用户请求头传递过来的PHPSESSID,就会在session的存储目录中寻找对应的文件,如果找到了,就读取该文本,反序列化后放入到$_SESSION 超全局变量中,在开启session服务后,我们就可以通过这个变量查看到我们存储在服务端的信息。

假如在这一次交互过程中,客户端的请求头中并没有携带PHPSESSID这个cookie过来,那么分两种情况:

1 在这次交互中服务器脚本(例如PHP) 有开启了session服务(session_start())的话, 服务端会生成一个PHPSESSID,在响应头中发送set-cookie请求,将该PHPSESSID存储到客户端,默认有效时间为浏览器打开期间,此时该PHPSESSID存储在内存中,关闭浏览器内存释放(可以根据需要调整参数session.cookie_lifetime ,默认为0代表浏览器打开期间 )

2 在交互中服务器并没有开启session服务,那么在这次交互中,不存在session的交互,也无法读取$_SESSION变量

session的有效时间

session的使用受限于两个方面,一个是客户端的PHPSESSID ,一个是服务端的存储文本,只要其中一个失效,session就无法正常使用。这里分两个端讨论:

1 受限于客户端:

      1 服务器端对PHPSESSID在客户端的存储没有做持久化,按照php的默认配置session.cookie_lifetime=0的话,如果用户关闭浏览器,session失效。

      2 服务器端对PHPSESSID在客户端的存储已经做了持久化,那么session.cookie_lifetime=N 那么在有效期内,哪怕用户关闭浏览器,下次还是可以访问到session,因为session已经存储到硬盘上而不是在内存中。只要服务器端的存储文件还没有失效,session就可以正常使用。

2  受限于服务端

 session存储在服务端不代表就一直可用,根据PHP的配置项 session.gc_maxlifetime = 1440 默认资源回收期限是1440S 过了这个有效期,该存储文件就被视为垃圾,无法通过PHPSESSID进行访问。顺带提一句,session的资源回收,是通过配置参数设定回收概率去进行回收的,有兴趣的同学可以自行百度。

总结:session并不适合用来做客户端的持久化存储,基于session存储在服务端的特点,相对比较安全,但是持久化并不理想,session更适合用来作为用户在某一场景下,短时间内对用户重要信息的暂时存储。

cookie

持久化:cookie是存储客户端(内存或者硬盘),如果服务端向客户端发送设置cookie的请求时有带上有效时间expire,那么该cookie存储在硬盘中,否则就存在内存中,关闭浏览器cookie消失。但是cookie有个优势就是不用受到服务器存储文件过期的影响,假如设置了过期时间,那么在过期之前,cookie一直有效。

安全性:cookie基于存储在客户端的特点,并不需要像SESSION一样读取服务器文件,减少了服务器的I/O开销,但是在安全性方面很明显不容乐观,不能用于存储重要的用户信息。

大小:一般的浏览器最多只可以设置20个左右的cookie ,而session则没有限制

交互方式

cookie通过请求头向服务端传递,服务端通过响应头向客户端传递cookie操作指令(增删改)。在服务端直接改变$_COOKIE变量无法直接改变客户端的cookie,只能通过cookie函数等去设置

在开启session服务的前提下,session通过客户端请求头中的PHPSESSID获取超全局变量$_SESSION数组,可以通过直接改变$_SESSION数组的值,直接地改变session

总结:一些对安全性要求不高,又为了方便需要在客户端提前做好存储的信息,可以用cookie存储在客户端。

对于有集群需求的小伙伴,由于有多台服务器,可以把session存储在同一台Redis服务器中,实现session的归集。

设置PHP配置文件:php.ini

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

这样session的读取跟设置都会在Redis中去进行。

好了,先到这里,后续有更多的分享会进行更新,欢迎关注。

猜你喜欢

转载自blog.csdn.net/weixin_40325128/article/details/81736346