简聊 Session 与 Token 身份验证[通俗易懂]

简聊 Session 与 Token 身份验证

大家好,又见面了,我是全栈君。

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

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

简聊 Session 与 Token 身份验证[通俗易懂]
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? 再次先埋一处伏笔。)简聊 Session 与 Token 身份验证[通俗易懂]

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

简聊 Session 与 Token 身份验证[通俗易懂]
查看响应头信息,就是在此处知道了 session_id = 689u7fiqejt70dujb9uk44eq79。因此才会有在步骤 2 中查看文件。其中 path=/ 指的是 cookie 储存浏览器的位置。浏览器将 session_id 保存在客户端本地,存在 cookie。如下图所示:

简聊 Session 与 Token 身份验证[通俗易懂]
4. 再次发送请求,请求头携带 session_id 请求服务端
我们只需再次请求 http://test.com:8080/index.php,浏览器会在请求头中携带着这个保存 session_id 的 cookie 去请求服务端。我们查看请求头中即可看到:

简聊 Session 与 Token 身份验证[通俗易懂]
5. 校验 session_id 来确认客户端身份
该操作是 php 的 session 机制来完成的。我们可以检测以下看是否能取出刚才设置的 $_SESSION[‘name’] 就可验证。

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

// 开启session
session_start();
// 设置session的值,稍后测试给该是否能取出
echo $_SESSION['name'];

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

简聊 Session 与 Token 身份验证[通俗易懂]
我们换一个 PostMan 模拟非法请求看是否能获取到 $_SESSION[‘name’] 内容?是无法获取到信息。

简聊 Session 与 Token 身份验证[通俗易懂]
尝试,我们在 PostMan 中把前面的 cookie=689u7fiqejt70dujb9uk44eq79 携带到请求头看是否能获取到信息?是可以获取到信息。

简聊 Session 与 Token 身份验证[通俗易懂]
以上就是整个请求流程的介绍,我们可以看出来 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

简聊 Session 与 Token 身份验证[通俗易懂]

服务端校验 token

简聊 Session 与 Token 身份验证[通俗易懂]

token 过期

简聊 Session 与 Token 身份验证[通俗易懂]

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

颁发 token

简聊 Session 与 Token 身份验证[通俗易懂]
服务端校验 token

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

参考文章:
JWT 超详细分析
PHP.ini 中的 session 主要配置详解

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111813.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vscode新建html文件并快速生成标准的html代码_用vscode写一个html页面

    vscode新建html文件并快速生成标准的html代码_用vscode写一个html页面在Vscode新建html文件1、点击OpenFolder:2、选择目标文件夹,新建一个拓展名为html的文件:3、在第1行输入!(英文状态下),按tab键,新建成功。界面如下图所示:转载于:https://www.cnblogs.com/zhangyu10/p/10535730.html…

    2022年8月22日
    9
  • 联想计算机的功能键,联想fn键怎么用 联想fn组合按键功能介绍【图文】「建议收藏」

    Fn键是每个笔记本上都拥有的按键,熟悉电脑的朋友都知道,笔记本为了考虑到超薄便携的特性,因此显示器上并没有像台式机那样的控制按钮,因此使用按钮调节笔记本显示器的亮度等参数就没办法实现。为此,笔记本将这些按钮集成到了键盘上,我们根据不同的情况就可以使用这些按钮调节电脑的某些参数。而Fn按键就是协助这些按钮实现操作的重要按键。那么在联想fn键和其他按键结合有什么作用呢?Fn+F1:如果我们在不按下fn…

    2022年4月14日
    258
  • resin安装与配置

    resin安装与配置

    2021年9月15日
    55
  • 卡方线性趋势检验_spss 卡方的线性趋势检验如何做?[通俗易懂]

    卡方线性趋势检验_spss 卡方的线性趋势检验如何做?[通俗易懂]Analyze—DescriptiveStatistics-Crosstabs过程,分别放入两个变量,然后在Statistics过程中勾上Chi-squrae,完成后会出现卡方独立性检验结果,其中有Linear-by-LinearAssociation一项,应该就是你所谓的卡放线性趋势检验。不过你的数据格式:阶段恶性正常111426281473182175是这样的话是没法直接在…

    2022年5月17日
    170
  • .net的winform中DialogResult属性的使用「建议收藏」

    .net的winform中DialogResult属性的使用「建议收藏」在winform项目开发时,我们常会遇到一种情况,在主窗口中需要打开窗口进行数据的增加或修改,关闭子窗口时需要刷新主窗口数据。此时就用到DialogResult这个属性。下面用一个简单例子说明DialogResult这个属性的使用方法。要实现下图中的功能,点击form1的跳转按钮,跳转至界面JumpForm,点击JumpForm界面的保存按…

    2022年6月22日
    54
  • PLSQL连接Oracle数据常见问题ORA-12154: TNS

    PLSQL连接Oracle数据常见问题ORA-12154: TNS相信使用过Oracle数据库的人一定碰到过“ORA-12154:TNS:无法解析指定的连接标识符”错误,我在此做一个小小的总结。     在程序中连接Oracle数据库的方式与其他常用数据库,如:MySql,SqlServer不同,这些数据库可以通过直接指定IP的方式连接,但是Oracle则需要通过Oracle客户端配置网络服务名的方式来连接。否则就会出现“ORA-12154:TNS

    2022年7月19日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号