【网络】五分钟搞懂cookie、session、token

本文详细介绍了HTTP会话管理中的Cookie、Session和Token的原理、运作流程及使用方法。Cookie存储在客户端,随HTTP请求自动传递,用于识别用户;Session存储在服务器端,通过sessionId查找;Token作为无状态的令牌,包含用户信息并加密。文中还对比了它们在安全性、网络传输量、生命周期和大小方面的差异,并探讨了Token与Session的区别。

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

一、会话管理

HTTP协议是一个无状态的协议,它无法区分多次请求是否发送自同一客户端
cookie,session,token用来管理会话,识别用户身份

二、cookie

1、本质

存储在浏览器的文本,随着http请求自动传递给服务器。(请求头/响应头)

2、运作流程

cookie由服务器生成发送到客户端,客户端以key-value形式保存在本地的一小块数据,在下一次请求同一网站时会把该cookie发送给服务端。
在这里插入图片描述

3、cookie中重要参数

参数说明后端
Domain指定 cookie 所属域名,默认是当前域名cookie.setDomain("")
Max-Age设置cookie的过期时间,单位为秒cookie.setMaxAge(10)
Path指定 cookie 在哪个路径(路由)下生效,默认是 ‘/’cookie.setPath("")
HttpOnly如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全cookie.setHttpOnly(true)
Secure告诉浏览器此Cookie只能在Https安全协议中传输,如果是Http则禁止传输cookie.setSecure(true)

4、使用

// 引入express工具
const express =require('express');
// 1、引入 cookieParser 包
const cookieParser = require('cookie-parser');

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

// 2、设置 cookieParser 中间件
app.use(cookieParser());

// 3、创建路由规则
app.get('/set-cookie', (request, response) => {
    // 设置 cookie
    response.cookie('username','zhangsan', {maxAge: 5*60*1000});
    // 设置生命周期 单位毫秒
    // 响应
    response.send('Cookie的设置');
});

   // 读取 cookie
app.get('/get-cookie', (request, response) => {
    console.log(request.cookies);
    response.send('Cookie的读取');
});

  // 删除cookie
app.get('/delete-cookie', (request, response) => {
    response.clearCookie('username');
    response.send('成功退出登录');
});

// 启动服务
app.listen(80);

三、session

1、本质

存储在服务器端的一个对象,可以理解为一个状态列表 ,他们拥有一个唯一标识符号sessionId

2、运作流程

通常存放于 cookie 中。服务器收到 cookie 后解析出 sessionId,再去 session 列表中查找,才能找到相应session。
在这里插入图片描述

3、使用

// 1、下载安装
npm i connect-mongo express-session --save

// 2、引入模块
var session = require("express-session");

// 3、设置为中间件
app.use(session({
 name: 'id22',  //设置cookie的name,默认值是:connect.sid
 secret: 'atguigu', //参与加密的字符串(又称签名)
 saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
 resave: false ,//是否在每次请求时重新保存session
 cookie: {
  httpOnly: true, // 开启后前端无法通过 JS 操作
  maxAge: 1000*30 // 这一条 是控制 sessionID 的过期时间的
 },
}));

四、cookie和session区别

1、存在的位置

cookie 存在于客户端,临时文件夹中。
session 存在于服务器的内存中,一个session域对象为一个用户浏览器服务。

2、安全性

cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放。
session存放于服务器的内存中,所以安全性好。

3、网络传输量

cookie会传递消息给服务器。
session通过传id,递流量小。

4、生命周期(以20分钟为例)

cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束。
session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁;但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期。
关机会造成session生命周期的结束,但是对cookie没有影响

5、大小

cookie数量大小限制,数量不超过50个,单个大小<4kb
session 保存数据理论上没有任何限制(内存有多大就能有多大)

五、token

token 类似一个令牌,无状态,用户信息都被加密到 token 中,服务器收到 token 后解密就可知道是哪个用户。需要开发者手动添加。
在这里插入图片描述
Token与session的区别
1、Session是记录会话信息,token是令牌,访问资源接口所需要的的凭证,token使服务器端无状态化,不会存储会话信息。
2、Token的安全性比session好。因为token每一个请求都有签名还能防止监听以及重放攻击,而 session 是依赖链路层来保障通讯安全的。
3、Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。session 只提供一种简单的认证,即只要有此 sessionID ,即认为有此 User 的全部权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值