Session & Cookie

推荐Blog:
彻底理解Cookie、Session、Token
从 Session、Cookie 到 Token 以及 JWT
Tocken 和 Session
JSESSIONID 的简单说明

Cookie 是存放在客户端本地磁盘的一段文本信息 。客户端请求服务器,如果服务器需要记录该用户状态,就使用 Response 向客户端浏览器颁发一个 Cookie。客户端会把 Cookie 保存起来,当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认用户状态。服务器还可以根据需要修改 Cookie 的内容 。

Session

Session 是存放在服务器上的用户会话信息 ,可以存放在磁盘或者内存中 。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器,Session 默认存放在服务器的一个文件(而非内存)里,不过也可以存放在内存里,Session 的运行依赖 Session ID,而 Session ID 一般是存在于 Cookie 中的,提交给服务器 Cookie 时,Session ID 也会随之传送给服务器,也就是说,如果浏览器禁用(或者清除)了 Cookie,同时 Session 也会失效(但可以通过其他方式实现)其他方式实现传递 Session ID:①.URL重写:将 Session ID 放在 URL 中传递给服务器; ②.表单隐藏字段:提交表单时,设置一个隐藏的 Session ID 字段 。

Difference Description
存放位置 Cookie 数据存放在客户的浏览器上,Session 数据放在服务器上
依赖关系 Session 的实现依赖于 Cookie,Session 机制的实现依赖于 Session ID,而 Session ID 大部分情况需要由 Cookie 传递;但是,Session 机制也可以不依赖 Cookie 传递,借助 URL 重写,或者设置 表单隐藏字段
存储容量 Cookie 存储容量有上限,每个 <4k,一个站点最多保存20个 Cookie,一般由浏览器实现对其容量的限制;而 Session 存储容量没有上限,取决于服务器的存储容量配置(磁盘或内存)
存储方式 Cookie 中只能保管 ASCII 字符串,需要通过编码方式存储为 Unicode 字符或者 二进制数据;Session中能够存储任何类型的数据,包括且不限于字符串(string),整型(integer),列表(list)等等
隐私策略 Cookie 对客户端是可见的,别有用心的人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗,所以它是不安全的;Session 存储在服务器上,对客户端是透明的,不存在敏感信息泄漏的风险
有效期 开发可以通过设置 Cookie 的过期时间属性,使其存放于客户端(可称为 Persistent Cookie),达到使 Cookie 长期有效的效果 ;Session 依赖于名为 JSESSIONID 的 Cookie (可称为 Session Cookie),而 Cookie JSESSIONID 的过期时间默认为-1,当前浏览器的窗口关闭后,Session 也会消失,假如设置 Session 的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出
服务器压力 Cookie 保管在客户端,不占用服务器资源; Session 是保管在服务器端的,每个用户都会产生一个 Session,假如并发访问的用户非常多,会产生非常多的 Session ,耗费大量的内存或磁盘空间,所以 Seesion 的有效期也很短,考虑到减轻服务器压力,应当使用 Cookie
跨域支持 此处跨域指的是跨二级域名(如 search.wqh.com,blog.wqh.com),Cookie 支持跨域(使用Ajax);Session 本身不支持跨域,可以通过 Cookie 或者 URL重写 的方式,传递给不同的域名

Cookie:第一天登录博客园,输入用户名密码,点击记住密码(十天之内免密登录),第二天到第十天,再次打开博客园网址,直接显示是已经登录的状态,这个时候用到的一个机制就是 Cookie

Session:某个时间段,我登录了博客园,在各路大神的博客中穿梭浏览,请求的 URL 地址不断变换,每篇博文都少不了我几个评论,但整个过程中,我依旧没有退出登录,服务器端维持了我的会话,跟踪我的用户状态,这个时候用到的一个机制就是 Session

Session stores of PHPMyadmin

# 创建 nginx 配置文件
[root@web01 ~]# cat /etc/nginx/conf.d/phpmyadmin.com.conf 
server {
	listen 80;
	server_name phpmyadmin.com;
	root /website/phpmyadmin;
	index index.php;
	location ~ .php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

# 解压缩软件安装包,到站点目录
[root@web01 website]# pwd
/website
[root@web01 website]# ll
total 12
drwxr-xr-x 13 www www 4096 May 26 16:40 phpmyadmin
drwx------ 14 www www  296 Jun  4  2018 wecenter
drwxr-xr-x  5 www www 4096 May 26 10:39 wordpress

# 创建 phpmyadmin 连接数据库配置文件,有样本文件,复制一个即可(去掉 sample )
[root@web01 phpmyadmin]# pwd
/website/phpmyadmin
[root@web01 phpmyadmin]# ll *sample*
-rw-r--r-- 1 www www 4516 Jun  4  2019 config.sample.inc.php
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php

# 修改此配置文件,远程连接到数据库
[root@web01 phpmyadmin]# vi config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.1.51';

# 修改 Session 文件目录的属组(变成 nginx服务 和 php-fpm服务 执行用户的属组),原属主属组为 root.apache
[root@web01 ~]# chgrp www /var/lib/php/ -R

此时服务端的 Session 信息是以文件存放在固定的 /var/lib/php/session 目录中,当客户端浏览器打开了窗口,就会生成一个 Session 信息;我们也可以将 Session 信息存放在数据库中,需要配置一个 Redis 数据库,专门存储 Session 信息 。

# 安装 Redis 数据库,启动,并加入开机自启,检验端口
[root@nfs ~]# yum -y install redis
[root@nfs ~]# systemctl start redis
[root@nfs ~]# systemctl enable redis
[root@nfs ~]# netstat -lntp | grep redis
tcp        0      0 172.16.1.31:6379        0.0.0.0:*               LISTEN      14328/redis-server
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14328/redis-server  
# 配置 Redis 数据库的 监听网段(172.16.1.0/24)
[root@nfs ~]# sed  -i '/^bind/c bind 127.0.0.1 172.16.1.31' /etc/redis.conf

# 配置 web服务端的 /etc/php.ini,设置 session 处理机制
[root@web01 ~]# vi /etc/php.ini 
session.save_handler = redis
session.save_path = "tcp://172.16.1.31:6379"
;session.save_path = "tcp://172.16.1.51:6379?auth=123"   # 如果redis存在密码,则使用该方式  
session.auto_start = 1

# 配置 web服务端的 /etc/php-fpm.d/www.conf,注释原有的 session 处理机制
[root@web01 ~]# vi /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files      # `;` 在 php代码 中代表注释
;php_value[session.save_path]    = /var/lib/php/session

# 重新加载 php-fpm 配置文件
[root@web01 ~]# systemctl reload php-fpm

此时服务端的 Session 信息存放在远程 Redis 数据库中 。

原文地址:https://www.cnblogs.com/zzzwqh/p/12968495.html