简聊 Session 与 Token 身份验证
前言
当我们账号密码登陆以后,如何确保用户认证是我们每一个 phper 都会遇到的问题,从最开始的
Session
到Token
,让我们带着求知欲了解一下它。
Session 时代
Web 开发使用 Http 协议,HTTP 协议最初是匿名的,无状态的请求 / 响应协议。这样简单的设计可以使 HTTP 协议专注于资源的传输(HTTP 是超文本传输协议); 随着 WEB 的发展,业务需要确定客户端的唯一性,引入 session
会话这个概念 。PHP 设置 session
整个过程如下,我们一步一步探究其中,服务器采用的 LNMP:
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
? 再次先埋一处伏笔。)
3. 查看本次请求,服务器响应头携带 session_id 信息。
查看响应头信息,就是在此处知道了 session_id = 689u7fiqejt70dujb9uk44eq79
。因此才会有在步骤 2 中查看文件。其中 path=/
指的是 cookie 储存浏览器的位置。浏览器将 session_id
保存在客户端本地,存在 cookie。如下图所示:
4. 再次发送请求,请求头携带 session_id 请求服务端
我们只需再次请求 http://test.com:8080/index.php
,浏览器会在请求头中携带着这个保存 session_id 的 cookie 去请求服务端。我们查看请求头中即可看到:
5. 校验 session_id 来确认客户端身份
该操作是 php 的 session 机制来完成的。我们可以检测以下看是否能取出刚才设置的 $_SESSION['name']
就可验证。
-
我们修改
index.php
代码如下:// 开启session session_start(); // 设置session的值,稍后测试给该是否能取出 echo $_SESSION['name'];
-
我们再次请求
http://test.com:8080/index.php
,请求头中以及携带着session_id
信息: -
我们换一个 PostMan 模拟非法请求看是否能获取到
$_SESSION['name']
内容?是无法获取到信息。 -
尝试,我们在 PostMan 中把前面的
cookie=689u7fiqejt70dujb9uk44eq79
携带到请求头看是否能获取到信息?是可以获取到信息。
以上就是整个请求流程的介绍,我们可以看出来 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
-
服务端校验 token
- token 过期
无状态 Token
无状态 Token 就是将 Toekn 的相关属性(eg:Token 过期时间等)保存在 Token 中,JWT
就是一种无状态的 Token。JWT
这里不详细说明,我们主要看下几个流程:
-
颁发 token
-
服务端校验 token
所以,有状态的 Token 与 无状态的 Token 面临的问题就是 有状态要占用服务器资源并且不利于分布式,微服务等架构。有状态刚好能解决这个问题,但是无状态的 Token ,不存在 Token 黑白单这种需求
上一篇: CentOS 配置静态IP
下一篇: react 脚手架搭建