PHP会话技术 - 对Cookie,Session,JWT的理解和使用

1 Cookie

1.1 概念和理解

cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回cookie 的值。

语法:

setcookie(name, value, expire, path, domain);
参数讲解
name必须,cookie名称
value必须,cookie的值
expire可选,过期时间
path可选,cookie的服务器路径。
domain可选,域名

注意: 上述的path,如果该参数设为‘/‘ 的话, cookie 就在整个 domain 内有 效,如果设为 ‘/foo/‘cookie 就只在 domain 下的 /foo/目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录

1.2 Cookie功能

  • 记录访客某些信息。可以记录用户访问网页次数,或者用户曾经输入的信息,或者用户上次登录的用户名
  • 在页面之间传递变量。当浏览器页面关闭时,所有变量信息随之消失。如果用户声明一个id=123,想把这个变量传递到另一个页面,可以用Cookie将这个变量保存下来,通过下一页通过该Cookie来获取变量的值

1.3 示例

有以下文件夹目录
在这里插入图片描述
cookie.phtml中设置cookie

    <?php
        setcookie("user", "testName", time()+3600,"/code/testcookie/");
    ?>

去同目录下的read.php去读取cookie

    <?php
        var_dump($_COOKIE);
 	 ?>

运行结果如下
在这里插入图片描述

2 Session

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

2.1 开启session

开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

注释:session_start() 函数必须位于 标签之前:

实例

<?php session_start(); ?>
 
<html>
<body>

</body>
</html>

3 JWT

3.1 概念和理解

首先要明确,JWT想较于传统Session的优势在哪里?

session 认证的缺陷在于:
$nbsp;由于 session 是保存在服务器里,所以如果分布式部署应用的话,会出现session不能共享的问题,很难扩展.

所以:什么是JWT?

JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。

JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。

3.2 JWT的组成

JWT由三个部门组成

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名) :服务器通过 PayloadHeader 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成

请添加图片描述

3.2.1 Header

Header 通常由两部分组成:

  • typ(Type):令牌类型,也就是 JWT
  • alg(Algorithm) :签名算法,比如 HS256

示例:

{
  "alg": "HS256",
  "typ": "JWT"
}

JSON 形式的 Header 被转换成 Base64 编码,成为 JWT 的第一部分。

3.2.2 Payload

Payload 也是 JSON 格式数据,其中包含了 Claims(声明,包含 JWT 的相关信息)。

Claims 分为三种类型:

  • Registered Claims(注册声明) :预定义的一些声明,建议使用,但不是强制性的。
  • Public Claims(公有声明) :JWT 签发方可以自定义的声明,但是为了避免冲突,应该在 IANA JSON Web Token Registryopen in new window 中定义它们。
  • Private Claims(私有声明) :JWT 签发方因为项目需要而自定义的声明,更符合实际项目场景使用。

常见注声明如下:

  • iss(issuer)JWT 签发方。
  • iat(issued at time)JWT 签发时间。
  • sub(subject)JWT 主题。
  • aud(audience)JWT 接收方。
  • exp(expiration time)JWT 的过期时间。
  • nbf(not before time)JWT 生效时间,早于该定义的时间的 JWT 不能被接受处理。
  • jti(JWT ID)JWT 唯一标识。

示例:

{
  "uid": "ff1212f5-d8d1-4496-bf41-d2dda73de19a",
  "sub": "1234567890",
  "name": "John Doe",
  "exp": 15323232,
  "iat": 1516239022,
  "scope": ["admin", "user"]
}

4 插件 php-jwt的使用

4.1 php-jwt介绍

php-jwt github下载网址

php-jwt 是一个用于生成和验证 JSON Web TokenPHP 库。

4.2 php-jwt的简单实用

4.2.1 创建jwt令牌

$payload 指定了包含在 jwt 中的几个信息,user_id,username,exp
jwt被加密使用$key制定的密钥,生成jwt可以保存在客户端。

JWT::encode 创建 jwt 令牌

//需要先引用JET类
use \Firebase\JWT\JWT;

$key = 'example_key';

$payload = array(
    "user_id" => 123,
    "username" => "john.doe",
    "exp" => time()+3600 //过期时间 一小时后过期
);

$jwt = JWT::encode($payload, $key);
//$jwt = JWT::encode($payload, $key, 'HS256');
echo "JWT生成成功".$jwt;
4.2.2 解码jwt令牌

JWT::decode 解码 jwt 令牌


$jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiJKb2huIERvZSJ9.lU9FdBqKHEMuRifok5OFDJxQVBd-4s8r0gXKG_QnkKY";

$decoded = JWT::decode($jwt,"your_secret_key",array('HS256'));

$decode_array = (array) $decoded;

现在解码后可以使用

if($decode_array["user_id"] == 123){
  //code
}else{
  //code
}

5 参考文档

[1] 菜鸟教程-cookie/session
[2] JWT理论
[3] jwt官网

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值