Web身份认证——【 Session认证 】

Web身份认证——【 Session认证 】

1、Cookie回顾

​ 在上一篇博文中,我们学习了第一种认证方式Cookie认证,同时也实现了用户的登录认证功能,但是能在最后我们也了解到了Cookie认证的缺点,就是Cookie保存在客户端浏览器中,可能存在Cookie拦击、篡改、伪造的风险,所有不支持大家将一些隐私的数据存储。

2、提高身份认证的安全

​ 那么今天,我继续用商场收银员结账的例子来向大家讲解如何提高身份认证的安全性。

​ 那么为了防止客户伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证,只要收银机确认存在的会员卡,才能被打折或正常使用。简单来说就是想要打折,先必须要有会员卡,同时收银机上也要存在该用户会员卡的信息才能打折。

在这里插入图片描述

​ 那么这种 “会员卡+刷卡认证” 双重认证的设计理念,就是Session认证机制的精髓所在。

3、session 认证

3.1 什么是session认证

session 是另一种记录用户登录状态的机制,不同点是 Cookie 保存在客户端浏览器中,而 session 保存在服务器中。

3.2 session 的用途

session 存储或者说运行在服务器端,当用户第一次访问服务器时,可以当客户的登录信息记录,当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截或者验证。

3.3 session 的工作流程

​ 当浏览器访问服务器,并发送第一次请求时,服务器端会创建一个session对象,并生成一个类似于{key:value}的键值对,将其记录或者保存在服务器的内存中,然后将key(键)返回到浏览器中,服务器自动保存Cookie。当浏览器下次再访问时,携带Cookie中的Key找到对应的session中的value,那么才算认证成功。

在这里插入图片描述

4、session在Node.js中的使用

4.1 安装 express-session 中间件

​ 在express项目中,只需要安装express-session中间件,即可在项目中使用session认证。

npm i express-session

4.2 配置express-sission中间件

express-session中间件安装成功之后,需要通过app.use()来注册或者说配置express-session中间件。

// 导入 express-session 模块
const session = require("express-session");
// 配置session中间件
app.use(session({
    secret:"Inlett",//服务器端生成的session签名
    resave:false,// 不强制保存session,即使它并没有变化
    saveUninitialized:true, // 强制将未初始的session存储
    name:"hellow", //返回给客户端的Cookie名称
    cookie:{ //设置返回给客户端的Cookie字符串的属性
        maxAge:90000 //有效时间90000ms,cookie和session一样都是
    }
}));

4.4 向session中存储数据

​ 当express-session中间件配置成功之后,即可通过req.session来访问和使用ssession对象,从而存储用户的基本信息。

app.post('/api/login', (req, res) => {
  // 判断用户提交的登录信息是否正确
  if (req.body.username !== 'admin' || req.body.password !== '000000') {
    return res.send({ status: 1, msg: '登录失败' })
  }
  // 向session对象中存储user(用户的信息)和islogin(用户的登录状态)属性
  req.session.user = req.body; // 用户的信息
  req.session.islogin = true; // 用户的登录状态

  res.send({ status: 0, msg: '登录成功' })
})

4.5 从 session 中获取数据

// 获取用户昵称的接口
app.get('/api/username', (req, res) => {
  // 如果session中存储的用户登录状态不为true或者为空
  if (!req.session.islogin) {
      // 那么先让其登录
     return res.send("请先登录!");
  }
  // 否则就是登录状态
  res.send(`<h1>欢迎${req.session.user}登录</h1>`);
})

4.6 清空 session 中的数据

​ 调用req.session.destroy()函数,即可清空服务器中保存的所有session 数据。

![session属性](E:\后端\node.js\笔记\images\session属性.png)// 退出登录的接口
app.post('/api/logout', (req, res) => {
  // 清空 Session 信息
  req.session.destroy()
  res.send({
    status: 0,
    msg: '退出登录成功',
  })
})

5、配置 session 的属性说明

在这里插入图片描述

6、用户登录案例

const fs = require("fs");
const path = require("path");
const express = require("express");
const app = express();
const router = express.Router();
const session = require("express-session");

// 配置session中间件
app.use(session({
    secret: "inLettxinxi", //用来对session id相关的cookie进行签名
    resave: false, // 是否每次都重新保存会话,建议false
    saveUninitialized: true,  是否自动保存未初始化的会话,建议false
    name: "nihao",
    cookie: {
        maxAge: 20000
    }
}));

app.use(express.urlencoded({ extended: false }));


router.get("/", (req, res) => {
    fs.readFile(path.join(__dirname, "../client/login.html"), "utf8", (err, data) => {
        res.send(data);
    });
});

// 用户第一次登录
router.post("/login", (req, res) => {
    // 判断用户提供的登录信息
    if (req.body.uid !== "10000" || req.body.pwd !== "admin") {
        return res.send("登录失败!");
    }
    req.session.user = req.body.uid;
    req.session.islogin = true;
    res.send("成功!");
});

// 当客户端再次访问的时候
router.get("/index", (req, res) => {
    console.log(!req.session.islogin);
    if (!req.session.islogin) {
        return res.send("请先登录!");
    }
    res.send(`<h1>欢迎${req.session.user}登录</h1>`);
});

router.post("/logout", (req, res) => {
    req.session.destroy();
    res.send({
        status: 0,
        msg: "退出登录成功!"
    });
});
app.use(router);

app.listen(8081, "192.168.124.15", () => {
    console.log("服务器开启成功!");
});

7、session 与 cookie 的区别

1、数据存放bai位置不同:

​ cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、安全程度不同:

​ cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3、性能使用程度不同:

​ session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、数据存储大小不同:

​ 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。

5、会话机制不同

​ session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。

器性能方面,应当使用cookie。

4、数据存储大小不同:

​ 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。

5、会话机制不同

​ session会话机制:session会话机制是一种服务器端机制,它使用类似于哈希表(可能还有哈希表)的结构来保存信息。

​ cookies会话机制:cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器。 Web服务器使用HTTP标头将cookie发送到客户端。在客户端终端,浏览器解析cookie并将其保存为本地文件,该文件自动将来自同一服务器的任何请求绑定到这些cookie。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Web开发中,Session是一种在服务器端存储用户数据的方式,可以在多个页面中共享这些数据。Session通常用于存储用户登录信息、购物车信息等。 在Python中,可以使用内置的`session`对象来实现Session功能。下面是一个简单的例子: ```python from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) app.secret_key = 'my_secret_key' @app.route('/') def index(): if 'username' in session: username = session['username'] return 'Logged in as ' + username + '<br>' + \ "<b><a href = '/logout'>click here to log out</a></b>" return "You are not logged in <br><a href = '/login'></b>" + \ "click here to log in</b></a>" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action="" method="post"> <p><input type="text" name="username"> <p><input type="submit" value="Login"> </form> ''' @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('index')) ``` 在上面的例子中,我们使用了Flask框架来实现Web应用。在应用启动时,我们设置了一个`secret_key`,这个密钥用于保护Session数据的安全性。 在`index`函数中,我们检查了Session中是否存在`username`键。如果存在,说明用户已经登录,我们将显示用户的用户名和一个链接,可以用于退出登录。如果不存在,说明用户尚未登录,我们将显示一个登录链接。 在`login`函数中,我们检查了请求的方法是否为POST。如果是,说明用户提交了登录表单,我们将从表单中获取用户名,并将其存储到Session中。然后,我们将重定向到`index`函数中。如果请求的方法为GET,我们将显示一个包含用户名输入框和提交按钮的表单。 在`logout`函数中,我们使用`pop`方法从Session中删除`username`键。然后,我们将重定向到`index`函数中。 总之,Session是一个非常有用的工具,可以帮助我们在Web应用中存储和共享用户数据。使用Python中的`session`对象可以很容易地实现Session功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值