用户登录权限

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、 Cookie与session
    • 1.HTTP无状态
    • 2.cookie 和 session 的生命周期
      • 2.1 cookie 生命周期影响因素
      • 2.2 session 生命周期影响因素
    • 3.cookie 和 session 的区别
    • 4.工作原理
    • 3 用户登录Node.js和Express验证session
  • 二、JSON Web Token
    • 1. JWT 介绍
    • 2. JWT 组成部分
    • 3.JWT 的原理
    • 4.用户登录Node.js和Express验证JWT

前言

本文记录了用户登录的两种鉴权方式,以及相关知识点的记录。


一、 Cookie与session

  • cookie和session是来实现状态的记录,都是由服务器生成,用来存储特定的值。
  • 一般情况下,在服务器端,session的存储方式:文件方式、数据库方式,用 sessionId 来识别。
  • 客户端(浏览器)在发送请求的时候,会自动将存活、可用的cookie封装在请求头(headers)中和请求一起发送。

1.HTTP无状态

  • HTTP 协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息。这样一些交互业务就无法支撑。

2.cookie 和 session 的生命周期

2.1 cookie 生命周期影响因素

  • cookie自身的存活时间:是服务器生成cookie时去设定的。
  • 客户端是否保留cookie。对客户端自身有影响,对其它封包工具无影响。

2.2 session 生命周期影响因素

  • 服务器对于session对象保存的最大时间设置。
  • 客户端进程是否关闭。对客户端自身有影响,对其它封包工具无影响。

3.cookie 和 session 的区别

  • 存储位置:cookie 是存在客户端,session是存在服务端。
  • 安全性:session 比 cookie 更安全。
  • 存储内容:Session中存储的是对象,而Cookie中存储的是字符串。
  • 保持时间:Session随会话结束而关闭,而Cookie可以长期保存在客户端,除非被设置过期或者被删除。
  • 对服务器压力:每个用户都会产生一个session,如果并发访问的用户过多,就会产生非常多的session,耗费大量的内存。

为什么session 比 cookie 更安全?

  • cookie 是存储在客户端的,可见、可改变。
  • session 存储在服务器端,不可见,不可改变。

4.工作原理

1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

在这里插入图片描述

3 用户登录Node.js和Express验证session

  • express 引入会自动生成加密的 sessionId, 然后校验session
const express = require("express");
const session = requrie("express-session");
const MongoStore = require("connect-mongo")
const app = express();
//注册session
app.use(session({secret:"this is session",//服务器生成sessionresave:true,saveUninitialized:true,//强制将初始化的session 存储cookie:{maxAge:100 * 60 * 10, //过期时间secure:false, //为true的时候只有 https 协议才能访问cookie},rolling:true, //true:超时前刷新,cookie会重新计时//false:超时前刷新多次,按第一次刷新计时store:MongoStore.create({mongoUrl:'mongodb://127.0.0.1:27017/vv_session',ttl: 1000 * 60 * 10, //过期时间}),})
);
//设置session
app.use((req,res,next)=>{if(req.url === "/login"){next()return;}if(req.session.user){req.session.garbage = Date();next();}else{res.redirect("/login")}
})
//注销session

二、JSON Web Token

1. JWT 介绍

  • JSON Web Token(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC 7519)。它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。

2. JWT 组成部分

  • Header (头部):是一个 JSON 对象,通常由 token 类型和签名算法名两部分组成。
    { "alg": "HS256", //示签名的算法(algorithm) "typ": "JWT" //表示这个令牌(token)的类型(type) }
  • Payload(载荷):也是一个 JSON 对象,用来存放实际需要传递的数据,通常会被base64url编码

JWT 规定了7个官方字段

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号
  • Signature(签名):将Header和Payload部分组合起来,防止数据篡改。

3.JWT 的原理

  • 服务器认证以后,生成一个 JSON 对象,发回给用户,以后在用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
    在这里插入图片描述

4.用户登录Node.js和Express验证JWT

const express = require('express');
const jwt = require('jsonwebtoken');const app = express();
const secretKey = 'your-secret-key';// 中间件:验证JWT
const verifyToken = (req, res, next) => {const token = req.headers.authorization;if (!token) {return res.status(401).json({ message: '无法验证身份' });}jwt.verify(token, secretKey, (err, decoded) => {if (err) {return res.status(401).json({ message: '身份验证失败' });}req.user = decoded;next();});
};// 路由:受保护的资源
app.get('/protected', verifyToken, (req, res) => {res.json({ message: '欢迎访问受保护的资源', user: req.user });
});// 路由:生成JWT
app.post('/login', (req, res) => {const user = { id: 1, username: 'user123' };const token = jwt.sign(user, secretKey, { expiresIn: '1h' });res.json({ token });
});app.listen(3000, () => {console.log('服务器运行在端口 3000');
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法系列篇】递归、搜索和回溯(二)

文章目录 前言1. 两两交换链表中的节点1.1 题目要求1.2 做题思路1.3 代码实现 2. Pow(X,N)2.1 题目要求2.2 做题思路2.3 代码实现 3. 计算布尔二叉树的值3.1 题目要求3.2 做题思路3.3 代码实现 4. 求根节点到叶结点数字之和4.1 题目要求4.2 做题思路4.3 代码实现 前言 前面为大…

计算机毕业设计springboot+ssm停车场车位预约系统java

管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为:1.停车超过预约时间段 2.预约未使用 于系统的基本要求 (1)功能要求&am…

6G来袭,真的有必要吗?

6G来袭,6G标准将在2025年完成制定,2030年商用。当5G都还没玩明白的时候,6G又来了。 这次6G又提出了三个全新高大上场景,感知通信、人工智能通信、天地一体泛在物联,精英们还说,未来要连接很多机器人、元宇宙…

PHP基础 - 循环与条件语句

循环语句 1)for循环: 重复执行一个代码块指定的次数。 for ($i = 0; $i < 5; $i++) { // 初始化 $i 为 0,每次循环后将 $i 值增加 1,当 $i 小于 5 时执行循环echo "The number is: $i \n"; // 输出当前 $i 的值并换行 }// 循环输出结果为: // The number …

mysql字段设计规范:使用unsigned(无符号的)存储非负值

如果一个字段存储的是数值&#xff0c;并且是非负数&#xff0c;要设置为unsigned&#xff08;无符号的&#xff09;。 例如&#xff1a; 备注&#xff1a;对于类型是 FLOAT、 DOUBLE和 DECIMAL的&#xff0c;UNSIGNED属性已经废弃了&#xff0c;可能在mysql的未来某个版本去…

C++ //习题2.5 请写出下列表达式的值。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.5 习题2.5 请写出下列表达式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 设a的初值为3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

UI自动化测试工具的定义及重要性

UI自动化测试工具在现代软件开发中起着不可或缺的作用。它们能够提高测试效率、减少人为错误、提供全面的测试覆盖&#xff0c;并支持持续集成。通过有效使用UI自动化测试工具&#xff0c;开发团队可以提高软件质量&#xff0c;提供更可靠的应用程序&#xff0c;满足用户的需求…

C语言之数组精讲(2)

目录 数组的复制 输入数组元素的值 对数组的元素进行倒序排列 使用数组进行成绩处理 对象式宏 数组元素的最大值和最小值 赋值表达式的判断 数组的元素个数 结语 数组的复制 我们把数组中的元素全部复制到另一个数组中。 #include<stdio.h>int main() {int i;int…

SwinIR: Image Restoration Using Swin Transformer

SwinIR 简介 论文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代码&#xff1a;SwinIR ​ 本文提出了一个基于swin transformer的图像超分模型swinIR。其中SwinIR分为三部分&#xff1a;浅层特征提取、深层特征提取和高质量图像重建模块。 现阶段问…

19.java程序设计-基于SpringBoot的博客管理系统的设计与实现

摘要 随着信息技术的迅速发展&#xff0c;博客作为一种重要的信息传播和交流工具&#xff0c;逐渐在互联网上占据重要地位。为了满足用户对个性化博客管理的需求&#xff0c;本研究设计并实现了一种基于Spring Boot框架的博客管理系统。 本系统通过采用前后端分离的架构&…

【算法题】密钥格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

【C++11(三)】智能指针详解--RAII思想循环引用问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 为什么要有智能指针?3. RAII思想…

【BUG】微信小程序image不会随着url动态变化

问题描述&#xff1a; 第一次打开界面&#xff0c;显示的是默认头像而不是用户头像&#xff0c;似乎image里面的src只要第一次有值就不会再更新了 解决 不要给src里面的变量设置初始值&#xff0c;而是直接赋空值

DevOps搭建(七)-安装Jenkins详细步骤

这里我们用Docker进行安装 1、拉取Jenkins镜像 Jenkins download and deployment 选择LTS长期支持的版本,接着点击Docker链接进入 找到上面的版本,并copy拉取镜像的命令 docker pull jenkins/jenkins:2.426.1-lts 2、docker-compose安装Jenkins 首先创建安装目录/home/f…

STM32 cubeMX 呼吸灯实验

文章代码使用 HAL 库。 文章目录 一、1.PWM原理二、LED 原理图三、使用cubemx 配置 led四、PWM 相关函数五、PWM占空比占空比计算六、PWM 呼吸灯重要代码总结 呼吸灯 一、1.PWM原理 PWM全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种常…

拥有大量虾皮买家号有哪些好处

拥有众多Shopee买家账号&#xff0c;无疑是卖家们获取极大优势的一项策略。多账号的运用不仅有助于卖家在Shopee平台上获得更为丰富的流量&#xff0c;更能够在关键词排名和销售表现等方面为其带来显著提升。 首先&#xff0c;多个Shopee买家账号的灵活运用&#xff0c;使卖家能…

JavaScript <有道翻译之数据解密‘23年12月06日版‘>--案例(三)

前言: 记得上半年还是去年,有道翻译还是直接返回明文数据;现在也跟着,用接口返回加密数据了; 娱乐一下,破他的密文数据... 成品效果图: js部分: 对于找他的密文数据有点费时,针对密文--->搜他地址和启动器不是特别容易,辗转多时(搜:descrypt/json.parse 结合使用更快),有图…

swing快速入门(四)

注释很详细&#xff0c;直接上代码 上一篇 增加内容 流式布局范例 import java.awt.*;public class swing_test_2{public static void main(String[] args){//创建一个窗口对象Frame framenew Frame("test");//设置窗口大小frame.setSize(800,800);//这里演示的是…

Gateway全局异常处理及请求响应监控

前言 我们在上一篇文章基于压测进行Feign调优完成的服务间调用的性能调优&#xff0c;此时我们也关注到一个问题&#xff0c;如果我们统一从网关调用服务&#xff0c;但是网关因为某些原因报错或者没有找到服务怎么办呢&#xff1f; 如下所示&#xff0c;笔者通过网关调用acc…

超声波清洗机会损伤物品吗?一文明白超声波清洗机有哪些优点

正确使用超声波清洗机且买对超声波清洗机是不会对清洗物品造成伤害的&#xff01; 一、超声波清洗机工作原理是如何的&#xff1f; 超声波清洗机的工作原理是利用超声波产生的空化振动来清洁物体。当超声波在清洗液中传播时&#xff0c;它会产生微小的气泡和振动&#xff0c;这…