Session会话管理

news2024/11/22 22:23:01

会话管理

  • Web会话管理概述
  • 常见的Web应用会话管理方式
    • 基于Server端的Session的管理方式
    • 基于Cookie的Session的管理方式
      • Cookie与Session最大的区别
      • Cookie-Based的管理方式
    • 基于Token-Based的管理方式
  • Web会话管理的安全问题

Web会话管理概述

  • 会话管理:在进行人机交互的时候,会话管理总是保持用户的整个会话活动的互助与计算机系统的跟踪过程。会话管理又分为:桌面会话管理、浏览器会话管理、Web服务器的会话管理。
  • 为什么要有会话管理:HTTP是一种无状态的协议,一次请求结束之后,客户端与服务端的链接就会断开,服务器再次收到请求时,无法识别这次请求是哪个用户发过来的,要重新建立连接。为了判断发送请求的用户,需要一种记录用户的方式,也就是Web会话管理。

常见的Web应用会话管理方式

  • 基于Server端的session的管理方式
  • cookie-based的管理方式
  • token-based的管理方式

基于Server端的Session的管理方式

在早期的Web应用之中,通常使用服务端session来管理用户的会话。
服务端session是用户第一次访问应用时,服务器就会创建的对象,代表用户的一次会话过程,可以用来存放数据。服务器为每一个session都分配一个唯一的session ID,以保证每个用户都有一个不同的session对象。
服务器在创建完session之后,会把session ID通过cookie返回给用户所在的浏览器,这样当用户第二次或者以后向服务器发送请求时,就会通过cookie把session ID传给服务器,以便服务器能根据session ID找到与该用户对应的session对象。
session通常设定有效时间,比如一个小时。当时间失效之后,服务器就会销毁之前的session,并且创建新的session用户。但如果在失效时间之内,有发送新的请求给服务器,服务器就会刷新对应的session有效时间。
session在一开始并不具备会话管理功能,只有在用户登录认证成功之后,并且往session对象里面放入了用户登陆成功的凭证,才能用来管理会话。管理会话的原理也很简单,拿到了用户的session对象之后,看其中有没有登录成功的凭证,就能判断这个用户是否已经登录。当用户主动退出的时候,会把它session对象里面的登录凭证清除掉。所以在用户登陆前或者退出后,或者session对象失效之后,肯定都是拿不到需要的登录凭证的。
优点:

  1. 某些地方使用可以简化Web开发:如果在诸多Web页面间传递一个变量,那么用session变量要比通过QueryString传递变量可使问题简化。
  2. 安全性好︰客户端与服务端保持会诂状态的保介始终只定一1es非过rKPE式要这个串够随机,攻击者就不能轻易冒充他人的session lD进行操作;除非通过CSRF或http劫持的方式,才有可能冒充别人进行操作;即使冒充成功,也必须被冒充的用户session里面包含有效的登录凭证才行。
    缺点:
  3. 这种方式将会话信息存储在Web服务器里面,当用户同时在线量比较多时,这些会话信息会占据比较多的内存;
  4. 当应用采用集群部署的时候,会遇到多台web服务器之间如何做session共享的问题。
  5. 多个应用要共享session时,还会遇到跨域问题。不同的应用可能部署的主机不一样,需要在各个应用做好cookie跨域的处理。
    接下来进行验证:
    在这里插入图片描述
    请添加图片描述
    请添加图片描述
    登录成功之后会在tmp文件夹中放置一个sess开头的文件,里面有登陆成功的凭证。

基于Cookie的Session的管理方式

session的管理方式会增加服务器的负担和架构的复杂性,所以后来就提出把用户的登录凭证直接存到客户端的方案,当用户登录成功之后,把登录凭证写到cookie里面,并给cookie设置有效期,后续请求直接验证存有登录凭证的cookie是否存在以及凭证是否有效,即可判断用户的登录状态。

Cookie与Session最大的区别

Cookie将数据存储在客户端;Session将数据存放在服务端。

Cookie-Based的管理方式

用户发起登录请求,服务端根据传入的用户密码之类的身份信息验证用户是否满足登录条件,如果满足,就根据用户信息创建一个登录凭证,这个登录凭证简单来说就是一个对象,最简单的形式可以只包含用户id、凭证创建时间和过期时间三个值。
服务端把上一步创建好的登录凭证,先对它做数字签名,然后再用对称加密算法做加密处理,将签名、加密后的字串,写入cookie。cookie的名字必须固定(如ticket),因为后面再获取的时候,还得根据这个名字来获取cookie值。这一步添加数字签名的目的是防止登录凭证里的信息被篡改,因为一旦信息被篡改,那么下一步做签名验证的时候肯定会失败。做加密的目的,是防止cookie被别人截取的时候,无法轻易读到其中的用户信息。
用户登录后发起后续请求,服务端根据上一步存登录凭证的cookie名字,获取到相关的cookie值。然后先做解密处理,再做数字签名的认证,如果这两步都失败,说明这个登录凭证非法;如果这两步成功,接着就可以拿到原始存入的登录凭证了。然后用这个凭证的过期时间和当前时间做对比,判断凭证是否过期,如果过期,就需要用户再重新登录;如果未过期,则允许请求继续。
优点:

  1. 实现了服务端的无状态化(最大的优点),服务端只需要负责创建和验证登录cookie即可,无需保持用户的状态信息。
  2. cookie可以跨越同域名下的的多个网页,但不能跨越多个域名使用
  3. 可以设置有效期限,控制cookie的生命周期,使之不会永远有效(攻击者可能拿到的是过期的cookie)

缺点:

  1. cookie有大小限制,存储不了太多数据。
  2. 每次传送cookie,增加了请求的数量,对访问性能也有影响。3、同样存在跨域问题(不同域名无法互相读取cookie)

基于Token-Based的管理方式

Session和Cookie两种会话管理方式由于都要用到Cookie,不适合用在nativeapp里面,因为native app不是浏览器,不好管理Cookie,因此都不适合做纯API服务的登录认证。要实现API服务的登录认证,就需要用到token-based的会话管理方式。
token-based的管理方式从流程上和实现上跟cookie-based的管理方式没有太多区别,只不过cookie-based的管理方式中写到cookie里面的ticket在这种方式下称为token,这个token在返回给客户端之后,后续请求都必须通过url参数或者是httpheader的形式,主动带上token,这样服务端接收到请求之后就能直接从http header或者url里面取到token进行验证。
优点:

  1. 支持跨域访问:Cookie是不支持跨域访问的,Token支持
  2. 无状态:Token无状态,Session有状态(有状态和无状态最大的区别就是搬铐端会不会保存客户端的信息)
  3. 支持移动设备:Token更适用于移动应用,Cookie不支持手机端访问

缺点:

  1. 占带宽:正常情况下Token要比session lD更大,需要消耗更多的流量,挤占更多带宽
  2. 无法在服务端注销,很难解决劫持问题

Web会话管理的安全问题

在Web应用里,会话管理的安全性始终是最重要的安全问题,对用户的影响极大。从会话管理凭证来说,Session会话管理的会话凭证仅仅是一个session lD,所以只要这个session lD足够随机,那么攻击者就不会轻易地冒充别人的session lD进行操作;Cookie会话管理的凭证(ticket)以及Token会话管理凭证(token)都是一个在服务端做了数字签名和加密处理的串,所以只要密钥不泄露,攻击者也无法轻易拿到这个串中有效信息并对它进行篡改。总之,这三种会话管理方式的凭证本身是比较安全的。
从客户端和服务端的HTTP过程来说,当攻击者截获到客户端请求中的会话凭证,就能拿这个凭证冒充原用户,做一些非法操作,而服务器也认不出来。这种安全问题,可以简单采用HTTPS来解决,虽然可能还有HTTP劫持这种更高程度的威胁存在,但是从代码能做的防范,确实也就是这个层次了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java高级篇之三大性质总结:原子性、可见性以及有序性

1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性。关于sy…

JavaSE:常用类

前言从现在开始进入高级部分的学习,鼓励自己一下!画个大饼: 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI很重要的东西,不能不会!Object类祖宗类,主要方法:t…

接口测试简介

接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 ——百度百科! …

低代码开发与传统开发有什么不同?有什么价值?

低代码开发与传统开发有些什么不同?有什么价值? 自2014年Forrester明确提出低代码(Low-Code)概念以来,这一领域已经逐步升温。近年来,低代码凭借其低开发门槛和易用性等优点赢得了众多投资研究机构和企业用…

设计模式(十四)----结构型模式之组合模式

1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树…

Cookie原理及JAVA端关于Cookie的增删改查操作

什么是Cookie 在java中,Cookie是来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中Cookie存放当前用户的私人数据 Cookie原理 用户打开浏览器第一次(指每次重新打开浏览器的第一次,而非指历来第一次&#xff0…

ChatGPT可以作为一个翻译器吗?

论文地址:https://arxiv.org/abs/2301.08745.pdf 背景 自从OpenAI2022年11月30日发布ChatGPT以来,基本上把NLP所有任务大统一了,那么在机器翻译的表现到底如何呢?腾讯AI Lab在翻译Prompt、多语言翻译以及翻译鲁棒性三方面做了一…

365天深度学习训练营-第J4周:ResNet与DenseNet结合探索

目录 一、前言 二、论文解读 三、DPN代码复现 四、总结 一、前言 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制● 难度:夯实基础⭐⭐ ● 语言:Python3、Pytorc…

难道ERP"死了",中台"凉了",低/无代码要称王了?

一句:“不上ERP等死,上了ERP找死”,可把ERP的尴尬处境说透了。 有人把ERP奉为信仰:“那些说ERP不好用的根本是没用明白。” 有人则认为ERP只是卖概念,冷嘲:“实施ERP的企业,估计一半都倒闭了。…

JavaSE-集合框架013-队列Queue及双端队列Deque

原文链接 Queue 我们可以把LinkedList当作队列来用,也可以当作链表来用。LinkedList只是一个实现方式,但是可以具备很多特点 虽然他是一个链表,但是当你从后加从前取,就是队列(Queue)。当你从后加从后取&a…

第七章 实现effect的stop功能

实现effect的stop功能 通过stop函数传入effect返回的runner 再次修改响应式对象的值的时候 不会修改成功 其实主要思路就是在调用stop函数的时候将 收集的effect依赖移除掉 老样子先给上测试用例: it(stop,()>{// 通过stop函数传入effect返回的runner 再次修…

JPG格式图片怎么弄?可以试试这些途径

在日常生活中,我们经常需要将图片转换为JPG格式,以便在各种设备上使用,因为 JPG 是一种常用的图像格式,具有广泛的兼容性和易用性。这里将介绍几种简单的方法,以帮助您将图片转换为JPG格式。方法一、使用格式转换软件转…

快速入门 Stream 流 【学习笔记】Java基础

若文章内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系博主删除。写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途。 学习视频:【黑马 Java 基础教程…

怎么避免计算机SCI论文的重复率过高? - 易智编译EaseEditing

论文成稿前 在撰写阶段就避免重复:在撰写阶段就避免文章中的重复内容,可以减少后期修改的工作量。 在写作前,可以制定良好的计划和大纲,规划好文章的结构和内容,从而减少重复内容。 加强对相关文献的阅读 为了避免自己…

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd)

6 最短路径 最短路径,对于图来说,是两顶点之间经过的边数最少的路径;对于网来说,是指两顶点之间经过的边上权值之和最小的路径。路径上第一个顶点为源点,最后一个顶点是终点。 6.1 迪杰斯特拉(Dijkstra&am…

【C语言】深度理解指针(上)

前言🌊谈到指针,想必大家都不陌生。它不仅是C语言的重难点,还是不少C初学者的噩梦。本期我们将深度探讨一些较为复杂的指针以及指针的妙用,带领大家感受指针的魅力😝。首先,我们先来复习复习指针的概念&…

dbutils给bean类对象赋值源码分析

本文重点 以ResultSetHandler的实现类BeanListHandler为例&#xff0c;探索dbutils的QueryRunner的实现细节&#xff0c;重点是如何给java bean类对象赋值。 public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws…

119.Android 简单的软键盘和菜单无缝切换效果,聊天界面软键盘无缝切换

//此效果主要通过动态设置windowSoftInputMode三种状态的切换实现&#xff1a;SOFT_INPUT_ADJUST_NOTHING、SOFT_INPUT_ADJUST_PAN、SOFT_INPUT_ADJUST_RESIZE。 1.第一步 导入需要用到的依赖库&#xff1a; //RecyclerView implementation com.android.support:recyclerview-…

做为骨干网络的分类模型的预训代码安装配置简单记录

一、安装配置环境 1、准备工作 代码地址 GitHub - bubbliiiing/classification-pytorch: 这是各个主干网络分类模型的源码&#xff0c;可以用于训练自己的分类模型。 # 创建环境 conda create -n ptorch1_2_0 python3.6 # 然后启动 conda install pytorch1.2.0 torchvision…

Anaconda环境配置Python绘图库Matplotlib的方法

本文介绍在Anaconda环境中&#xff0c;安装Python语言matplotlib模块的方法。 在之前的文章中&#xff0c;我们多次介绍了Python语言matplotlib库的使用&#xff1b;而这篇文章&#xff0c;就介绍一下在Anaconda环境下&#xff0c;配置matplotlib库的方法。 首先&#xff0c;打…