Node.js | 详解 JWT 登录验证 的工作原理

news2024/11/29 0:47:49

在这里插入图片描述


🧑‍💼 个人简介:一个不甘平庸的平凡人🍬
🖥️ 本系列专栏:Node.js从入门到精通
🖥️ TS知识总结:十万字超详细TS知识点总结
👉 你的一键三连是我更新的最大动力❤️!
📢 欢迎私信博主加入前端交流群🌹


📑目录

  • 🔽 前言
  • 1️⃣ 关于Token
  • 2️⃣ 关于JWT
  • 3️⃣ JWT验证流程
  • 4️⃣ 优缺点
  • 🔼 结语


🔽 前言

之前我们对 Cookie&Session的工作原理 做了详细的介绍,并提出了它存在的两个问题:存储问题CSRF问题。为了解决/避免这些问题,开发者们开始使用更加成熟的JWT来代替Cookie&Session作为登录验证的首选技术方案,这一节我们就将详细讲解JWT登录验证的工作原理。

1️⃣ 关于Token

在说JWT之前,我们需要先了解一下传统使用Token的方式。

Token的意思就是“令牌”,是服务端生成的一段加密字符串(要保证唯一性),传统使用Token做登录验证的流程:

在这里插入图片描述

  1. 客户端登录成功后,由服务端计算生成Token并进行保存(一般是保存到数据库中)。

  2. 服务端将生成的Token返回给前端(一般是将Token添加到请求的响应头response.header上)。

  3. 客户端拿到Token后将其存储到本地,一般是存放到LocalStorage

  4. 客户端每次向服务端发送请求时都要带上它存储的这个Token(一般是将Token添加到请求的请求头request.header上,这大多都是通过axios请求拦截进行实现)。

  5. 服务端收到请求后,验证客户端请求里携带的Token是否与数据库中保存的Token一致,若验证成功就正常响应请求。

    如果希望Token验证成功后服务端能获取或返回该Token对应的用户信息,那么服务端在第一次存储Token时就可以选择将Token与用户信息进行关联存储,比如将Token作为key、用户ID(userId)作为值:

    {
    	Token:userID
    }
    

这个流程与Cookie&Session很是相识,不同的是,它没有引入SessionId的概念,也没有使用cookie,所以相比Cookie&Session而言,传统使用Token验证的方式避免了CSRF攻击问题,但并没有避免存储问题。

2️⃣ 关于JWT

JWT的全称为Json Web Token,它和传统使用Token的区别主要体现在服务端是否保存Token

通过JWT计算生成的Token字符串(我们称其为JWT Token)包含三个部分:

在这里插入图片描述

图片是经过翻译的,部分中文显示不准。

  • Header(头部)(上图红色内容):一个描述JWT元数据的JSON对象的签名。
  • Payload(载荷)(上图紫色内容):载荷数据的签名。
  • Signature(签证)(上图中蓝色内容):前两部分一起跟密钥算出来的签名。

    关于JWT Token字符串的更多细节可查阅这篇文章。

通过JWT Token三段式的结构我们可以知道:

  • JWT可以将用户信息通过服务端的密钥加密到JWT Token字符串中(Payload部分),那么服务端同样也能从JWT Token中解密出用户信息。

  • 后续服务端只需将JWT Token的前两部分(HeaderPayload)与服务端保存的密钥进行计算,若计算结果与JWT Token的第三部分(Signature)相同即可验证该JWT Token有效。

通过JWT Token本身就可以进行验证读取信息的操作,所以服务端就不需要存储Token了,这就解决了传统使用Token验证中的存储问题。

3️⃣ JWT验证流程

图示:
在这里插入图片描述

  1. 客户端登录成功后,由服务端根据自己的密钥和用户信息计算生成Token

  2. 服务端将生成的Token直接返回给前端(一般是将Token添加到请求的响应头response.header上)。

  3. 客户端拿到Token后将其存储到本地,一般是存放到LocalStorage

  4. 客户端每次向服务端发送请求时都要带上它存储的这个Token(一般是将Token添加到请求的请求头request.header上,这大多都是通过axios请求拦截进行实现)。

  5. 服务端收到请求后,通过自己的密钥验证客户端请求里携带的Token是否有效,若有效就正常响应请求。

    在这里插入图片描述

整个流程中服务端只需要保存一个固定的密钥即可,其它信息全部由客户端进行存储,服务端做的工作只有生成token , 然后验证token。

4️⃣ 优缺点

优点:

  1. 服务端不用存放数据,减轻服务端的压力。
  2. 跨语言,JAVA,JS,NodeJS,PHP等很多语言都可以使用JWT。
  3. 基于JSON,方便解析,可以在令牌中自定义丰富内容,易扩展。
  4. 通过非对称加密及数字签名技术,可以防止篡改、安全性高。
  5. 有效避免了 CSRF 攻击。
  6. 适合移动端应用,因为部分移动端应用不支持cookie。

缺点:

  1. 占带宽大,正常情况下要比 session_id 更大,需要消耗更多流量,挤占更多带宽,JWT中存储的数据越多,消耗的流量也就越多。
  2. 无法在服务端注销,那么就很难解决劫持问题,如果token被其他人利用,无法对其进行拦截(这其实和session id被其他人利用是一样)。
  3. 性能问题,JWT 的卖点之一就是加密签名,由于这个特性,接收方得以验证 JWT 是否有效且被信任。对于有着严格性能要求的 Web 应用,这并不理想,尤其对于单线程环境。
  4. 不能存储敏感信息:由于JWT的Payload是使用base64编码的,并没有加密,因此JWT中不能存储敏感数据。

🔼 结语

博主的Node.js从入门到精通专栏正在持续更新中,关注博主订阅专栏学习Node不迷路!

如果本篇文章对你有所帮助,还请客官一件四连!❤️

在这里插入图片描述

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

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

相关文章

【Java系列】一篇文章快速了解Java语言概述

Java语言概述1.Java简介2.JVM2.1JVM介绍2.2JVM特性3.Java特性4.搭建Java程序开发环境5.编写第一个Java应用程序6.小结第一个程序1.Java简介 java是面向对象的一门程序设计语言随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。后台开发&#x…

FRP进阶篇之安全认证

目录 一、前言 二、通信加密 1、概述 2、使用 三、BasicAuth 鉴权 1、概述 2、使用 2.1、客户端配置 2.2、启动客户端 2.3、效果验证 四、TLS双向身份验证 1、概述 2、使用 2.1、生成证书 2.2、服务端配置 2.3、客户端配置 一、前言 通过上次的《FRP入门篇》相信…

毕业设计-机器学习图像卡通动漫化图像风格迁移

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

关于旅游景点主题的HTML网页设计——北京景点 7页(带订单购物车)Html+Css+javascript

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&…

redhat 新开启一个ssh端口

查看是否安装ssh服务 rpm -qa |grep ssh2.开启ssh服务 systemctl start sshd.service3.修改ssh配置文件 vi /etc/ssh/sshd_config4.复制Port行并修改端口号 此时已经新增了一个端口 5.启用新端口 sudo semanage port -a -t ssh_port_t -p tcp 22116.防火墙放开新增的端口 …

最全面的SpringMVC教程(二)——SpringMVC核心技术篇

前言 本文为 【SpringMVC教程】核心技术篇 相关详细介绍,具体将对视图和模型拆分,重定向与转发,RequestMapping与其衍生注解,URL 模式匹配,牛逼的传参,设定字符集,返回json数据(序列…

【Hack The Box】linux练习-- seal

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

②【Maven】从0上手Maven的安装与配置 - 最全教程 (下载 + 配置 + 环境变量 )

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Maven >>> 下载、安装、配置一、下载…

jenkins关联github

将Jenkins和github关联起来,实现自动化集成 GitHub侧 1、生成secret.txt secret在github上被称为token 进去GitHub --> Settings --> Developer settings --> Personal access tokens -> Generate new token创建一个新的token,勾选两处标红的地方 点…

Flutter高仿微信-第58篇-扫一扫

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: //二维码扫一扫 Future _scanQR() async {try {final re…

外设驱动库开发笔记49:BY25Qxx存储器驱动

在有一些应用中,我们可能需要大一些容量的存储单元,而实现的形式多种多样,在这一篇中我们将来讨论怎么使用BY25QXXX系列NOR FLASH存储器的问题。 1、功能概述 在开始实现BY25QXXX系列NOR FLASH存储器的驱动之前,我们需要先了解一…

Mysql-解决创建存储函数This function has none of DETERMINISTIC

问题 当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。 如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CRE…

COLMAP生成MVSNet数据集

一. colmap2mvsnet.py COLMAP可以给图像数据集标定一套相机外参及视图选择。如果想用COLMAP导出的结果输入MVSNet测试,需要把数据集(图片、相机参数等)转化为MVSNet的输入格式。MVSNet的作者yaoyao在Github上提供了colmap2mvsnet.py代码&…

Java内存区域

目录复制 Java内存区域区域划分内存溢出异常区域划分 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规格》的规定,Java虚拟机所管理的内存包括以下几个运行时数据区域。 线程独占的有:程序计数器…

《web课程设计》 基于HTML+CSS+JavaScript实现中国水墨风的小学学校网站模板(6个网页)

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

[附源码]SSM计算机毕业设计网上零食商城JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Spring | 一文带你掌握IOC技术

👑 博主简介:    🥇 Java领域新星创作者    🥇 阿里云开发者社区专家博主、星级博主、技术博主 🤝 交流社区:BoBooY(优质编程学习笔记社区) 文章目录IOC 控制反转1、概念2、分析…

无线传感器网络:传输层

文章目录Challenges for Transport LayerEnd-to-End MeasuresApplication-Dependent OperationEnergy ConsumptionConstrained Routing/AddressingBiased ImplementationReliable Multi-Segment Transport (RMST) ProtocolPump Slowly, Fetch Quickly (PSFQ) ProtocolPump Oper…

超详细的PHP入门知识点讲解

目录 一、简介 二、php基本语法 二、变量和作用域 三、常量 四、数据类型 五、运算符 六、流程控制 七、超全局变量 一、简介 基础知识: 需要一定的html和css的语法知识 基本概念: PHP(超文本预处理器)是一种通用开源脚本…

汽车销量数据库(分车型、分品牌月度销量数据 2005-2021)

1、数据来源:汽车工业协会 2、时间跨度:2005年1月-2021年5月 3、区域范围:全国 4、指标说明: 该份数据包含全国各种汽车销量数十个相关指标! 该份数据包含如下指标: 轿车:一汽大众、上海大…