JWT:拥有我,即拥有权力

Hi,这里是桑小榆。上篇文章中,我们一起探讨了 OAuth 协议的原理以及授权认证流程,本次我们一起探讨 jwt 令牌作为授权协议的传输介质。

OAuth协议规范了几个参与角色的授权标准,安全可控的授予第三方应用,第三方应用获取到用户授予的权限之后,与资源服务器进行交互。那么在进行交互的时候,必然需要一种传输介质,且需要携带用户身份的信息,使得服务器之间能够识别并认证。这个传输的介质就是我们此次探讨的 jwt。

jwt,全称 Json Web Token,也就是日常说的 token 令牌。它是通过数字签名的方式,以 json 对象为载体,在不同服务终端之间安全传输信息。

我们可以看到jwt的定义,它具有和 json 一样的特性,非常轻量的传输方式,且易于人阅读和编写,利于机器的解析和生成。

它像我们的居民身份证一样,一旦相关权威部门识别你是合法公民且会颁发一个适用于本土的证件,通过这个证件可以任意出入需要出示证件的地方。那么jwt也是一样,在服务器认证你的合法用户身份之后,会生成一个json对象,发送给用户,例如:

{"姓名": "桑小榆","角色": "管理员","到期时间": "2022年10月1日 10点10分"
}

之后,用户每需要与服务器通讯的时候,携带具有身份信息的json。服务器完全只需要验证用户携带的身份信息。

当然,用户信息不会以明文的方式携带,不然很容易被不法分子截获进行篡改,那这个令牌就变得无意义了。但凡颁发任何具备流通的信息,都需要具备防伪标识。例如身份证,系统架构师资格证,人民币等都具备复杂的防伪信息。

那 jwt 在生成的时候,通常是加上签名来防止篡改的。形成一个标准的 jwt 格式如下:

0a130e031b1015b7310182758b661cea.png

▲图/ jwt解析组成部分

我们可以看到左边生生签名之后的 jwt 格式是很长得一串字符组成,中间由(.)隔开分成三部分。

我们看到右边解析之后,是jwt的组成格式。

Header     头部
Payload    载荷
Signature  签名以上组成jwt格式为:Header.Payload.Signature

那么我们将依次探讨这三部分。

Header头部

header部分是一个json对象,描述jwt的一些元数据,也就是属性信息。通常格式如下:

{"alg": "HS256","typ": "JWT"

上面的代码中,alg属性表示采用签名的算法(algorithm),默认是 hmac sha256,写成 hs256。这里通常有几种比较常用的签名算法rs256,hs256,base64

rs256(带有sha-256的 rsa 签名)是一种非对称算法,它使用公钥/私钥对:身份提供者拥有用于生成签名的私钥(秘密)密钥,而 jwt 的消费者获得公钥验证签名。由于与私钥相反,公钥不需要保持安全,因此大多数身份提供者都可以让消费者轻松获取和使用(通常通过元数据 url)。

hs256(带有 sha-256 的hmac)涉及散列函数和一个密钥的组合,该密钥在两方之间共享,用于生成用作签名的散列。由于生成签名和验证签名都使用相同的密钥,因此必须注意确保密钥不被泄露。


typ属性表示这个令牌(token)的类型(type),jwt 令牌统一写为jwt

最后,将上面的 json 对象使用 base64url 算法转成字符串。

Payload 载荷

payload 部分也是一个 json 对象,用来存放实际需要传递的数据,通常包含一些签发的信息。jwt 规定了7个官方字段,供选用。

iss (issuer): jwt签发者.sub (subject): jwt所面向的用户.aud (audience): 接收jwt的一方.exp (expiration time): jwt的过期时间,这个过期时间必须要大于签发时间.nbf (Not Before): 定义在什么时间之前,该jwt都是不可用的.iat (Issued At): jwt的签发时间.jti (JWT ID): jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击.

当然除了官方定义的七种之外,还可以自己定义一些私有字段。例如上图 jwt 格式中的 payload 格式,就是是自定义了一些私有字段。

{"sub": "1234567890","name": "桑小榆呀","iat": 1516239022

注意,jwt 默认是不加密的,任何人都可以读到,所以不要把私密信息放在这个部分。所以,payload 部分要使用 base64url 算法转成字符串。

Signature 签名

signature 部分是对前header和payload的签名,防止数据篡改。

首先,需要指定一个256位的密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 header 里面指定的签名算法(默认是 hmac sha256),按照下面的公式产生签名。

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret

算出签名以后,把 header、payload、signature 三个部分拼成一个字符串,每个部分之间用点(.)分隔,就可以返回给用户。

Base64Url 算法

我们在上面的文章中也多次提到,header和payload部分需要使用base64url算法。base64url算法跟base64算法基本类似,但也有一些不同。

jwt作为一个token令牌,有些使用场景可能会用到url,例如 https://jwt.io/?token=xxx。加密流程首先会对url的明文进行加密,其次在base64加密的基础上,会对url里面特殊字符进行处理:=被省略、+替换成-/替换成_ 。这就是base64url加密算法。

JWT 使用

我们探讨完了 jwt 的组成之后,回归到使用上。在身份验证中,客户端使用身份凭据成功登录时,将返回一个 Token 令牌。由于令牌是凭据,因此必须非常小心以防止出现安全问题。通常情况下不应该将令牌保留超过所需的时间。

ef5aad838b2105edd3c154e898723e10.png

虽然我们可以将Token存储在Cookie和localStorage当中,进行自动发送。但会缺乏安全性,和跨域的问题。更好的做法是在authorization标头中使用bearer模式。标头的内容应如下所示:

Authorization: Bearer <token>

如果令牌在authorization标头中发送,则跨域资源共享 (CORS) 不会成为问题,因为它不使用 cookie。配合https传输也能大大提高了安全性。

d79d8349119917c9eb737cf9bff691fc.png

▲图/ jwt简易授权流程

JWT 特点

最后我们总结 jwt 的几个特点:

1.  jwt 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

2. jwt 不加密的情况下,不能将秘密数据写入 jwt 。

3. jwt 不仅可以用于认证,也可以用于交换信息。有效使用 jwt ,可以降低服务器查询数据库的次数。

4. jwt 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 jwt 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

5. jwt 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,jwt 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

6. 为了减少盗用,jwt 不应该使用 http 协议明码传输,要使用 https 协议传输。

我们一起探讨完了 jwt 相关知识。下篇我们将以代码实操的方式来演示 jwt 的生成以及使用,并且配合 oidc 一套标准的授权流程。

👇 更多有趣内容,请多关注!👇

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

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

相关文章

双十一到来之前,阿里AI设计师“鲁班”1天能做4000万张海报

相比较去年&#xff0c;“鲁班”的设计技艺有所提升。 人工智能很大程度上便利了我们的生活&#xff0c;现在他们甚至还能取代了一些设计师的工作&#xff0c;在双十一正式到来之前&#xff0c;淘宝的宣传已经铺天盖地&#xff0c;然而很多人都没想到&#xff0c;我们打开淘宝…

Appium移动自动化测试之获取appPackage和appActivity

方法一&#xff1a;直接打开Appium,点击左上角机器人图标 选择apk所在位置&#xff0c;如图所示&#xff0c;这里以ContactManager.apk为例 方法二&#xff1a;利用dex2jar和jd-gui这两个工具反编译apk文件 这里仍以ContactManager.apk为例 (1)重命名ContactManager.apk为Conta…

CAD转WPF: 关于CAD图纸文件转换为WPF矢量代码文件(xaml文件)的技巧

前言&#xff1a;下面的文章&#xff0c;我将会以几个很简单的步骤&#xff0c;来演示一下通过CAD图纸转换为XAML代码文件的方法&#xff0c;供大佬们参考。一、为了演示一个简单的操作&#xff0c;我此处先打开一个空白的CAD&#xff0c;等下用来进行绘制点内容使用。二、自定…

python之新式类与经典类

经典类与新式类经典类:P 或 P()--深度查找&#xff0c;向上查父节点新式类 :P(object)---广度查找&#xff0c;继承object&#xff0c;新式类的方法较多转载于:https://www.cnblogs.com/zyy98877/p/8574983.html

Flowportal-BPM——环境配置

环境配置&#xff1a; 一、控制面板→程序和功能→打开或不关闭Window功能→选择选项 二、控制面板→管理工具→Internet信息服务&#xff08;IIS&#xff09;管理器→左侧第一个→ISAPI和CGI限制→全部选为【允许】 三、控制面板→管理工具→Internet信息服务&#xff08;IIS&…

一篇文章带你搞懂什么是DevOps?

DevOps DevOps 它的英文发音是 /de’vɒps/&#xff0c;类似于“迪沃普斯”&#xff0c;一词本身是对于 development 以及 operation 两个词的混合&#xff0c;其目的在于缩短系统开发的生命周期&#xff0c;在这过程中发布特性、修复bug以及更新均被紧密的结合。 简化的含义为…

微服务架构下分布式事务解决方案 —— 阿里GTS

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务&#xff0c;这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇&#xff0c;很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成&…

重要消息丨.NET Core 3.1 将于今年12月13日结束支持

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟).NET Core 3.1 将于 2022 年 12 月 13 日结束支持。此后&#xff0c;Microsoft 将不再为 .NET Core 3.1 提供服务更新或技术支持。我们建议尽快迁移到 .NET 6。如果您在支持日期结束后仍在使用 .NET Core 3.1&a…

产品设计的三大原则

1.它有用吗? 如果我们必须从这三个特性中选择一个作为最重要的&#xff0c;那就是有用性。 首要的是&#xff0c;一个产品必须有用。如果它无用&#xff0c;其它任何东西都是不相关的&#xff0c;因为没有人会需要它。很明显&#xff0c;有用性和可享用性看上去一样重要&#…

常用的17个运维监控系统

1. Zabbix Zabbix 作为企业级的网络监控工具&#xff0c;通过从服务器&#xff0c;虚拟机和网络设备收集的数据提供实时监控&#xff0c;自动发现&#xff0c;映射和可扩展等功能。 Zabbix的企业级监控软件为用户提供内置的Java应用服务器监控&#xff0c;硬件监控&#xff0c…

关于html-三角的制作

因为最近看到别人写的不错的样式&#xff0c;所以就想自己实现&#xff0c;但是呢用到了一个三角形&#xff0c;所以稍微研究一下。效果是这样的&#xff1a;注意是下边那个浅色三角&#xff0c;感觉书签的效果有木有。看着很有层次感。接下来就是实现了&#xff0c;利用border…

ABP中的数据过滤器

本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant)&#xff0c;然后介绍了如何实现一个自定义过滤器&#xff0c;最后介绍了在软件开发过程中遇到的实际问题&#xff0c;同时给出了解决问题的一个未必最优的思路。一.预定义过滤器ABP中的数据过滤…

ActiveMQ与spring整合

2019独角兽企业重金招聘Python工程师标准>>> 1 生产者 第一步&#xff1a;引用相关的jar包。 <dependency> <groupId>org.springframework</groupId><artifactId>spring-jms</artifactId> </dependency> <dependency><…

最新远程部署运维工具汇总

一&#xff0e;Puppet 转载https://baike.baidu.com/item/puppet/5109503?fraladdin puppet是一种Linux、Unix、windows平台的集中配置管理系统&#xff0c;使用自有的puppet描述语言&#xff0c;可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体…

Kali Linux 2016.2初体验使用总结

Kali Linux 2016.2初体验使用总结Kali Linux官方于8月30日发布Kali Linux 2016的第二个版本Kali Linux 2016.2。该版本距离Kali Linux 2016.1版本发布&#xff0c;已经有7个月。在这期间&#xff0c;在Kali Linux 2016.2版本发布的这段时间&#xff0c;Kali Linux官方增补了94个…

Kafka入门教程:学习总结目录索引

【Kafka】| 总结/Edison ZhouEdison总结了Kafka的学习征途系列&#xff0c;特意整理了一份目录索引&#xff0c;希望对你有帮助。0Kafka学习路径在学习Kafka的途中&#xff0c;我总结了一个系列的Kafka学习征途系列教程&#xff0c;它只选取了我认为最实用的部分整理出来&#…

javaweb学习中的路径问题

1. 项目结构 2. 客户端路径 1. 超链接 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/…

步步为营-11-ListT泛型的简单练习

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 集合简单练习 {class Program{static void Main(string[] args){}private static void Test3(){//奇偶分拣,奇数在前偶数在后List<int>…

SPI 与 API的区别

背景 Java 中区分 API 和 SPI&#xff0c;通俗的讲&#xff1a;API 和 SPI 都是相对的概念&#xff0c;他们的差别只在语义上&#xff0c;API 直接被应用开发人员使用&#xff0c;SPI 被框架扩展人员使用 理解 API &#xff08;Application Programming Interface&#xff09; …

JS---------正则表达式

2019独角兽企业重金招聘Python工程师标准>>> 1.正则表达式的创建方式&#xff1a; 1.1 var reg new RegExp(pattern); 1.2 var reg /^正则规则$/ 2.正则规则&#xff1a; 2.1 [0-9] 代表数字 [A-Z] 代表大写字母 [a-z] 代表小写字母 [A-z] 代表字母 \w 查找单词字…