跳过正文

session与cookie详解

86 字· loading · loading ·

Session与Cookie详解

session 与 cookie 是什么?

  • session 与cookie 是属于一种会话控制技术,常用在身份识别,登录验证,数据传输等。
  • 举个例子:就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时候,我们怎么识别这个会员卡真实有效的呢?当我们将会员号给到收银员,收银员根据我们提供的会员号,输入到系统中,系统根据这个会员号去查询,如果查询到了就证明这个会员号是真实存在的.这里的会员号就好比cookie与session.会员系统就好比服务器端,收银员就好比客户端.

为什么会用到session与cookie?

  • 这里有必要了解一下http应用传输协议的特点了。由于http协议是无状态的,即浏览器去请求了一个网页,这时候就是一个http请求,当服务端接收到请求之后,返回客户端需要的数据,在这过程中浏览器与服务器是建立了一个连接的。但是当服务端返回数据,客户端收到数据之后,他们的这种连接关系就断开了。下次浏览器再去发送请求的时候,又是重新建立一个连接,这两个链接没有任何关系。试想一下,当我们登录一个商场系统的时候,进入首页做了登录操作,但是我们下单或者加入购物车的时候,还需要登录,每访问一个页面就要登录,是不是很繁琐同时也是很不科学的,万一我们加入购物车的商品,我们点击下单了,下单页面要登录而且还无法正确的反馈出你下单时的那些商品。

Http特点

  • http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。
  • 无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。
  • 无状态。http协议对事务的处理没有记忆能力。也就意味着如果需要前面的信息,只能重传,这无形之中增加数据的传输量。这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session
  • 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问
  • 灵活:这里主要指的是客户端可以通过http协议传输任意类型的数据。比如传输.jpg文件、.ppt文件等等,只需要设定content-type就可以进行传输。

Session

  • Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。
  • 一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。

Session的工作原理

  • 当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中.
  • 首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
  • 当执行PHP脚本时,通过使用session_register()函数注册session变量。
  • 当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

Session的运行原理

  • 客户端向服务端发起请求,建立通信
  • 服务端根据设置的Session创建指令,在服务端创建一个编号为SessionID的文件,里面的值就是Session具体的值(组成部分 变量名 | 类型 :长度:值).
  • 服务端将创建好的sessionid编号响应给客户端,客户则将该编号存在cookie中(一般我们在浏览器存储的调试栏中会发现cookie中有一个PHPSESSID的键,这就是SessionID,当然这个名称,我可以通过设置服务端是可以改变的).
  • 当下一次请求时,客户端将这个sessionid携带在请求中,发送给服务端,服务端根据这个sessionid来做一些业务判断.

Session的存储机制

  • 存储方式: session默认是文件存储的.我们可以通过php.ini的配置来设置存储驱动传送门。
  • 生命周期: 当我们未设置session的生命周期时,当浏览器关闭之后存储在客户端的phpsessid自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个phpsessid.之前的session,PHP会自动的根据垃圾回收机制自动删除.这里我们可以根据session_set_cookie_params($expire)函数来设置一个生命周期.

Session的使用场景

  • 用户身份识别
  • 数据传输
  • 登录控制(是否登录,单点登录)

Session的特点:

  • 不是线程安全的,应该避免多个线程共享同一个Session实例;
  • Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源;
  • Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。

Session的注意事项

  • 安全性: sessionid是按照一定的算法生成,要保证session的值唯一性和随机性
  • 客户端禁用cookie,根据上面session的运行原理可以得出,session的存储于传送还是依赖于客户端,因此当客户端禁用cookie时,客户端是无法保存PHPSESSID的,这时候可以通过url重写或者表单来实现session的传输.

Cookie

  • cookie是远程浏览器存储数据以此追踪用户和识别用户的的机制,从实现来说,cookie是存储在客户端上的一个数据片段(即保存在客户机中的一个简单的文本文件)

Cookie

  • 客户端向服务端发起一个http请求.
  • 服务端设置一个创建cookie的指令,响应给客户端
  • 客户端收到服务端响应的指令,根据指令在客户端创建一个cookie
  • 当下一次请求时,客户端携带这个cookie向服务端发送请求.

存储机制

  • cookie在客户端存储的形式有三种,不同的浏览器的存储机制不同,存的cookie也不同。
    • 文件存储: 浏览器会针对不同的域,在磁盘的对应目录创建一个单独的文件,来存储该域下面的cookie值.
    • 内存存储: 当浏览器关闭时,该cookie随之消失.根据下面的创建语法,当我们未设置过期时间时则会出现这种情况
    • flash存储: 这种存储方式是永久存储在磁盘中,即使通过浏览器删除一些数据都是无法删除该方式存储的cookie,如果需要删除,可能通过磁盘的方式

Cokie的应用

  • 用户身份识别
  • 数据传输
  • 登录控制(是否登录、单点登录)

Session与Cookie的区别

  • Session存储在服务端,Cookie存储在客户端。
  • Cookie的创建指令由服务端设置
  • Session的SessionID需要客户端存储

cookie与session的几个误区

客户端禁止cookie,session无法使用?

  • 使用url重写或者表单提交可以实现.

session和cookie的安全性比较,session存在客户端安全更高?

  • 由于cookie是存在客户端的,相对来说安全性是要低一些,不过在创建的时候可以设置$httpOnly值.
  • 由于cookie与session是相互关联的,获取到cookie一定程度上获取到了session,同样可以操作session.

cookie与session是不是在浏览器关闭的时候会消失?

  • 这需要查看存储机制了。cookie可以存文件,内存,flash.存内存当然浏览器关闭则消失了;session由于垃圾回收机制,当在垃圾回收机制内是不会删除的,除非你代码中显示的做了删除操作.

cookie是存储在客户端中,如何增加其安全性?

  • 我们可以在设置cookie的时候,增加一些特殊参数,如客户端信息ip、浏览器信息等.

当cookie存在客户端的文件中,是不是每个浏览器获取到这个文件都可以进行操作?

  • 要看浏览器之间对cookie的管理机制是不是一样.