php token和session,简聊 Session 与 Token 身份验证

前言

当我们账号密码登陆以后,如何确保用户认证是我们每一个phper都会遇到的问题,从最开始的Session 到 Token ,让我们带着求知欲了解一下它。

Session时代

Web开发使用Http协议,HTTP协议最初是匿名的,无状态的请求/响应协议。这样简单的设计可以使HTTP协议专注于资源的传输(HTTP是超文本传输协议);随着WEB的发展,业务需要确定客户端的唯一性,引入session会话这个概念 。PHP设置session 整个过程如下,我们一步一步探究其中,服务器采用的LNMP:

php token和session,简聊 Session 与 Token 身份验证_第1张图片

1.发送请求。

请求http://test.com:8080/index.php。

2.开启session,并根据php.ini配置保存session。

首先我们在服务端代码开启Session (因php.ini并没有默认开启,需程序开启)

// 开启session

session_start();

// 设置session的值,稍后测试给该是否能取出

$_SESSION['name'] = 'phper';

echo 'weclome to session start!';

然后查看php.ini中session保存的路径,默认文件保存的话,保存路径为/tmp,文件名为默认为sess_{session_id}。主要查看以下参数参数:

session.save_handler = files

下来我们登陆服务器查看/tmp目录下的查看该Session文件。即sess_689u7fiqejt70dujb9uk44eq79文件。(此处可能会有疑问,我们是怎么知道session_id = 689u7fiqejt70dujb9uk44eq79?再次先埋一处伏笔。)

php token和session,简聊 Session 与 Token 身份验证_第2张图片

3.查看本次请求,服务器响应头携带session_id信息。

php token和session,简聊 Session 与 Token 身份验证_第3张图片

查看响应头信息,就是在此处知道了session_id = 689u7fiqejt70dujb9uk44eq79。因此才会有在步骤2中查看文件。其中path=/指的是cookie储存浏览器的位置。浏览器将session_id保存在客户端本地,存在cookie。如下图所示:

php token和session,简聊 Session 与 Token 身份验证_第4张图片

4.再次发送请求,请求头携带session_id请求服务端

我们只需再次请求http://test.com:8080/index.php,浏览器会在请求头中携带着这个保存session_id的cookie去请求服务端。我们查看请求头中即可看到:

php token和session,简聊 Session 与 Token 身份验证_第5张图片

5.校验session_id来确认客户端身份

该操作是php的session机制来完成的。我们可以检测以下看是否能取出刚才设置的$_SESSION['name']就可验证。

我们修改index.php代码如下:

// 开启session

session_start();

// 设置session的值,稍后测试给该是否能取出

echo $_SESSION['name'];

我们再次请求http://test.com:8080/index.php,请求头中以及携带着session_id信息:

php token和session,简聊 Session 与 Token 身份验证_第6张图片

我们换一个PostMan模拟非法请求看是否能获取到$_SESSION['name']内容?是无法获取到信息。

php token和session,简聊 Session 与 Token 身份验证_第7张图片

尝试,我们在PostMan中把前面的cookie=689u7fiqejt70dujb9uk44eq79携带到请求头看是否能获取到信息?是可以获取到信息。

php token和session,简聊 Session 与 Token 身份验证_第8张图片

以上就是整个请求流程的介绍,我们可以看出来session_id信息是非常重要的。有关PHP关于Session的配置项和使用说明

Token时代

web2.0时代的项目都采用 前后端分离。以Token这种方式的用户认证更受大家欢迎。Token可以解决哪些问题呢?

1.Token 完全由应用管理,所以它可以避开同源策略

2.Token 可以避免 CSRF 攻击

3.Token 可以是无状态的,可以在多个服务间共享

有状态Token

有状态Token就是将Token的相关属性(eg:Token过期时间等)记录在服务端。我们用图表述颁发token,校验token,token过期这三个场景。

颁发token

php token和session,简聊 Session 与 Token 身份验证_第9张图片

服务端校验token

php token和session,简聊 Session 与 Token 身份验证_第10张图片

token过期

php token和session,简聊 Session 与 Token 身份验证_第11张图片

无状态Token

无状态Token就是将Toekn的相关属性(eg:Token过期时间等)保存在Token中,JWT就是一种无状态的Token。JWT这里不详细说明,我们主要看下几个流程:

颁发token

php token和session,简聊 Session 与 Token 身份验证_第12张图片

服务端校验token

php token和session,简聊 Session 与 Token 身份验证_第13张图片

所以,有状态的Token 与 无状态的Token 面临的问题就是 有状态要占用服务器资源并且不利于分布式,微服务等架构。有状态刚好能解决这个问题,但是无状态的Token ,不存在Token黑白单这种需求

本作品采用《CC 协议》,转载必须注明作者和本文链接

你可能感兴趣的:(php,token和session)