会话控制

会话控制

1、介绍

所谓会话控制,就是对会话进行控制。

HTTP是一种无状态协议,它没有办法区分多次请求是否来自同一个客户端,无法区别用户。

而产品中又大量存在这样的需求,所以我们需要通过会话控制来解决这个问题。

常见的会话控制技术有三种:

  • cookie
  • session
  • token

2、cookie

2.1、cookie是什么?

cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据。

cookie是保存在浏览器端的一小块数据。

cookie是按照域名划分保存的。

简单示例:

域名 cookie
www.baidu.com a=100;b=200
www.bilibili.com xid=102abce121;hm=12312323

2.2、cookie的特点

浏览器向服务器发送请求的时候,会自动将当前域名下可以使用的cookie设置在请求头中,然后传递给服务器。

这个请求头的名字也叫做cookie,所以将cookie理解为HTTP的请求头也可以。

服务器就可以通过浏览器传过来的cookie中的值,来辨认客户的身份。

2.3、express中操作cookie

const express = require('express');

const app = express();

app.get('/set-cookie', (req, res) => {
    // 设置cookie
    // res.cookie('name', 'zhangsan'); // 会在浏览器关闭的时候,销毁
    res.cookie('name', 'lisi', {maxAge: 60 * 1000}); // maxAge的单位是毫秒,这里设为有效期一分钟
    res.send('设置cookie');
});

app.get('/remove-cookie', (req, res) => {
    // 删除cookie
    res.clearCookie('name'); // 比如用户退出登录的时候删除
    res.send('删除cookie');
});

app.listen(3000);

2.3.2、获取cookie

使用cookie-parser库:

npm i cookie-parser

const express = require('express');
const cookieParser = require('cookie-parser');

const app = express();

app.use(cookieParser());

app.get('/set-cookie', (req, res) => {
    // 设置cookie
    // res.cookie('name', 'zhangsan'); // 会在浏览器关闭的时候,销毁
    res.cookie('name', 'lisi', {maxAge: 60 * 1000}); // maxAge的单位是毫秒,这里设为有效期一分钟
    res.send('设置cookie');
});

app.get('/remove-cookie', (req, res) => {
    // 删除cookie
    res.clearCookie('name'); // 比如用户退出登录的时候删除
    res.send('删除cookie');
});

// 获取cookie
app.get('/get-cookie', (req, res) => {
    console.log(req.cookies);
    res.send('获取cookie成功');
})

app.listen(3000);

3、session

3.1、session是什么?

session是保存服务器端的一块数据,保存当前访问用户的相关信息。

3.2、session的作用

实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息。

3.3、session运行流程

填写账号密码校验身份,校验通过之后创建session信息,然后将session_id的值通过响应头set-cookie返回给浏览器。

有了cookie,下次发送请求的时候会自动携带这个cookie,服务器通过cookie中的session_id的值确定用户的身份。

3.4、express中操作session

express中可以使用express-session对session进行操作。

npm i express-session

npm i connect-mongo(用户连接数据库,配置好之后,下述代码中的session会自动在数据库中进行增删改查)

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo');

const app = express();

// 设置session中间件
app.use(session({
    name: 'sid', // 设置cookie的name,默认值是connect.id
    secret: 'chen', // 参与加密的字符串(又称签名)
    saveUninitialized: false, // 是否在每次请求都设置一个cookie用来存储session的id
    resave: true, // 是否在每次请求时重新保存session
    store: MongoStore.create({
        mongoUrl: 'mongodb://127.0.0.1:27017/project' // 数据库的连接配置
    }),
    cookie: {
        httpOnly: true, // 开启后前端无法通过JS访问和操作(document.cookie访问)
        maxAge: 1000 * 300 // 这一条是控制sessionID的过期时间,浏览器端cookie过期了,服务端的session也过期了
    }
}));

// 首页路由
app.get('/home', (req, res) => {
    res.send('home');
});

// 登录
app.get('/login', (req, res) => {
    // username=admin&password=admin
    if (req.query.username === 'admin' && req.query.password === 'admin') {
        // 设置session信息
        req.session.username = 'admin';
        // 成功响应
        res.send('登录成功');
    } else {
        res.send('登录失败');
    }
});

// session的读取
app.get('/car', (req, res) => {
    // 检测session是否存在用户数据
    if (req.session.username) {
        res.send('购物车页面,欢迎光~~~临');
    } else {
        res.send('请登录');
    }
});

// session的销毁
app.get('/logout', (req, res) => {
    req.session.destroy(() => {
        res.send('退出成功');
    });
});

app.listen(3000);

4、session和cookie的区别

  • 1、存在位置
    • cookie:浏览器端
    • session:服务器端
  • 2、安全性
    • cookie是以明文的方式存放在客户端的,安全性相对较低
    • session是存在于服务器中,安全性较好
  • 3、网络传输量
    • cookie设置内容过多会增大报文体积,影响传输效率
    • session数据存储在服务器,只是通过cookie传递id,所以不影响传输效率
  • 4、存储限制
    • 浏览器限制单个cookie的保存数据不能超过4k,且单个域名下的存储数量也有限制
    • session存储在服务器中,没有这些限制。

5、token

5.1、token是什么?

token是服务端生成并返回给HTTP客户端的一串加密字符串,token中保存着用户信息。

5.2、token的作用

实现会话控制,可以识别用户的身份,主要用户移动端APP

5.3、token的工作流程

填写账号和密码校验身份,校验通过之后服务器创建并响应token,token一般是在响应体中返回给客户端的。

后续发送请求的时候,需要手动将token添加在请求报文中,一般是放在请求头中。

5.4、token的特点

  • 服务端压力更小
    • 因为数据是存储在客户端
  • 相对更安全
    • 数据加密
    • 可以避免CSRF(跨站请求伪造)
  • 扩展性更强
    • 服务之间可以共享
    • 增加服务节点更简单

5.5、JWT

JWT(JSON Web Token)是目前最流行的跨域认证解决方案,可以基于token进行身份验证。

JWT使token生成和校验更加规范。

我们可以使用jsonwebtoken包来操作token。

npm i jsonwebtoken

const express = require('express');

const jwt = require('jsonwebtoken');

const app = express();
// 创建token
// let token = jwt.sign(用户数据,加密字符串,配置对象)
// let token = jwt.sign({
//     username: 'zhangsan'
// }, 'chen', {
//     expiresIn: 3600 // 单位是秒
// });

// console.log(token);
let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNjg0MTM1MjIwLCJleHAiOjE2ODQxMzg4MjB9.x2pzuCKp78BDzMv1kzsukS-W9TkLUFgC3PYGUyhqeSo';

// 校验token
jwt.verify(token, 'chen', (err, data) => {
    if (err) {
        console.log('校验失败');
        return;
    }
    console.log(data);
});

app.listen(3000);
posted @ 2023-05-24 18:35  笔下洛璃  阅读(62)  评论(0编辑  收藏  举报