当前位置: 首页 > news >正文

【鉴权】Web 会话管理:Cookie、Session 和 Token 深度对比

目录

  • 引言
  • 一、Cookie
  • 二、Session
  • 三、Token (JWT)
  • 四、总结对比
  • 五、Token、Session 和 Cookie 的选择
  • 总结

引言

在现代 Web 开发中,CookieSessionToken 都是用于用户身份验证和状态管理的常见技术。每种技术有其特定的应用场景和优缺点,理解它们之间的差异对于构建安全和高效的 Web 应用至关重要。接下来我们将详细对比它们的特性、使用场景、安全性、以及优缺点。

一、Cookie

定义
Cookie 是一种小型的、由服务器生成并存储在用户浏览器中的数据,它可以在用户与服务器交互时传递特定的信息。例如,可以使用 Cookie 保存用户的登录状态、浏览偏好等。

特点

  • 存储位置:浏览器(客户端)
  • 数据存储:通常为键值对,数据量较小(通常小于 4KB)
  • 生命周期:可以设置有效期,过期后自动删除,或者会话结束时删除
  • 安全性:由于存储在客户端,容易受到篡改和窃取(如通过 XSS 攻击)
  • 使用场景:用户状态、浏览历史、跟踪用户行为(如 Google Analytics)

优点

  • 简单、易用,浏览器自动管理
  • 可以跨页面和请求传递数据,持久化会话
  • 支持设置失效时间,控制生命周期

缺点

  • 安全性较低,易受客户端攻击(如 XSS 攻击)
  • 数据量有限(浏览器限制存储大小)
  • 请求发送频繁,可能影响性能(每次请求都会携带)

Cookie 示例

// 设置一个 Cookie
document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2024 23:59:59 GMT";// 获取 Cookie
let username = document.cookie;
console.log(username); // 输出: username=JohnDoe

二、Session

定义
Session 是一种由服务器端生成并存储的临时数据结构,用于存储关于用户的会话信息(如用户 ID、权限等)。与 Cookie 不同,Session 数据存储在服务器端,而不是客户端。

特点

  • 存储位置:服务器端(如内存、数据库、缓存等)
  • 数据存储:通常包含用户的完整会话数据,如身份验证信息、访问权限等
  • 生命周期:会话持续到用户关闭浏览器,或者会话超时
  • 安全性:比 Cookie 安全,因为数据存储在服务器端,避免了 XSS 攻击
  • 使用场景:敏感信息存储、用户身份验证、权限控制

优点

  • 安全性高,数据存储在服务器端,防止客户端篡改
  • 可以存储大量数据,不受浏览器存储限制
  • 不会频繁随每个请求发送数据,只发送 Session ID

缺点

  • 需要服务器端存储,增加了服务器的负担
  • 会话过期或丢失时,用户必须重新登录
  • 当用户在多个设备或浏览器上登录时,不支持跨设备共享

Session 工作流程

  1. 用户登录,服务器为其生成一个 Session ID,并将其返回给浏览器以存储在 Cookie 中。
  2. 每次用户请求时,浏览器都会带上这个 Session ID,服务器根据该 ID 查找并验证用户的会话。
  3. 如果 Session 过期或无效,用户需要重新登录。

Session 示例

# Flask 示例:Session 使用
from flask import Flask, session, redirect, url_for, requestapp = Flask(__name__)
app.secret_key = 'your_secret_key'@app.route('/login', methods=['POST'])
def login():session['user_id'] = request.form['user_id']return redirect(url_for('dashboard'))@app.route('/dashboard')
def dashboard():if 'user_id' in session:return f"Welcome, {session['user_id']}!"else:return redirect(url_for('login'))

三、Token (JWT)

定义
Token(特别是 JWT,JSON Web Token)是一种基于 JSON 格式的安全令牌,用于在客户端和服务器之间传递身份信息。与 Cookie 和 Session 不同,JWT 是自包含的,意味着它包含了所有验证用户所需的信息。

特点

  • 存储位置:客户端(通常存储在 LocalStorage 或 SessionStorage)
  • 数据存储:自包含的用户信息、权限、有效期等
  • 生命周期:自定义有效期,通常较长
  • 安全性:比 Cookie 安全,因为它避免了服务器存储,但必须防止 Token 泄露(如 XSS 攻击)
  • 使用场景:跨域身份验证、单点登录(SSO)、API 认证

优点

  • 自包含的特性,减少服务器存储压力
  • 适用于分布式系统或微服务架构,支持跨域请求
  • 灵活的有效期控制,可以方便地处理刷新 Token

缺点

  • 如果泄露,攻击者可以伪造有效的 Token 进行攻击(需要确保 HTTPS)
  • 一旦生成,无法修改 Token 内的内容
  • 相较于 Session,管理和注销较为复杂

JWT 工作流程

  1. 用户登录时,服务器验证用户信息,生成一个包含用户数据和权限的 JWT。
  2. 该 JWT 被返回给客户端,客户端存储在 LocalStorage 或 SessionStorage 中。
  3. 每次请求时,客户端将 Token 放在请求头中,服务器验证 Token 的有效性。

JWT 示例

// 使用 JavaScript 生成和验证 JWT 示例
const jwt = require('jsonwebtoken');// 生成 JWT
const token = jwt.sign({ user_id: 123 }, 'secret_key', { expiresIn: '1h' });// 验证 JWT
jwt.verify(token, 'secret_key', (err, decoded) => {if (err) {console.log('Token is invalid or expired');} else {console.log(decoded); // 输出解码后的 Token 数据}
});

四、总结对比

特性CookieSessionToken (JWT)
存储位置客户端(浏览器)服务器端(内存、数据库、缓存等)客户端(通常存储在 LocalStorage 或 SessionStorage)
存储数据小量数据(如会话 ID、用户设置等)大量数据(如用户信息、权限等)自包含的数据(如用户信息、权限等)
生命周期可设置过期时间或会话结束时删除会话过期或浏览器关闭时失效自定义过期时间,通常较长
安全性安全性较低,易被篡改或盗取(需要加密)安全性较高,数据存储在服务器端安全性较高,但需要防止泄露(如 XSS 攻击)
使用场景存储非敏感数据(如用户设置、跟踪信息等)存储敏感数据(如身份验证、权限等)跨域认证、分布式系统中的身份验证
适用性适合于简单的应用,数据量较小,非敏感信息适合存储敏感信息,需要服务器验证的场景适合分布式架构,支持跨域认证和无状态管理

的工作流程对比图

以下是 CookieSessionToken 的工作流程图:

CSDN @ 2136
用户请求
服务器生成 Token 或 Session ID
Cookie or Session
Cookie: 保存数据到客户端
Session: 保存数据到服务器
每次请求携带 Cookie
每次请求携带 Session ID
服务器验证身份
返回数据
CSDN @ 2136

结论

  • Cookie 适合用于存储简单的、不敏感的用户信息,适合于状态保持。
  • Session 是一个传统的解决方案,适用于需要服务器端状态管理的场景,尤其是在传统的单体应用中,Session 能有效保证用户的认证状态和会话数据的安全性。
  • Token (JWT) 适用于跨域认证、微服务和无状态认证,特别是在分布式环境下非常有用,但需要注意 Token 的安全性管理。

五、Token、Session 和 Cookie 的选择

  • 简单的应用或传统的单体应用:如果你正在开发一个传统的单体应用(尤其是需要依赖用户登录状态的应用),使用 Session 可能会更为合适。它的安全性较高,而且实现起来简单。唯一需要注意的是,Session 在高并发情况下可能会带来性能问题,尤其是在分布式系统中。

  • 跨域应用或微服务架构:如果你的应用是一个跨域的单点登录系统,或者需要多个服务之间共享用户认证信息,使用 JWT Token 是更好的选择。它不仅支持跨域身份认证,而且适合现代的无状态应用架构。

  • 持久化数据或非敏感信息存储:如果你需要在客户端存储一些非敏感的、简单的信息(如主题偏好、购物车内容等),可以使用 Cookie。不过,需要注意它的安全性,确保使用 HttpOnlySecure 属性,防止被恶意脚本访问。

总结

在 Web 开发中,合理的会话管理是保证用户数据安全、提升用户体验的关键。每种身份验证和会话管理机制(如 CookieSessionToken)都有其独特的优缺点和适用场景。

  • Cookie 适用于存储一些简单的、非敏感的数据,并且可以在客户端和服务器之间传递小量数据。为了提高安全性,务必启用 HttpOnlySecure 和合理的 SameSite 属性。
  • Session 适用于存储需要保护的用户数据(如登录状态)。它的优势在于数据存储在服务器端,更加安全,但也带来了服务器端资源的压力。
  • Token(特别是 JWT)适用于分布式架构或微服务中,能够通过无状态的身份验证机制简化跨域或跨服务认证。然而,它也带来了一定的安全挑战,需要通过加密、签名和合理的过期策略来确保安全性。

最佳实践

  • 使用 HTTPS 加密所有数据传输。
  • 适当结合 CookieToken 进行身份验证,利用 Cookie 存储 Token,确保数据安全。
  • 定期更新会话密钥和 Token,确保会话生命周期合理。
  • 始终对敏感信息进行加密存储和传输。

通过合理设计和组合这些会话管理机制,可以有效提高应用的安全性和性能,提供更好的用户体验。


相关文章:

【鉴权】Web 会话管理:Cookie、Session 和 Token 深度对比

目录 引言一、Cookie二、Session三、Token (JWT)四、总结对比五、Token、Session 和 Cookie 的选择总结 引言 在现代 Web 开发中,Cookie、Session 和 Token 都是用于用户身份验证和状态管理的常见技术。每种技术有其特定的应用场景和优缺点,理解它们之间…...

ArkTS--应用状态

应用状态 应用状态相关的内容需要使用模拟器或真机调试,在API 11开始也支持preview 1.LocalStorage LocalStorage是页面级的UI状态存储,通过Entry装饰器接收参数可以在页面内共享数据 1.1 页面内共享数据 import {MyUser} from ../model/MyUser //用户对…...

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化: yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…...

java标准JavaBean类

1. public class test {//属性private String username;private String password;private String email;private String gender;private int age;//快捷键//altinsert//altFninsert//插件PTG1秒生成标准Javabean //插件ptg c//空参public test() {}//全部参数…...

MATLAB界面设计全攻略:从基础入门到高级应用

引言 MATLAB作为一种功能强大的科学计算软件,不仅可以进行各种复杂的数值计算,还可以通过其图形用户界面设计工具(GUI)为用户提供可视化操作界面。本教程旨在详细介绍MATLAB界面设计的全过程,为初学者提供从入门到精通…...

JavaScript API部分知识点

一、Dom获取&属性操作 (一)、 Web API 基本认知 1、变量声明 const 声明的值不能更改,而且const声明变量的时候需要里面进行初始化 但是对于引用数据类型,const声明的变量,里面存的不是 值,是 地址…...

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…...

C++初级入门(1)

第一部分 基础语法入门 一、基础 1、变量与常量 1、变量 变量存在的意义:方便管理内存空间 2、常量 用于记录程序中不可更改的数据 #define 常量名 常量值 const 数据类型 常量名常量值 ; 2、数据类型 1、整型 short 2字节 int 4字节 long Wi…...

group_concat配置影响程序出bug

在 ThinkPHP 5 中&#xff0c;想要临时修改 MySQL 数据库的 group_concat_max_len 参数&#xff0c;可以使用 原生 SQL 执行 来修改该值。你可以通过 Db 类来执行 SQL 语句&#xff0c;从而修改会话&#xff08;Session&#xff09;级别的变量。 步骤 设置 group_concat_max_l…...

将Go项目编译为可执行文件(windows/linux)

windows 编译成windows环境exe可执行文件过程&#xff0c;打开文件所在目录&#xff0c;在资源路径框中输入cmd&#xff0c;打开cmd命令框&#xff0c;通过“go env”查看当期环境变量&#xff0c;以windows10环境为例&#xff0c;默认为windows环境。 // 配置环境变量 SET C…...

IMS高压发生器维修高压电源维修XRG100/1000

IMS高压发生器的硬件组成&#xff1a; 高压控制发生器主要由高压发生器和高压控制器两部分组成。高压控制器是控制调节X射线管管电压和管电流的机构,高压发生器是管电压和管电流产生的执行机构,通过高压控制器对高压发生器进行控制调节,通过高压电缆将高压发生器与X射线管连接…...

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了&#xff0c;故准备把dexcap的源码也分析下。​下周则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始&#xff0c;dexcap的源码分析属于此文《DexCap——斯坦福李飞飞团队泡茶机器人&#xff1a;带…...

RabbitMQ的DLX(Dead-Letter-Exchange 死信交换机,死信交换器,死信邮箱)(重要)

RabbitMQ的DLX 1、RabbitMQ死信队列2、代码示例2.1、队列过期2.1.1、配置类RabbitConfig&#xff08;关键代码&#xff09;2.1.2、业务类MessageService2.1.3、配置文件application.yml2.1.4、启动类2.1.5、配置文件2.1.6、测试 2.2、消息过期2.2.1、配置类RabbitConfig2.2.2、…...

【STM32F1】——舵机角度控制与TIM定时器

【STM32F1】——舵机角度控制与TIM定时器 一、简介 本篇主要对舵机DS-S002M模块调试过程进行总结,实现了以下功能: 1)舵机转动角度的控制:利用STM32F103C8T6的TIM定时器产生PWM信号控制舵机DS-S002M转动一定的角度。 二、DS-S002M数字舵机介绍 电压:4.8-6.0V操作角度:…...

想要成为独立游戏作者 :通关!游戏设计之道 2-1 HUD

HUD特指显示屏幕上的信息&#xff0c;在是UI的子集&#xff0c;UI是一个游戏中虽有的交互元素的总称 本文用了大量ai总结 &#xff0b; 个人微调&#xff0c;不喜勿喷&#xff0c;前篇如下想要成为独立游戏作者 &#xff1a;通关&#xff01;游戏设计之道 1-4 操作篇-C…...

sql专题 之 三大范式

文章目录 背景范式介绍第一范式&#xff1a;属性不可再分第二范式第三范式注意事项 为什么不遵循后续的范式数据库范式在实际应用中会遇到哪些挑战&#xff1f; 背景 数据库的范式&#xff08;Normal Form&#xff09;是一组规则&#xff0c;用于设计数据库表结构以 减少数据冗…...

node.js安装和配置教程

软件介绍 Node.js是一个免费的、开源的、跨平台的JavaScript运行时环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Goo…...

定时器输入捕获实验配置

首先&#xff0c;第一个时基工作参数配置 HAL_TIM_IC_Init( ) 还是一样的套路&#xff0c;传参是一个句柄&#xff0c;先定义一个结构体 Instance&#xff1a;指向TIM_TypeDef的指针&#xff0c;表示定时器的实例。TIM_TypeDef是一个包含了定时器寄存器的结构体&#xff0c;用…...

【C/C++】memcpy函数的使用

零.导言 当我们学习了strcpy和strncpy函数后&#xff0c;也许会疑惑整形数组要如何拷贝&#xff0c;而今天我将讲解的memcpy函数便可以拷贝整形数组。 一.memcpy函数的使用 memcpy函数是一种C语言内存函数&#xff0c;可以按字节拷贝任意类型的数组&#xff0c;比如整形数组。 …...

spring-security(两种权限控制方式)

案例(写死的用户密码) package com.zking.security.service;import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; import org.sp…...

【mongodb】数据库的安装及连接初始化简明手册

NoSQL(NoSQL Not Only SQL )&#xff0c;意即"不仅仅是SQL"。 在现代的计算系统上每天网络上都会产生庞大的数据量。这些数据有很大一部分是由关系数据库管理系统&#xff08;RDBMS&#xff09;来处理。 通过应用实践证明&#xff0c;关系模型是非常适合于客户服务器…...

【科普】卷积、卷积核、池化、激活函数、全连接分别是什么?有什么用?

概念定义作用/用途解释举例卷积 (Convolution)是一种数学操作&#xff0c;通过在输入数据&#xff08;如图片&#xff09;上滑动卷积核&#xff0c;计算局部区域的加权和。提取数据中的局部特征&#xff0c;例如边缘、角点等。卷积就像在图片上滑动一个小的窗口&#xff0c;计算…...

距离向量路由选择协议和链路状态路由选择协议介绍

距离向量路由选择协议&#xff08;Distance Vector Routing Protocol&#xff09;和链路状态路由选择协议&#xff08;Link-State Routing Protocol&#xff09;是两种主要的网关协议&#xff0c;它们用于在网络内部选择数据传输的最佳路径。下面分别介绍这两种协议&#xff1a…...

【AI大模型】大型语言模型LLM基础概览:技术原理、发展历程与未来展望

目录 &#x1f354; 大语言模型 (LLM) 背景 &#x1f354; 语言模型 (Language Model, LM) 2.1 基于规则和统计的语言模型&#xff08;N-gram&#xff09; 2.2 神经网络语言模型 2.3 基于Transformer的预训练语言模型 2.4 大语言模型 &#x1f354; 语言模型的评估指标 …...

ubuntu 22.04 server 安装 和 初始化 LTS

ubuntu 22.04 server 安装 和 初始化 下载地址 https://releases.ubuntu.com/jammy/ 使用的镜像是 ubuntu-22.04.5-live-server-amd64.iso usb 启动盘制作工具 https://rufus.ie/zh/ rufus-4.6p.exe 需要主板 支持 UEFI 启动 Ubuntu22.04.4-server安装 流程 https://b…...

大数据机器学习算法与计算机视觉应用03:数据流

Data Stream Streaming ModelExample Streaming QuestionsHeavy HittersAlgorithm 1: For Majority elementMisra Gries AlgorithmApplicationsApproximation of count Streaming Model 数据流模型 数据流就是所有的数据先后到达&#xff0c;而不是同时存储在内存之中。在现…...

【代码随想录day25】【C++复健】491.递增子序列;46.全排列;47.全排列 II;51. N皇后;37. 解数独

491.递增子序列 本题做的时候除了去重逻辑之外&#xff0c;其他的也勉强算是写出来了&#xff0c;不过还是有问题的&#xff0c;总结如下&#xff1a; 1 本题的关键&#xff1a;去重 与其说是不知道用什么去重&#xff0c;更应该说是完全没想到本题需要去重&#xff0c;说明…...

AI智能识物(微信小程序)

AI智能识物&#xff0c;是一款实用的小程序。可以拍照智能识物&#xff0c;可识别地标、车型、花卉、植物、动物、果蔬、货币、红酒、食材等等&#xff0c;AI智能技术识别准确度高。 更新说明&#xff1a; 此源码为1.2.0版本。 主要更新内容&#xff1a;新增security.imgSec…...

游戏引擎学习第三天

视频参考:https://www.bilibili.com/video/BV1XTmqYSEtm/ 之前的程序不能退出&#xff0c;下面写关闭窗体的操作 PostQuitMessage 是 Windows API 中的一个函数&#xff0c;用于向当前线程的消息队列发送一个退出消息。其作用是请求应用程序退出消息循环&#xff0c;通常用于处…...

帝国CMS7.5仿模板堂柒喜模板建站网 素材资源下载站源码

环境要求&#xff1a;phpmysql、支付伪静态 本套模板采用帝国cms7.5版UTF-8开发&#xff0c;一款非常不错的高端建站源码模板&#xff0c; 适用于中小型网络建站工作室源码模板下载站&#xff0c;支持自定义设置会员组。 源码下载&#xff1a;https://download.csdn.net/down…...

网站建设销售销售流程图/广州宣布5条优化措施

1、数据属性 Configurable:true|false&#xff0c;表示能否通过delete将属性删除&#xff0c;默认为true。当把属性的Configurable设置为false后&#xff0c;该属性不能通过delete删除&#xff0c;并且也无法再将该属性的Configurable设置回true. Enumerable: true|false。表示…...

wordpress点赞代码/网页关键词优化软件

做电商的朋友都知道&#xff0c;如果有客户下单&#xff0c;那么就需要发货。拼多多对发货这块也是非常严格&#xff0c;如果被判为延迟发货就会受到处罚。那么拼多多延迟发货的原因有哪些&#xff0c;下面就为大家带来讲解。 拼多多延迟发货的原因有哪些&#xff1f; 1、忘…...

怎样做问卷网站/公司想做个网站怎么办

主动隔振 主动隔振&#xff1a;将作为振源的机器与地基隔离。 用单自由度系统举例&#xff0c;隔振材料位k与c 隔振前机器传到地基的力F0eiwtF_0e^{iwt}F0​eiwt 隔振后机器传到地基的响应xF0kβei(wt−θ1)x\frac{F_0}{k}\beta e^{i(wt-\theta_1)}xkF0​​βei(wt−θ1​)&…...

石家庄有学校交做网站和优化的吗/日本积分榜最新排名

1.Shell是什么&#xff1f; Shell 既是一种脚本编程语言&#xff0c;也是一个连接内核和用户的软件(命令解释器)。 Shell作为命令解释器&#xff0c;它在操作系统的最外层&#xff0c;负责直接与用户对话&#xff0c;把用户的输入解释给操作系统&#xff0c;并处理各种各样的操…...

17网站一起做网店的流程/网站seo诊断分析

使用电脑就务必会碰见升级提示图标&#xff0c;有时候我们不想更新&#xff0c;但是又一直提醒而且没办法忽略&#xff0c;针对这个问题小编整理了三种系统关闭自动更新图标的方法&#xff0c;来为解决大家关于升级系统的图标的困扰&#xff0c;快赶紧看看吧~一、Win10关闭自动…...

京东网站建设吗/seo销售

解决Android WebView拦截url,视频播放加载失败的问题发布时间&#xff1a;2020-10-08 05:19:44来源&#xff1a;脚本之家阅读&#xff1a;86作者&#xff1a;灵均子孟需求&#xff1a;Android调用webView加载网页的时候&#xff0c;拦截某一个链接不执行此链接&#xff0c;执行…...