Session、Cookie的原理以及区别

文章介绍了HTTP协议中的会话控制机制,主要探讨了cookie和session的概念、使用方法以及它们之间的区别。通过示例展示了在Node.js中使用express库操作cookie和session的方法,包括创建、获取和删除cookie,以及session的设置、读取和销毁。同时,强调了cookie的安全性和存储限制,以及session在服务端存储的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、简介

二、cookie

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

创建cookie

获取cookie

删除的cookie 

 三、session 

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

session登录        符合所有匹配条件的才可设置session信息 

session销毁

session获取   通过检测session是否存在标识

 四、session和cookie的区别


一、简介

服务端要区分用户,HTTP是一种无状态的协议,但是没有办法区分多次请求是否来自同一客户端。为了解决该问题,一般我们通过 会话控制来解决。常见的会话控制有三种:cookie、session、token

二、cookie

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

  • cookie是按照域名划分保存的
  • 浏览器向服务器发送请求时,会自动携带当前域名下的可用 cookie 设置在请求头中,然后传递给服务器。这个请求头的名字也叫 cookie 
  • ie浏览器中可查看cookie,maxAge为cookie存活的生命周期,只要生命周期到期后,cookie才会失效。
const express = require('express')

//中间件
const cookieParser = require('cookie-parser');
const { log } = require('console');
const app = express();
app.use(cookieParser());

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

app.get('/set-cookie', (req, res) => {
    //会在浏览器关闭时销毁 maxAge:存活时间,单位毫秒
    res.cookie('name', 'hello', {
        maxAge: 1000 * 60
    })
    res.cookie('theme', 'blue')
    res.send('home')
});

//获取cookie
app.get('/get-cookie', (req, res) => {
    console.log(req.cookies);
     res.send(`获取cookie+${req.cookies.name}`)
 });

//删除 cookie 
app.get('/remove-cookie', (req, res) => {
    //删除方法
    res.clearCookie('name')
    res.send('删除成功')
});


app.listen(3000, () => {
    console.log('success');
})
  • 创建cookie

  • 获取cookie

  • 删除的cookie 

 三、session 

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

  • 实现会话控制,可识别用户身份,快速获取当前用户的相关信息
  • 填写账号密校验身份,校验通过后 创建 session  对象,然后将 session_id 的值 通过响应头返回给浏览器 。浏览器获得 cookie ,下次发请求就会携带 cookie 。服务端通过 cookie 中的 session_id 确定用户身份。

1. 安装包

npm i express-session connect-mongo

 2. 设置session中间件

const express = require('express')

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

//创建应用对象
const app = express();

//设置session 中间件
app.use(session({
    //设置cookie的name,默认值是connect.sid,也就是session_id
    name: 'sid',
    //参与加密的字符串又称为签名
    secret: 'BadRabbit',
    //是否在每次请求后保存session
    resave: true,
    //是否为每次请求都设置一个cookie来存储session的id
    saveUninitialized: false,
    //数据库连接配置
    store: MongoStore.create({
        mongoUrl: 'mongodb://127.0.0.1:27017/project'
    }),
    cookie: {
        //开启后前端无法通过js对其进行访问
        httpOnly: true,
        //控制cookie,session_id的过期时间
        maxAge: 1000 * 60 * 5
    }

}))

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

app.get('/login', (req, res) => {
    //?username=admin&password=admin
    if (req.query.username === 'admin' & req.query.password === 'admin') {
        req.session.username = 'admin';
        req.session.uid = '258kkld'
        res.send('登录成功')
    } else {
        res.send('登录失败')
    }
})

//session读取
app.get('/cart', (req, res) => {
    //检测session 是否存在用户数据,是否有标识
    if (req.session.username) {
        res.send('购物车页面')
    } else {
        res.send('您还未登录')
    }
})
//session销毁
app.get('/logout', (req, res) => {
    req.session.destroy((err) => {
        if (err) {
            res.send('退出失败')
        }
        res.send('退出成功')
    })

})

app.listen(3000, () => {
    console.log('success');
})

  • session登录        符合所有匹配条件的才可设置session信息 

  • session销毁

  • session获取   通过检测session是否存在标识

 四、session和cookie的区别

1. 存储的位置

  • cookie :浏览器
  • session:服务端

2. 安全性

  • cookie是以明文方式存储在客户端的,安全较低
  • session是存放于服务端的,安全性相对较好

3.网络传输

  • cookie设置内容过多会增大报文体积,会影响传输效率
  • session通过cookie传递session_id,不影响效率

4. 存储限制

  • 浏览器对cookie的存储是有约束的
  • session数据存储在服务端,没有这些限制

5.  原理

  • 浏览器第一次接收到cookie信息后,接下来每次向同一个服务器发送请求时,都会发送之前存在本地的cookie。除非生命到头,或者被销毁。
  • 服务端为每个过来的用户保存一个session信息,为了以后方便知道session的到底是谁,所以把每个 session_id 传给浏览器的 cookie 。这样下次浏览器再次访问服务器的时候,浏览器携带的 cookie 把 session_id 告诉了服务器,然后服务器就能知道具体的session是谁了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

才不吃胡萝卜嘞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值