token验证_简聊 Session 与 Token 身份验证

点击上方“ 码农编程进阶笔记 ”,选择“置顶或者星标

文末有干货,每天定时与您相约!

前言

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

Session 时代

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

a0c7ae90788c1aa274fcb4b71604bfb4.png

1. 发送请求。

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

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

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

// 开启sessionsession_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 ? 再次先埋一处伏笔。 )

e2a5ff756e9f319a0b059c5c537aa3a2.png

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

09adb4db85eef2d98e40aa158ec677d3.png

查看响应头信息,就是在此处知道了 session_id = 689u7fiqejt70dujb9uk44eq79。因此才会有在步骤 2 中查看文件。

其中 path=/ 指的是 cookie 储存浏览器的位置。

浏览器将 session_id 保存在客户端本地,存在 cookie。如下图所示:

b49437cb8186ea7d7b78a3288ded7409.png

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

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

3871b4a8a38886abbcf5b84ab14b8616.png

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

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

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

// 开启sessionsession_start();// 设置session的值,稍后测试给该是否能取出echo $_SESSION['name'];
我们再次请求 http://test.com:8080/index.php,请求头中以及携带着 session_id 信息:

7d027594309008b7bbf59bf59345eb7d.png

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

60c9e10eec1af6431a04dafe14819843.png

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

1a9329db7982dfe596259455039ded4d.png

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

Token 时代

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

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

2.Token 可以避免 CSRF 攻击

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

有状态 Token

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

  1. 颁发 token

    53a8e56e1a32b44e1c20145418f886f4.png

  2. 服务端校验 token

    f7f4512735ef480321265315c164a26b.png

  3. token 过期

5a5e9e35b4e7dae888962d14cc14dc69.png

无状态 Token

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

  1. 颁发 token

    6213227f6936f6437aebdbf747e23762.png

  2. 服务端校验 token

7e048539b71604522957bbd2c731b509.png

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

链接:https://learnku.com/articles/17867

e42c4c3772b06097daab02aa34595b80.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值