实现登陆模块时Cookie,Session,Token的理解

news2025/8/13 13:16:45

目录

    • 引言
    • 一、简化版登陆(不保存登录状态)
    • 二、Session 登陆
    • 三、Cookie+Session 实现登录
    • 四、Token登陆

引言

先思考问题:
1、如何实现登陆?

(1)表单输入账号密码
(2)后台数据库验证

2、为什么平日登陆一次,隔几天打开浏览器进入网页,登录状态还在呢?

因为保存了用户的登陆状态。下次访问的时候,先查看是否保存登录状态,有则不需要重新登陆。

登录状态的处理:Cookie,Session,Token三种方式
接下来看看如何区分和实践

一、简化版登陆(不保存登录状态)

这样的方式,第一次打开浏览器访问网页:需要登录。然后关闭浏览器
第二次打卡浏览器访问网页:需要重新登陆

在这里插入图片描述

二、Session 登陆

功能期望:

  • 先直接访问A界面,会跳转到登陆
  • 登陆完毕后,可以访问A界面
  • 然后可直接访问B界面,不需要登陆

在这里插入图片描述
先了解一个概念:
用甲的账号密码登录成功后,服务器会自动创建一个Session对象 ,表明甲登陆过了
用乙的账号密码登录成功后,服务器也会自动创建一个Session对象 ,表明乙登陆过了
那怎么区分已经创建的Session对象,用唯一标识Session id区分
Session Id = 1111 就是 甲的Session对象

账号登陆成功后服务器会创建这样一个散列表保存登陆状态,这个表存在服务器的内存中

在这里插入图片描述
看一下我们如何利用Session实现登录一次,多次访问
可以看到,第二次访问的时候我们仅需要在访问路径上带上标识甲的Session id
”localhost:8080/B?SessionId = 1111“ 就可以匹配服务器内存中的Session id
在这里插入图片描述
那么每次都需要在请求路径上手写Session id,简直太麻烦了,有什么办法可以自动在发送请求路径的时候,顺便发送Session Id呢?
在这里插入图片描述
Cookie就可以实现这个功能

三、Cookie+Session 实现登录

甲登陆成功后,服务器为甲创建 Session Id + Session 对象
然后服务器创建Cookie对象,并把Session Id存入Cookie对象
最后返回给浏览器,保存在浏览器的内存里

第二次访问时候,保存在浏览器内存里的Session Id会自动的 与 访问路径一起发送给服务器
在这里插入图片描述
大部分时候我们不仅仅在Cookie中保存Session Id,还保存一些其他的信息,以此来说明这是用户甲发起的请求,因此千万不可以被别人知道了我们的Cookie
CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

有人就疑惑了,是不是必须在cookie中设置账号密码呢?
如果我们修改了账号密码,且只携带Session Id,那岂不是当Session Id通过时,就可以不用登陆,那密码不白改了。
所以我们需要携带账号密码,先验证Seesion Id是否一致,再验证账号密码是否一致,这样

在这里插入图片描述
这里有个实例:
可以看到服务器返回给浏览器的cookie,包含了JsessionId,name和pwd
在这里插入图片描述

从后端代码编写的角度

传入账号密码登陆成功后,后端在跳转界面之前,需要实现两步骤

      1.  因为登录成功了,创建一个Session对象(根据此Session对象可以识别不同的用户)
此Session对象保存在服务器内存中

      2.  服务器会继续创建一个Cookie对象,将Session传给Cookie,然后把Cookie返回给浏览器
浏览器会把Cookie保存在浏览器内存中,如下图

第一次访问:先登陆,并且保存登录状态
在这里插入图片描述

第二次访问:利用登录状态
在这里插入图片描述

AServlet:
连接数据库,查看匹配信息
if(success){
	1 Tomcat服务器自动创建session对象
	2 request.getSession() //获取session对象
	3 将session对象放入Session域中
		//设置Cookie
		Cookie cookie = new Cookie(设置Name属性,设置Value属性) 
		cookie.setMaxAge(时间)
		cookie.path(路径)
		response.addCookie(cookie)  //将服务器生成的cookie返回给浏览器保存起来
	4 跳转到A.jsp界面
}
BServlet1 request.getsession(false) //禁止服务器在B中自动创建session对象
2 获取Session对象
if(session不为空 && session.getAttribute(对象)不为空){
	获取浏览器的cookies
	3 进入B界面
}

Session Id保存在服务器的内存中,所以服务器的压力就会很大。有没有什么办法可以减轻服务器的压力呢?这个时候需要Token了

四、Token登陆

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

这意思是不是和Cookie+Session类似,画个图分析一下
在这里插入图片描述
可以看到我们不再需要在服务器存储Session Id,极大地降低服务器的压力。

先看看第一次登陆成功后,服务器如何产生的Token
第一步:

在这里插入图片描述
第二步:
在这里插入图片描述
第三步:
在这里插入图片描述

这样就得到了返回浏览器的Token

再来看看怎么生成新的Token进行验证

在这里插入图片描述

如果善于观察会发现,这个Token也是可以被人截获的,只需要用Baes64解析,至少可以得到两个密文,而这两个密文就是我们的数据信息,如果里面有账号密码也是有泄露的风险。

拓展:
再思考一个问题:
既然Token是由 Header,Playloder,签名 三部分决定的。那这里面都存储一些什么信息区分不同的客户端。(也就是说,A,B浏览器向服务器发送Token,服务器是怎么区分的)

为了互联网的规范性,我们对这三部分应该存储什么信息有一个规范:JSON WEB TOKEN(简称JWT)意思只要你想要使用Token,可以考虑参考这个标准。
JWT规定:

第一部分(Header存放:声明类型typ,加密算法alg)
{
  'typ': 'JWT',
  'alg': 'HS256'
}

然后用Base64加密生成密文,这也是我们为何解密 Header密文 就可以知道 加密算法HS256

第二部分(Playloder存放:

标准中注册的声明: 包括
	iss: jwt签发者
	sub: jwt所面向的用户
	aud: 接收jwt的一方
	exp: jwt的过期时间,这个过期时间必须要大于签发时间
	nbf: 定义在什么时间之前,该jwt都是不可用的.
	iat: jwt的签发时间
	jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
	
公共的声明:
	自定义的一些内容:name:"王冰冰"
	
私有的声明:
	虽然叫私有,但也不安全,不推荐放敏感信息

截取Token主要针对这一部分内容。

第三部分:叫做signature,为生成签名

signature组成:Header密文.Playloder密文.secret

在这里插入图片描述
这里可以看看前面介绍如何利用服务器的密钥生成签名,对比一下。
其实这个secret是一个私钥,存放在服务器中,也就是前面说的服务器密钥。

在这里插入图片描述

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

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

相关文章

治愈系书单|林曦《只生欢喜不生愁》

《只生欢喜不生愁》是水墨画家林曦的艺术生活随笔集,谈艺术之道,论无用之美。      全书按主题分为六辑:“艺可通道”“观照世间”“得自在禅”“心安之所”“写给时间”“赤子之心”,文字轻盈、意境优雅。林曦以手艺人之道&a…

Java#13(String Builder介绍及其常用办法)

目录 一.String Builder 1.理解:可以将String Builder当作一个容器,创建之后的内容是可以变的 2.作用:可以提高字符串的操作效率 二. StringBuilder中的常用方法 1.public StringBuilder append (任意类型) 添加数据,并返回对象本身 2.public StringBuild…

Keysight是德科技e5063A网络分析仪-安泰测试

Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪,可用于测试简单的无源元器件,例如频率最高达到 18 GHz 的天线、滤波器、电缆或连接器。 作为业界闻名的 ENA 系列中的一员,它传承了一致的测量框架,以便提高效率和生产率…

大学生静态HTML鲜花网页设计作品 DIV布局网上鲜花介绍网页模板代码 DW花店网站制作成品 web网页制作与实现

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

RabbitMQ初步到精通-第二章-RabbitMQ介绍

第二章 RabbitMQ介绍 1、RabbitMQ简介 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。RabbitMQ最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 rabbit- 兔子,兔子的特点是什么? 轻…

图解https读书笔记

7.确保Web安全的HTTPS 7.2 HTTP 加密 认证 完整性保护 HTTPS https http ssL(Secure socket layer)client: 使用servcer端的publickey对消息加密-----》server:收到消息,用privatekey进行解密参考:彻底搞懂HTTPS的加密原理_峰子2012的博…

VS+QT错误集合

主要是使用VSQT时遇到等一些问题,现在使用等是VS2015(专业版) QT5.13.1 这章主要解决遇到的无法解析等外部符号这类问题 1、LNK2001 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl Process::metaObject…

【分析笔记】Linux 4.9 backlight 子系统分析

相关信息 内核版本:Linux version 4.9.56 驱动文件:lichee\linux-4.9\drivers\video\backlight\backlight.c 驱动作用 对上,面对应用层提供统一的设备节点入口同级,面对驱动层提供设备驱动加载卸载通知事件,以及背光…

闲人闲谈PS之三十二——业务工程预算和PS成本计划

惯例闲话:年底,又要开始忙了,今年这一年,收获还不错,至少规划了第三年实现的目标——工程行业彩虹图,在今年居然奇迹般的实现了,看样子闲人还是保守了。还是应验了那句话,只要标准化…

React插槽

在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素。我们应该让使用者可以决定某一块区域到底存放什么内容。这里可以使用插槽。 而在React中,我们可以通…

Spring Cloud Circuit Breaker 使用示例

Spring Cloud Circuit Breaker 使用示例 作者: Grey 原文地址: 博客园:Spring Cloud Circuit Breaker 使用示例 CSDN:Spring Cloud Circuit Breaker 使用示例 说明 Spring Cloud Circuit breaker提供了一个跨越不同断路器实现…

留学Essay写作怎么注意具体结构?

留学生都知道Essay一般分为Introduction,Main Body和Conclusion这三个部分,Introduction说明了文章的整体内容,但本身并没有提出任何论点;Conclusion通常简要地概括了正文的要点,并建议进一步研究给出一些或结论性的想法&#xff…

Springboot实现ENC加密

目录1. 为什么要用ENC加密2. jasypt实现ENC加密1. 实现流程2. 说明1. 自定义加密秘钥1. 盐、前缀、后缀2. 自定义加密方案2. 部署方案1. 为什么要用ENC加密 以下是未经过加密的数据库配置,密码均是采用明文密码,很容易导致数据库泄露。 spring:datasou…

gitlab 简单优化 gitlab cpu高,内存高 gitlab 负载飙高

1.首先要说得是,优化不能解决根本问题,机器小水管,再优化还是不行。 我感觉4核8g应该可以,截图这机器是阿里云送的免费一个月 4核8g 内存,不知是不是送得问题,感觉也是hold不住。 负载逛逛升,8…

【springboot】19、数据库操作

文章目录基本说明默认数据源HikariDataSource切换数据源为Druid基本说明 这篇文章介绍如何在springboot的项目中进行数据库的连接,完成数据库操作。 默认数据源HikariDataSource HikariDataSource是springboot的默认数据源,性能十分优秀,我…

【Hack The Box】windows练习-- love

HTB 学习笔记 【Hack The Box】windows练习-- love 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年9月7日🌴 &#x1f36d…

【freeRTOS】操作系统之四-事件标志组

事件标志组是实现多任务同步的有效机制之一。 ​ 搞个全局变量不是更简单?其实不然,在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了。 使用全局变量相比事件标志组主要有如下三个问题: …

人工智能 AI 绘画 AI绘制的图片 ? 简介的版权,以及如何使用图像生成AI 绘画 ?

人工智能 AI 绘画 AI绘制的图片 ? 简介的版权,以及如何使用图像生成AI 绘画 ? 我认为,许多人认为工作的绘画是人类独有的。 然而,在最新的,大赦国际还可以在工作的绘画和绘画创作大赦国际已经生一个接一个。和有些人感到惊奇的…

Docker从入门到精通,一文详解

一、Docker简介 1、背景 物理机时代 一个物理机上安装操作系统,然后直接运行我们的软件。也就是说你电脑上直接跑了一个软件,并没有开虚拟机什么的,资源极其浪费。 缺点 部署慢成本高 虚拟机都不开,直接上物理机部署应用&#x…

libusb系列-006-Qt下使用libusb1.0.9源码

libusb系列-006-Qt下使用libusb1.0.9源码 文章目录libusb系列-006-Qt下使用libusb1.0.9源码摘要添加宏添加源文件编译文件测试libusb工程源码关键字: Debian、 Linux、 Qt、 libusb、 源码内容背景: 最近项目终于切到Linux下开发了,所以最近的…