前后端身份认证:session身份认证,JWT认证

news2024/11/17 13:42:47

文章目录

  • 前后端身份认证
    • 1、概述
    • 2、不同开发模式下的身份认证
    • 3、关于HTTP协议的无状态性
    • 4、Cookie
      • 4.1 介绍
      • 4.2 cookie特点
      • 4.3 cookie分类
      • 4.4 Cookie在session身份认证中的作用
      • 4.5 Cookie不具有安全性
    • 5、Session认证
      • 5.1 Session认证过程
      • 5.2 Session认证原理图
      • 5.3 Session认证的局限性
    • 6、JWT认证机制
      • 6.1 JWT的工作原理图
      • 6.2 JWT的组成部分
      • 6.3 JWT的使用方式

前后端身份认证

1、概述

  • 什么是身份认证
    身份认证(Authentication)又称“鉴权”,是指通过一定的手段,完成对用户身份的确认。

生活中常见的身份认证有:高铁的验票乘车、手机密码或指纹解锁,支付宝或微信的支付密码验证等。


而在Web开发中,涉及到用户身份的认证,例如:各大网站的手机验证码登录、邮箱密码登录,二维码登录等。

  • 为什么要身份认证
    HTTP是一种无状态的协议,为了分辨链接是谁发起的,需要浏览器自己去解决这个问题。有些情况下即使是打开同一个网站的不同页面也都要重新登录,很麻烦,Cookie、Session和Token就是为了解决这个问题而提出来的两个机制。

2、不同开发模式下的身份认证

对于服务器端渲染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案。
(1)服务器端渲染推荐使用Session认证机制
(2)前后端分离推荐使用JWT认证机制

3、关于HTTP协议的无状态性

在了解认证机制之前,我们先弄清一下什么是HTTP协议的无状态性,HTTP协议的无状态性指的是客户端每次的HTTP请求都是独立的连续多个请求之间没有直接的关系服务器不会主动保留每次HTTP请求的状态

4、Cookie

4.1 介绍

Cookie是存储在用户浏览器中的一段不超过4kb的字符串。它由一个名称(Name)、一个值(Value)其他几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。简单来说,cookie存储了某些数据信息,用于验证登录或者某一会话信息的数据。

我们打开浏览器,按下键盘F12键,随便打开一个网页,查看application选项,再选择cookie进行查看,如下
在这里插入图片描述

4.2 cookie特点

不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器进行身份认证

  • 总结
    (1)自动发送
    (2)域名独立
    (3)可以设置过期时限
    (4)每个cookie的长度限制为4kb
    (5)浏览器对每个域名下的cookie数量有限制

4.3 cookie分类

Session Cookie(会话cookie):打开浏览器访问某个网站时,会将cookie保存在电脑内存中,之后这个网站就不需要每个页面进行登录操作,但当网站关闭或者浏览器关闭时,那么内存中的cookie会被清空,之后打开这个网站就需要重新登陆了。

Permenent Cookie(永久cookie):cookie保存在电脑硬盘中,相当于永久保存,浏览器关闭或网站关闭时不会进行清除。

4.4 Cookie在session身份认证中的作用

客户端第一次请求服务器的时候,服务器通过响应头的形式向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie通过请求头的形式发送给服务器,服务器即可验证客户端的身份。

4.5 Cookie不具有安全性

cookie是存储在浏览器中的,而且浏览器也提供了读写cookie的API,因此Cookie很容易被伪造(CSRF攻击),不具有安全性,所以不建议服务器将重要的隐私数据(例如用户的身份信息、密码等)通过cookie的形式发给浏览器。

怎么保证cookie的安全性?
(1)设置过期时间,这样别人拿到的可能会是过期的cookie
(2)cookie进行加密
(3)不在cookie中存放敏感数据

5、Session认证

5.1 Session认证过程

1、浏览器进行登录操作,将用户名、密码等信息传到后端服务器。

2、服务器拿登录信息后到用户表中对比是否一致,判断用户是否存在,如果用户存在,则认证通过,生成session_id后端会话当中的一个键,表中的一个key值),并将session_id默认保存在会话表,当这条数据记录完之后,会将session_key(由服务器随机生成的加密密钥)和session_id相关联,并一起存放到响应头的set-cookie字段中,发给浏览器。【关于session_keysession_id1

3、浏览器将响应头中的set-cookie字段中的session_id取出来放到当前域名下的cookie中。

4、等到下次请求后端接口的时候,浏览器会自动将cookie中的session_id传给后端,后端拿获取到的session_id和会话表做对比,如果有一致的则请求成功,否则失败,如果session_id超时,也会失败。

5、请求成功后,服务器将当前用户对应的页面内容响应给浏览器。

5.2 Session认证原理图

在这里插入图片描述

5.3 Session认证的局限性

Session认证机制需要配合Cookie才能实现。并且由于Cookie默认并不支持跨域访问,涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域Session认证。

那我们什么情况下使用Session身份认证机制呢?就是当前端请求后端接口不存在跨域问题的时候用。

当前端确实需要进行跨域请求后端接口的时候,推荐使用JWT认证机制

6、JWT认证机制

6.1 JWT的工作原理图

在这里插入图片描述

简单来说就是用户的信息被加密,转换成token字符串的形式,保存在客户端浏览器中;服务器通过还原token字符串来获取用户信息

6.2 JWT的组成部分

JWT由三个部分组成,从前到后分别是Header,Payload,Signature。

Header.Payload.Signature
  • HeaderSignature安全性相关的部分,只是为了保证Token的安全。
  • Payload部分是用户信息经过加密之后生成的字符串,这部分才是真正的用户信息

6.3 JWT的使用方式

客户端收到服务器返回的JWT之后,通常会将它存储到localStorage(本地存储)或者sessionStorage(会话存储)中,当然cookie也行。

此后,客户端每次与服务器通信,都要带上这个JWT字符串,从而进行身份认证。

推荐的做法是将JWT放在HTTP请求头的Authoriazation字段中,这个返回jwt由Bearer这个字符串和token字符串拼接完成,中间空格分开,例如:

Authorization:
Bearer <token>

  1. session_id是指会话标识符,在Web应用程序中用于标识用户会话,并将用户的请求与正确的会话相匹配。session_id通常是一个字符串,会在用户第一次访问应用程序时自动创建,并在用户会话期间持续存储。每个session_id都应该是唯一的,以确保能够准确地区分每个用户会话,并正确地保存用户数据。
    session_key是指用于加密和解密会话数据的对称密钥。它通常是由服务器随机生成,并在建立会话时共享给客户端。session_key的目的是确保在用户会话期间,所有传输的数据都是加密的,并且只能由具有正确session_key的第一方(即应用程序服务器)和第二方(即用户浏览器或设备)进行解密。
    因此,可以将session_key看作是session_id的一个属性,用于确保会话数据的安全性和完整性。在用户验证结束后,服务器会将通过该session_id唯一标识的会话与相应的session_key相关联,从而确保会话数据的安全性。 ↩︎

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

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

相关文章

【Linux】多线程 --- 线程概念 控制 封装

从前种种&#xff0c;譬如昨日死。从后种种&#xff0c;往如今日生。 文章目录 一、线程概念1.重新理解用户级页表1.1 进程资源如何进行分配呢&#xff1f;&#xff08;地址空间页表&#xff09;1.2 虚拟地址如何转换到物理地址&#xff1f;&#xff08;页目录页表项&#xff0…

11 KVM虚拟机配置-配置虚拟设备(存储)

11 KVM虚拟机配置-配置虚拟设备(存储) 文章目录 11 KVM虚拟机配置-配置虚拟设备(存储)11.1 存储设备概述11.2 存储设备元素介绍11.3 存储设备配置示例 11.1 存储设备概述 虚拟机XML配置文件使用devices元素配置虚拟设备&#xff0c;包括存储设备、网络设备、总线、鼠标等。 X…

【LeetCode】494. 目标和

494. 目标和 思路 首先&#xff0c;将这道题想成 0-1背包问题&#xff0c;我们最终要输出的结果是最多的方法数&#xff0c;因此 dp 数组需要记录具体的方法数。 状态定义 按照 0-1 背包问题的套路&#xff0c;我们将状态定义为 &#xff1a;dp[i][j] &#xff0c;表示「前 …

YOLOv5测距+碰撞检测

YOLOv5测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距&#xff08;python&#xff09; 2. YOLOV7 单目测距&#xff08;python&#xff09; 3. 具体实现效果已在Bilibili发布&#xff0c;点击…

string的介绍

string是c中表示字符串的字符串类&#xff0c;要使用需要包头文件&#xff1a;#include<string> 先了解一下string的一些信息 string看起来是一个类&#xff0c;但实际上是typedef的模板。 在cplusplus.com网站上&#xff0c;string的相关信息 模板的实例化结果有以下几个…

【unity小创意】相机的正反操作实现场景的二维跳跃

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

Spring的第十二阶段(01):Spring实现AOP的简单使用

1、使用Spring实现AOP简单切面编程 需要导入工程的jar包 Spring的核心包 spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jarSpring的测试包 spring-test-4.0.0.RELEASE.jarSpring日记相…

【网络安全】这套面试题,让你提前预判面试官的预判!

最近这个帖子的点赞和收藏变高起来了&#xff0c;许多小伙伴在问我安全大厂的面试题没有&#xff0c;我准备利用一些时间把这套面试宝典整理一下&#xff01; 今天有同学拿着他准备的面试问题清单给我看&#xff0c;看还有没有遗漏的&#xff0c;我看了下&#xff0c;觉得还是…

Spring-Bean管理-注解

组件注册 Component/Controller/Service/Repostory :注册自定义组件到容器中 加上约定的注解。 在Configuration注解的类中配置包扫描器 ComponentScan(vlaue "cn.shaoxiongdu") Configuration: 标注配置类 Scope &#xff1a; 配置是否为单实例 prototype: 多实…

JVM与GC

Java:跨平台的语言 write once, run anywhere JVM&#xff1a;跨语言的平台 Java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的&#xff0c;它只关心“字节码”文件。 Java不是最强大的语言&#xff0c;但是JVM是最强大的虚拟机。 JVM的整体结构 这个架构…

Java基础学习(12)

Java基础学习 一、不可变集合二、Stream流2.1 Stream流数据添加2.2 Stream流的中间方法2.3 Stream终结方法 三、 方法引用3.1 方法引用的基本概念3.2 方法引用的分类3.2.1 引用静态方法 3.2.2 引用成员方法3.2.3 引用构造方法3.2.4 使用类名引用成员方法3.2.5 引用数组的构造方…

PyQt5 基础篇(一)-- 安装与环境配置

1 PyQt5 图形界面开发工具 Qt 库是跨平台的 C 库的集合&#xff0c;是最强大的 GUI 库之一&#xff0c;可以实现高级 API 来访问桌面和移动系统的各种服务。PyQt5 是一套 Python 绑定 Digia QT5 应用的框架。PyQt5 实现了一个 Python模块集&#xff0c;有 620 个类&#xff0c;…

MATLAB 点云非均匀体素下采样 (8)

MATLAB 点云非均匀体素下采样的不同参数效果测试 (8) 一、实现效果二、算法介绍三、函数说明3.1 函数3.2 参数四、实现代码(详细注释!)五、与固定步长采样法比较5.1 代码5.2 效果一、实现效果 不同参数调整下的非均匀体素下采样结果如下图所示,后续代码复制黏贴即可: 可…

入职6个月,被裁了...

我跟大多数人不大一样&#xff0c;从来没有说要等公司主动裁员拿补偿&#xff0c;我看自己没有什么价值或者是公司不行了&#xff0c;我都会主动离职。但是这次也太突然了。公司很大已上市&#xff0c;并不是不行了&#xff0c;总结原因就是&#xff0c;一是领导无能&#xff0…

【STM32CubeMX】F103ADC获取

前言 本文记录了我学习STM32CubeMX的过程&#xff0c;方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了基本的ADC值的获取流程&#xff0c;只单纯地记录了ADC端口的配置&#xff0c;没有加配像串口之类的调试&#xff0c;以简化流程。下面的流程是使用串口调试…

版本控制系统Git - 配置与基本使用

Git 1 Git简介1 Git概述2 Git的作用2.1 项目版本管理2.2 多人协同开发2.3 Git 的结构2.4 Git的工作原理 2 Git安装1 下载Git2 安装Git3 配置环境变量4 测试git是否安装成功5 安装git桌面工具(可以不安装) 3 Git基本操作1 设置Git用户2 新建仓库3 查看仓库状态4 添加到暂存文件5…

MATLAB 点云重复点去除(7)

MATLAB 点云重复点去除 (7) 一、实现效果二、算法介绍三、函数说明3.1 函数3.2 参数四、具体代码 (注释详细!)一、实现效果 效果上看不出来,但实际上左边的点云是右边的两倍 二、算法介绍 重复点的去除,是点云处理中常用的预处理方法,因为重复点的存在有时候会严重干…

C++系列四:数组

数组 1. 数组定义与初始化2. 多维数组3. 字符数组4. 总结 1. 数组定义与初始化 定义数组时需要指定数组的类型和大小&#xff1a; int myArray[10];上述代码定义了一个包含 10 个整数的数组。这些整数的下标从 0 开始&#xff0c;并以 1 个单位递增。 C 允许在定义数组时对其…

设计模式——装饰者模式(继承和接口的两种实现方式)

是什么&#xff1f; 场景案例&#xff1a;想必大家都吃过手抓饼吧&#xff0c;我们在点手抓饼的时候可以选择加培根、鸡蛋、火腿、肉松等等这些配菜&#xff0c;当然这些配菜的价格都不一样&#xff0c;那么计算总价就比较麻烦&#xff1b; 装饰者模式就是指在不改变现有对象…

springboot 集成 shardingSphere 加mybatisplus 自带增加 分页查询 和源代码包 分库分表 单库 分表 使用雪花算法id

目录 介绍 代码下载 效果 数据库 代码结构 上代码 pom.xml yml配置 建表语句 mapper.xml mybatisplus 配置.java logback application.java BaseEntity TUser TUserMapper TUserService TUserServiceImpl TUserController 测试 介绍 这套springboot shardi…