JWT的原理

在谈及jwt原理前,我们其实对jwt并不陌生,对于有经验的码农,大都听过或者实践过,对于一些初学者,凡是谈及安全方面的问题,总是觉得很复杂,感觉不是自己能搞得懂得,但其实无非也是加密解密的过程,不要想的太复杂,我们先说一说JWT在生产上的应用

JWT在生产上的应用

  • 传递用户身份信息: JWT 通常用于在前端和后端之间传递用户身份信息。前端登录成功后,服务端生成 JWT 令牌并返回给前端。前端随后将令牌包含在每个请求的头部,以便服务端验证用户身份。

  • 无状态身份验证: JWT 的一大优势是它是无状态的,服务端不需要存储用户的登录状态。每个请求都包含了足够的信息,使得服务端能够验证用户身份而无需查询数据库。

  • 单点登录(SSO): JWT 也被广泛用于实现单点登录。用户只需在一个认证中心登录一次,然后通过 JWT 令牌在多个服务之间共享身份信息,而无需重复登录。

  • 过期处理: JWT 中通常包含一个过期时间(exp),服务端在验证令牌时会检查这个过期时间,确保令牌仍然有效。过期时间过后,令牌将不再被接受,这有助于提高安全性。

=========================================================================

前面我提到了,所谓生成令牌,验证解析,无非就是有一套自己的加密,解密,验证逻辑

生成JWT

在生成 JWT 令牌时,我们首先选择一个密钥(secretKey),这个密钥只有服务端知道。然后,我们定义一个包含用户身份信息和其他声明的 payload。最后,我们使用选定的签名算法(例如 HS256)对 payload 进行签名,生成最终的 JWT 令牌。

public class JwtGenerator {public static String generateToken() {// 设置密钥String secretKey = "your_secret_key";// 定义要包含在令牌中的声明String token = Jwts.builder().setSubject("john_doe").claim("user_id", 123).setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 令牌有效期为一天.signWith(SignatureAlgorithm.HS256, secretKey).compact();return token;}public static void main(String[] args) {String token = generateToken();System.out.println(token);}
}

 原理

  • 密钥选择: 选择一个安全的随机密钥,确保只有授权的服务端知道这个密钥。

  • Payload: Payload 是一个 JSON 对象,包含了我们想要传递的信息,例如用户身份信息、权限等。它是令牌的主体部分。

  • 签名: 使用密钥对 Payload 进行签名,生成签名部分。签名的目的是确保令牌在传输过程中没有被篡改。

验证和解析 JWT 令牌 

 在接收到 JWT 令牌后,服务端需要验证令牌的有效性,并解析其中的信息。

public class JwtValidator {public static void validateToken(String token) {// 设置密钥String secretKey = "your_secret_key";try {// 验证令牌并解码 payloadClaims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();// 在此处可以检查令牌中的声明,例如过期时间// 如果过期时间在当前时间之前,则说明令牌已过期System.out.println("Token is valid. Claims: " + claims);} catch (SignatureException e) {System.out.println("Invalid token signature.");}}public static void main(String[] args) {String receivedToken = "your_received_token";validateToken(receivedToken);}
}

原理

  • 解析器创建: 使用相同的密钥创建一个 JWT 解析器。这个解析器将用于验证和解析令牌。

  • 验证签名: 解析器通过比对令牌中的签名和使用密钥重新计算的签名来验证令牌的完整性。如果签名不匹配,说明令牌可能被篡改。

  • 解码 Payload: 如果签名验证通过,解析器会解码令牌中的 Payload 部分。这样,服务端就能获取令牌中包含的用户身份信息和其他声明。

在生产中的应用:

  • 传递用户身份信息: JWT 通常用于在前端和后端之间传递用户身份信息。前端登录成功后,服务端生成 JWT 令牌并返回给前端。前端随后将令牌包含在每个请求的头部,以便服务端验证用户身份。

  • 无状态身份验证: JWT 的一大优势是它是无状态的,服务端不需要存储用户的登录状态。每个请求都包含了足够的信息,使得服务端能够验证用户身份而无需查询数据库。

  • 单点登录(SSO): JWT 也被广泛用于实现单点登录。用户只需在一个认证中心登录一次,然后通过 JWT 令牌在多个服务之间共享身份信息,而无需重复登录。

  • 过期处理: JWT 中通常包含一个过期时间(exp),服务端在验证令牌时会检查这个过期时间,确保令牌仍然有效。过期时间过后,令牌将不再被接受,这有助于提高安全性。

注意事项

对于敏感操作,仍然需要考虑使用 HTTPS 来保护令牌在传输过程中的安全性。此外,令牌中不应包含敏感信息,因为它可以被前端解码。敏感信息应该仅存储在安全的后端。

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

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

相关文章

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架,但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现,本文讲解如何将Cunit嵌入Android中,用于测试一些C/C api。 Cunit简介 Cunit是很…

全面解析“由于找不到hid.dll,无法继续执行代码”的4个解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到hid.dll”。这个问题通常出现在尝试运行某个程序或访问某个设备时。那么,当我们遇到这个问题时,应该如何解决呢?本文将详细介绍找不到hid.dll的解…

高校需要哪些大数据实训平台?

当前,数据已成为重要的生产要素,大数据产业作为以数据生成、采集、存储、加工、分析、服务为主的战略性新兴产业,是激活数据要素潜能的关键支撑,是加快经济社会发展质量变革、效率变革、动力变革的重要引擎。 泰迪大数据实验…

Angular 14带来了类型化表单和独立组件

独立组件通过减少对ngmodule的需求,有望简化Angular应用的开发。 介绍 Angular 14是谷歌开发的、基于typescript的web应用框架的最新版本,它以输入表单和独立组件的开发者预览版为特色。 其特性包括: 一个基于组件的框架,用于构…

Fortran读取netcdf文件/WRF中的文件读取

一直很好奇WRF到底如何通过netcdf库读取netcdf文件,正巧有个机会,试了下fortran读取nc文件,总结一下。 netcdf库 Fortran读取nc文件需要依赖netcdf外部库。安装该库以后,会有专门写给ffortran函数声明的头文件:netcd…

数据类型·

定义 数据类型是指在编程语言中,能够表示不同种类的数据值并对其进行操作的集合。在不同的编程语言中,数据类型可能有所不同,但通常包括基本数据类型和复合数据类型两种。 基本数据类型通常包括整数、浮点数、布尔值、字符等。这些类型的数…

231210 刷题日报

单调栈: 为啥需要单调栈?因为栈的后入先出特性方便从栈顶删除刚入栈的元素 496. 下一个更大元素 I 739. 每日温度 单调对列: 为啥要用单调对列?因为像滑动窗口这种题目,窗口两端都需要插入和删除,所以需…

Python满屏飘字表白代码

​ 目录 系列文章 写在前面 Turtle入门 满屏飘字 写在后面 系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://…

CF1898B Milena and Admirer(贪心)

题目链接 题目大意 有一个长度为 n 的数组 做操作使这个数组不递减&#xff1a; 把一个数分成两个数&#xff0c;例如&#xff1a;x 分为 a 和 b&#xff0c; x a b 求最小操作次数 思路 见注释 代码 #include<bits/stdc.h> #define int long long using names…

Shutter的安装及使用

概要&#xff1a;本篇主要讲述截图软件Shutter的安装和使用&#xff0c;操作系统是Ubuntu22.04 一、安装 sudo apt install shutter 二、区域截图 1、打开Shutter&#xff0c;点击Selection 2、提示信息 3、框选矩形区域 按住鼠标左键&#xff0c;拖动鼠标&#xff0c;松…

IT行业最被低估的六项技术,再加上一项尚未消亡的技术

2023年&#xff0c;生成式人工智能——更具体地说是ChatGPT——吸引了业界的广泛关注&#xff0c;深得董事会、首席执行官和其他高管的一致赞赏&#xff08;也不乏害怕情绪&#xff09;。当然&#xff0c;他们的热情是有道理的&#xff0c;多项研究发现&#xff0c;人工智能正在…

Electron[4] Electron最简单的打包实践

1 背景 前面三篇已经完成通过Electron搭建的最简单的HelloWorld应用了&#xff0c;虽然这个应用还没添加任何实质的功能&#xff0c;但是用来作为打包的案例&#xff0c;足矣。下面再分享下通过Electron-forge来将应用打包成安装包。 2 依赖 在Electron[2] Electron使用准备…

[山东大学操作系统课程设计]实验四+实验五

0.写在前面&#xff1a; 为什么这次把两个实验放在一起写了&#xff0c;因为实验五的要求就是在实验四的基础上完成实现的。但是我得实现说明&#xff0c;我的实验四虽然完成了要求&#xff0c;但是无法在我自己的实验四的基础上完成实验五&#xff0c;这是一个很大的问题&…

软考考前背过-软件设计师

今年5月份开始准备考&#xff0c;没想到会突然改革&#xff0c;还好刷题刷的多&#xff0c;也过了。 跟着B站up主的视频学的&#xff0c;都学了一遍之后才开始刷题&#xff0c;平时要上班&#xff0c;也就下班和周末能学&#xff0c;时间可能拉的比较长&#xff0c;学完前面的内…

使用linux CentOS本地部署SQL Server数据库

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装sql server二. 局域网测试连接三. 安装cpolar内网穿透四. 将sqlserver映射…

【注册测绘师备考——1.中华人民共和国测绘法】

学习一下《中华人民共和国测绘法》原始网址如下 《中华人民共和国测绘法》 中华人民共和国测绘法 &#xff08;1992年12月28日第七届全国人民代表大会常务委员会第二十九次会议通过 2002年8月29日第九届全国人民代表大会常务委员会第二十九次会议第一次修订 2017年4月27日…

【Vulnhub 靶场】【Funbox: GaoKao】【简单】【20210606】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/funbox-gaokao,707/ 靶场下载&#xff1a;https://download.vulnhub.com/funbox/FunboxGaoKao.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月06日 文件大小&#xff1a;1.3 GB 靶场作者&#…

[BJDCTF2020]EzPHP 许多的特性

这道题可以学到很多东西 静下心来慢慢通过本地知道是干嘛用的就可以学会了 BJDctf2020 Ezphp_[bjdctf2020]ezphp-CSDN博客 这里开始 一部分一部分看 $_SERVER[QUERY_SRING]的漏洞 if($_SERVER) { if (preg_match(/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|…

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具 1、nvm2、安装2.1、下载 NVM 安装程序进行安装2.2、打开nvm的安装路径&#xff0c;运行终端测试是否安装成功2.3、配置环境变量&#xff0c;让nvm能在电脑全局使用2.3.1、nvm配置淘宝镜像2.3.2、nvm环境变量设置 1…

低代码还是好用的,我持有这个观念

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。 有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。 你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0…