【计算机网络】JWT(JSON Web Token)初识

2023-11-10

JWT(JSON Web Token)初识

JWT(JSON Web Token)是目前最流行的跨域认证解决方案。

1.跨域认证的问题

互联网服务离不开用户认证。一般流程是下面这样。

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。
  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

举例来说,A 网站和 B 网站是同一家公司的关联服务。现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现?

一种解决方案是 session 数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败。

另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

2.JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
  "姓名": "张三",
  "角色": "管理员",
  "到期时间": "2018年7月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

在这里插入图片描述

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

3.JWT 的数据结构

实际的 JWT 大概就像下面这样。

在这里插入图片描述
它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

写成一行,就是下面的样子。

Header.Payload.Signature

在这里插入图片描述

3.1 Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。

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

上面代码中,alg 属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ 属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。

最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。

3.2 Payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了 7 个官方字段,供选用。

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

3.3 Signature

Signature 部分是对前两部分的签名,防止数据篡改。

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

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

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

在这里插入图片描述

3.4 Base64URL

前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符 +/=,在 URL 里面有特殊含义,所以要被替换掉:= 被省略、+ 替换成 -/ 替换成 _。这就是 Base64URL 算法。

4.JWT 的使用方式

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。

Authorization: Bearer <token>

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

5.JWT 的几个特点

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

  • JWT 不加密的情况下,不能将秘密数据写入 JWT。

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

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

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

  • 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络】JWT(JSON Web Token)初识 的相关文章

  • PHP 会话锁定并使用 Memcache 存储会话

    我有一个标准的 html 页面 其中有一些 img 标签 每个标签都指向我们服务器上的一个 php 文件 加载 php 文件时 它会在生成图像之前将一些数据保存到会话中 来自每个脚本的会话中的数据随后将在我们的应用程序中的其他脚本中使用 生
  • Struts 2 中的 Java 应用程序可以管理多少个会话?

    我正在开发事务管理应用程序 并且正在使用 Struts2 我在内部使用了一个会话来设置和获取值 例如 ActionContext getContext getSession put string string 在应用程序中使用这样的会话是否
  • 无法加载文件或程序集“Microsoft.IdentityModel.Tokens,版本=5.2.0.0”

    我正在尝试使用 VS 2015 将 OWIN JWT 添加到 webapi 项目中 参考显示Microsoft Owin Security Jwt Version 4 0 0 0 and Microsoft IdentityModel To
  • JWT Web 令牌加密 - SecurityAlgoritms.HmacSha256 与 SecurityAlgoritms.HmacSha256Signature

    用于基于令牌的身份验证Microsoft IdentityModel Tokens提供了可用于创建的安全算法列表SigningCredentials string secretKey MySuperSecretKey byte keybyt
  • 在浏览器上验证 JWT

    我一直在读关于JWT https jwt io 我知道它分为三个部分 即header payload and signature 我将哈希算法保留在标头中 将基本信息保留在有效负载中例如 姓名 年龄 职务 有效期等在有效负载中 然后这两个都
  • PHP if in_array 表示多个值

    我有一个由 3 到 12 个值之间的任意位置生成的数组 它根据帐户信息生成该数组 result ad gt user gt groups user username 我想检查这个数组是否有多个值 大约 4 或 5 个 如果其中有任何一个值
  • 使用 ASP.NET 2.0 处理过期会话的最有效方法是什么

    在我们正在建设的网站上 当用户的会话结束时 我们需要能够将用户重定向到默认页面 乍一看 我们使用 Session End 和 Response Redirect 来完成这项工作 Sub Session End ByVal sender As
  • 会话亲和性和粘性会话之间的区别?

    有什么区别会话关联性 and 粘性会话在负载平衡服务器的上下文中 我见过这些术语可以互换使用 但有不同的实现方式 在第一个响应中发送 cookie 然后在后续响应中查找它 cookie 表明要发送到哪个真实服务器 Bad如果您必须支持无 c
  • PassportJS - 自定义回调并将 Session 设置为 false

    是否可以使用自定义回调并禁用会话 在文档中 它显示了如何禁用会话和自定义回调 但如何组合它们 app get login function req res next passport authenticate local function
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • NestJs + Passport - JWTStrategy 永远不会用 RS256 令牌调用

    我正在尝试在 Nestjs 后端实现 RS256 JWT 令牌 我按照中提供的示例进行操作Nestjs 文档 https github com nestjs nest tree master sample 19 auth 在我的模块中我注册
  • 当用户再次访问同一页面时保持登录状态?

    目前我正在使用会话来登录用户 但是当我关闭浏览器并再次打开它时 我必须再次登录 你如何让用户在 2 周内保持登录状态 那么是通过cookie吗 那么您想要 在这台计算机上记住我 选项吗 这是一种与语言无关的方法 创建一个至少包含以下内容的数
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • Spring Boot,Websockets无法从Session获取用户(即java.security.Principal)

    与 一起工作Spring Boot 1 2 1 RELEASE and Spring Websockets 运行嵌入式时存在部署运行时问题Jetty 9 我不能伪造用户 java security Principal 当应用程序部署在本地主
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • MVP - 演示者应该使用 Session 吗?

    我正在为网页使用模型 视图 演示者模式 演示者应该知道会话还是应该只有视图知道它 我想我的意思是像会话这样的概念与视图的体系结构非常相关 所以它们应该仅限于视图使用吗 否则 如果我想在不同架构的类似页面上重用演示者 会发生什么 或者我不需要
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 是否有其他方法可以访问延迟自定义操作中的会话详细信息?

    我有一个自定义操作 需要获取以下值才能将某些部分从安装文件夹复制到 VS2010 文件夹 VS2010目录路径 VS2010DEVENV财产 安装路径 INSTALLLOCATION财产 为了提供足够的权限 我将自定义操作设置为Execut
  • 解码 JavaScript Web 令牌 (JWT) 的到期日期?

    我无法理解应用程序中嵌入的 JWT 的到期日期格式 例如 1473912000 这翻译成什么 1473912000 毫秒 某个 x 日期 任何帮助将不胜感激 正如詹姆斯所指出的 该数字是自 1970 年 1 月 1 日以来的秒数 这被转换成

随机推荐

  • Maven和Gradle如何添加依赖

    一 首先来看看Maven项目怎么添加依赖 二 上图中红圈部分的pom xml文件就是可以添加依赖的地方 例如这个 一定要放到 里面
  • 5号字对应的数字字号_字号对照表

    字号 磅数 宋体 黑体 楷体 初号 42 宋体初 黑体初 楷体初 小初 36 宋体小初 黑体小初 楷体小初 一号 26 宋体一号 黑体一号 楷体一号 小一 24 宋体小一 黑体小一 楷体小一 二号 22 宋体二号 黑体二号 楷体二号 小二
  • oracle学习之路(5)Navicat连接Oracle数据库:Oracle library is not loaded 解决方案

    Navicat连接Oracle数据库报错 Oracle library is not loaded 原因 这是因为OCI环境配置有问题 需要修改 oci dll 文件路径 版本不一致 是oci dll版本不对 因为Navicat是通过Ora
  • umi4学习 路由跳转 history useNavigate 的使用

    umi4 history 已经不用query传参了 接下来就来讲讲如何传参吧 第一种 适用于只跳转路径 不携带参数 import history from umi history push user 第二种 用于携带参数 并且参数很多的情况
  • 深度聚类相关(三篇文章)

    一 Deep Clustering for Unsupervised Learning of Visual Features 原文链接 https arxiv org pdf 1807 05520 pdf 完全不需要标签的无监督学习方法 好
  • navicat12,使用自动完成代码,没有默认选中第1个,怎么设置?

    navicat12 使用自动完成代码 没有默认选中第1个 怎么设置 按 TAB 插入第一个选项 ESC 代码提示
  • 【C++】Vector和String详解

    前言 没错 我又更新了 即使没人看 上一篇文章介绍了有关双向链表的容器list 那问题来了 数组和字符串这种使用频率非常高的数据结构 在STL模板中会不会有让人眼前一亮的实现哪 很明显 有 vertor和string就是这两种数据结构相对应
  • Python Flask 中的路由

    Python Flask 中的路由 在 Web 应用中 接口一般都是遵守 RESTful API 设计风格的 这种风格很优雅 而且对用户来说非常易于理解 RESTful API 参考 https blog csdn net weixin 4
  • C语言:电话号码字母排列

    这点B玩意写了一下午加一晚上 但是理解了回溯法也值了 具体解释我写在注释里 include
  • Linux iNode 双网卡,已解决: Zynq 7000 双网卡配置-内核DTS该如何配置 - Community Forums...

    问题 ETH0是通的 ETH1找不到PHY 连接到GMII2RGMII转换器时 找不到该设备 dts和vivado该如何配置 系统 Zynq 7Z015 Vivado 2018 3 内核 4 6 VIVADO工程如下 在内核设备树文件中 配
  • mysql重连次数_Yii2-Mysql重连机制

    背景 nsq消费进程中长时间消费不到数据 mysql设置的自动断开时间超过后 mysql自动断线 服务端报mysql gone away 这时需要捕获异常重连并重试 或者将长连接改为短连接也可以解决该问题 解决 配置项新增 db gt cl
  • python马士兵学习笔记

    前言 本篇文章是作者在B站学习python马士兵视频的笔记 之前章节的内容可参考https blog csdn net qq 43511094 article details 113062435 或https blog csdn net w
  • stat()函数:获取文件状态

    相关函数 fstat lstat chmod chown readlink utime 头文件 include
  • SQL Server 基础操作 (二) 创建用户并且为用户授权

    1 创建用户 右键点击登录名 新建登录名 2 设置管理员权限 进入 服务器角色 在右侧的服务器角色面板中 勾选public 服务器角色 说明 sysadmin 执行SQL Server中的任何操作 serveradmin 配置服务器设置 s
  • nodejs链接mysql报错_nodejs连接数据库报错

    ER NOT SUPPORTED AUTH MODE 报错详情 使用nodejs连接数据库时报错 Error ER NOT SUPPORTED AUTH MODE Client does not support authentication
  • Blockly概述

    原文地址 https developers google com blockly guides overview Blockly是一个用于Web Android IOS的可视化代码编辑器库 Blockly使用了相互关联的积木来表示表达代码中
  • ES 搜索22 (function_score 支持的衰减函数 linear、exp 和 gauss)

    衰减函数 很多变量都可以影响用户对于酒店的选择 像是用户可能希望酒店离市中心近一点 但是如果价格足够便宜 也愿意为了省钱 妥协选择一个更远的住处 如果我们只是使用一个 filter 排除所有市中心方圆 100 米以外的酒店 再用一个filt
  • 关于根轨迹对于控制系统的一点理解

    自动控制理论根轨迹的学习过程中 经常会遇到几个问题 为什么要用根轨迹法 为什么根轨迹法最终转化为调整增益K来反应系统的稳定性和动态性能 为什么根轨迹法用开环传递函数求解的却是闭环极点 盲目的借助于matlab进行根轨迹的计算和绘图 有时候往
  • MySQL采用B+树作为索引的原因

    MySQL采用B 树作为索引的原因 1 MySQL的索引结构是如何查询的 在MySQL中 存储的数据记录都是持久化到磁盘中的 数据包含索引和记录 当MySQL查询数据时 由于索引也是持久化在磁盘上面的 首先会从磁盘上读取索引到缓存中 然后再
  • 【计算机网络】JWT(JSON Web Token)初识

    JWT JSON Web Token 初识 JWT JSON Web Token 是目前最流行的跨域认证解决方案 1 跨域认证的问题 互联网服务离不开用户认证 一般流程是下面这样 用户向服务器发送用户名和密码 服务器验证通过后 在当前对话