zoukankan      html  css  js  c++  java
  • 简聊 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 黑白单这种需求

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

  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452848.html
Copyright © 2011-2022 走看看