应用安全系列之三十九:JWT 相关安全问题以及最佳实践

news2025/1/10 20:36:00

JWT 简介

JWT是JSON Web Token 的简称,根据https://www.rfc-editor.org/rfc/rfc7519的定义如下:

A string representing a set of claims as a JSON object that is encoded in a JWS or JWE, enabling the claims to be digitally signed or MACed and/or encrypted.

翻译过来大概意思就是:将一组声明表示为通过JWS或者JWE编码的JSON对象的字符串,使声明能够被数字签名或加密方式保护。

总结成一句话就是,它是一串经过数字签名或者加密保护的JSON对象格式的字符串。

下面个是几个关于JWT的概念:

JWT Claims Set:一个包含JWT传递的声明JSON对象。

Claim:关于主题所断言的一条信息。Claim表示为由声明名称和声明值组成的名称/值对。

Claim Name:Claim 声明的名称部分。Claim 名称总是一个字符串。

Claim Value:Claim 声明的值。Claim 值可以是任何JSON值,也就是说它可以是字符串,也可以是一个JSON对象。

通常一个JWT有三个部分组成,他们是头部(Header)、载荷(Payload)和签名(Signature),组成的格式如下:

BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)

Header:声明编码的对象是JWT的类型以及使用的算法,示例如下:

{"typ":"JWT",

"alg":"HS256"}

通常JWT使用Base64url的编码方式,上述的JSON Header经过编码之后,变成:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

Payload:上述的JWT Claims Set的部分是JWT的payload,也是经过Base64url进行编码的,例如:

{"username":"test",

"exp":1300819380,

"role":admin}

经过编码的值为:eyJ1c2VybmFtZSI6InRlc3QiLAoiZXhwIjoxMzAwODE5MzgwLAoicm9sZSI6YWRtaW59。

Signature:就是使用Header所描述的算法对Base64url编码之后的Header和Payload进行签名之后的值。JWT Signature称为JWS,有一个专门的标准https://www.rfc-editor.org/rfc/rfc7515。如果使用加密的算法,就称为JWE,由另外一个标准https://www.rfc-editor.org/rfc/rfc7516。根据标准RFC7515可以知道Signature的计算公式是:

HMAC256(ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload))),假设得到的Signature:WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE。

根据JWT的生成公式,就可以得到最终的JWT是:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.

eyJ1c2VybmFtZSI6InRlc3QiLAoiZXhwIjoxMzAwODE5MzgwLAoicm9sZSI6YWRtaW59.

WcPGXClpKD7Bc1C0CCDA1060E2GGlTfamrd8-W0ghBE

JWT 的作用

通常当以用户登录之后,应用程序管理用户会话的方法是使用Cookie,将SessionID写入Cookie,当用户连接到应用程序时,它生成一个唯一的会话标识符,该标识符存储在服务器上,然后用“Set-Cookie”头返回给客户端。这样,会话cookie就存储在web浏览器里。cookie被设计成在每次请求时由浏览器自动地发送回服务器。该解决方案是处理普通用户登录和注销场景的好方法。但是随着微服务的发展和API的兴起,这种方式也越来越不能适应新的需求。因为这种机制不允许多个平台或应用程序轻松地使用单个会话对用户进行身份验证。此外,服务器也需要在其内存中保存会话的状态和数据。

JWT令牌是“无状态的”,这意味着会话信息不存储在服务器端。除了在服务器上节省大量内存之外,JWT令牌还可用于对多个应用程序中的用户进行身份验证。为此,不同的应用程序需要共享相同的私钥来签署和验证令牌。因此,用户将能够在管理用户帐户的应用程序上进行一次身份验证,并无缝地使用相同私钥的其他应用程序来验证令牌的有效性。

一个典型的JWT使用流程如下:

JWT token(JSON Web Token)的主要作用如下:

  1. 授权认证:在用户登录成功后,服务端会提供一个JWT token给

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

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

相关文章

滴滴发布十一大数据:延边出行需求上涨280% 西部省份成旅游热点

今年十一假期适逢中秋佳节,在亲友团聚和长假出游的多重期盼下,超级黄金周展现强劲内需,带动多样化的消费趋势,出行热情也随之高涨。滴滴出行数据显示,打车需求相比去年同期上涨80%,高峰时段每分钟呼叫突破1…

[论文工具] LaTeX论文SVG和EPS矢量图转换方法详解

祝大家中秋国庆双节快乐! 回过头来,我们在编程过程中,经常会遇到各种各样的问题。然而,很多问题都无法解决,网上夹杂着各种冗余的回答,也缺乏系统的实战技巧归纳。为更好地从事科学研究和编程学习&#xff…

C语言中文网 - Shell脚本 - 1

Shell 既是一个连接用户和 Linux 内核的程序,又是一门管理 Linux 系统的脚本语言。Shell 脚本虽然没有 C、Python、Java、C# 等编程语言强大,但也支持了基本的编程元素。 第1章 Shell基础(开胃菜) 欢迎来到 Linux Shell 的世界&am…

吃鸡攻略大揭秘!提升战斗力,分享干货!

大家好!我是你们的吃鸡玩家小编。今天我要和大家分享一些关于提高游戏战斗力和分享顶级游戏干货的干货! 首先,我们要提到的是绝地求生作图工具推荐。作为一名吃鸡玩家,你一定想要在游戏中获得更多的优势。绝地求生作图工具是你必备…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 八)

其他状态管理概述 除了前面章节提到的组件状态管理和应用状态管理,ArkTS还提供了Watch和$$来为开发者提供更多功能: Watch用于监听状态变量的变化。$$运算符:给内置组件提供TS变量的引用,使得TS变量和内置组件的内部状态保持同步…

WSL 安装 NVIDIA显卡驱动

文章目录 WSL 安装 NVIDIA显卡驱动本机显卡信息验证安装 WSL 版 Ubuntu 22.04在 WSL 中安装 NVIDIA显卡驱动WSL 安装 NVIDIA显卡驱动 最近在研究一些 AIGC 工具,由于 Windows 加入了 WSL 之后的各种特性,本文记录一下如何在 WSL 的 Linux发行版 中安装 NVIDIA 显卡驱动的步骤,…

力扣第110题 平衡二叉数 c++ 树 深度优先搜索 二叉树

题目 110. 平衡二叉树 简单 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1: 输入:root [3,9,20,null…

车险计算器微信小程序源码 带流量主功能

车险计算器微信小程序源码带流量主功能,可以精准的算出车险的书目,是一个非常实用的微信小程序源码。 简单的计算让你得知车险价值 另外也支持流量主,具体小编也就不多说了,大家自己搭建研究吧。 源码下载:https://d…

nsoftware Cloud SMS 2022 .NET 22.0.8 Crack

nsoftware Cloud SMS 能够通过各种流行的消息服务(包括 Twilio、Sinch、SMSGlobal、SMS.to、Vonage、Clickatell 等)发送、接收和安排 SMS 消息,从而提供了一种简化且高效的消息服务方法。 Cloud SMS 提供单个 SMS 组件,允许通过…

spring源码解析——IOC之bean创建

正文 在 Spring 中存在着不同的 scope,默认是 singleton ,还有 prototype、request 等等其他的 scope,他们的初始化步骤是怎样的呢?这个答案在这篇博客中给出。 singleton Spring 的 scope 默认为 singleton,第一部…

C++11(左值(引用),右值(引用),移动语义,完美转发)

目录 一、左值与左值引用 1、左值 2、左值引用 3、意义 二、右值与右值引用 1、右值 2、右值引用 三、右值引用使用场景和意义 1、右值的分类 2、移动构造 3、移动赋值 四、万能引用 五、完美转发 一、左值与左值引用 1、左值 左值是一个表示数据的表达式(如变量名…

软件设计之抽象工厂模式

抽象工厂模式指把一个产品变成一个接口,它的子产品作为接口的实现,所以还需要一个总抽象工厂和它的分抽象工厂。 下面我们用一个案例去说明抽象工厂模式。 在class中可以选择super类和medium类,即选择一个产品的子类。在type中可以选择产品的…

LomBok的使用,MyBatis的使用(增删改查)

Lombok是一个Java库&#xff0c;能自动插入编辑器并构建工具&#xff0c;简化Java开发。通过添加注解的方式&#xff0c;不需要 为类编写getter或equels方法&#xff0c;同时可以自动化日志变量。 结构 pom <?xml version"1.0" encoding"UTF-8"?>…

LLM - FastAPI 搭建简易问答 Server

目录 一.引言 二.辅助函数 1.黑名单 2.清除函数 三.模型函数 1.加载模型 2.生成配置 四.服务部署 1.post - predict 2.get - clean_cache 3.main - run_app 五.总结 一.引言 SFT workflow 微调工作流程 一文中我们介绍了模型微调从数据到最终应用的流程 FastAPI …

C语言 选择(分支)

if 语句&#xff08;分支语句/选择语句&#xff09; 结构&#xff1a; if ( expressio ) statement 如果对 expression 求值为真&#xff08;非0&#xff09;&#xff0c;则执行 statement &#xff1b;否则&#xff0c;跳过 statement 。与 while 循环一样&#xff0c…

推荐两款不错的打字练习网站~

前言 对于写论文或者编程工作&#xff0c; 打字是其中十分耗费体力的一环&#xff0c;如果学会了盲打&#xff0c;那么可以起到事倍功半的作用。为了提高工作效率&#xff0c;我特意在网路上搜寻了大量打字练习的网站&#xff0c;最终发现有两款打字网站十分不错&#xff0c;同…

论文阅读-- A simple transmit diversity technique for wireless communications

一种简单的无线通信发射分集技术 论文信息&#xff1a; Alamouti S M. A simple transmit diversity technique for wireless communications[J]. IEEE Journal on selected areas in communications, 1998, 16(8): 1451-1458. 创新性&#xff1a; 提出了一种新的发射分集方…

搭建环境遇到的坑

office2010装完没法激活&#xff0c;因为没有关闭杀毒软件和防火墙。AWTK designer编译时报这个错&#xff0c;scons按这个方法装之后就好了。 装AWTK designer后&#xff0c;打不开软件&#xff0c;总是闪退&#xff0c;装了VS后就打得开了装IAR时找不到ActivationInfo.txt&am…

abp中iquery类使用orderBy接口功能报错问题

在后端写排序时&#xff0c;当使用如下OrderBy(排序字段)时&#xff0c;只引用System.Linq时如下错误&#xff1a; 只是因为缺少一个引用&#xff1a;System.Linq.Dynamic.Core  在如下类文件中引用 System.Linq.Dynamic.Core  注意&#xff1a;切记不能删掉System.Linq的引…

STM32 CubeMX ADC采集(HAL库)

STM32 CubeMX ADC采集&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX ADC采集&#xff08;HAL库&#xff09;ADC介绍ADC主要特征一、STM32 CubeMX设置二、代码部分三&#xff0c;单通道轮询采样速度总结 ADC介绍 12位ADC是一种逐次逼近型模拟数字转换器。它有多达1…