首页 > 其他分享 >JWT 基础概念详解

JWT 基础概念详解

时间:2022-08-15 17:27:01浏览次数:100  
标签:Header JWT 概念 Token 详解 签名 Signature Payload

什么是JWT

JWT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出,JWT 本身也是 Token,一种规范化之后的 JSON 结构的 Token。


JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。


可以看出,JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。并且, 使用 JWT 认证可以有效避免 CSRF 攻击,因为 JWT 一般是存在在 localStorage 中,使用 JWT 进行身份验证的过程中是不会涉及到 Cookie 的。

JWT由哪些部分组成?

jwt-composition

JWT 本质上就是一组字串,通过.切分成三个为 Base64 编码的部分:

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。

  • Payload : 用来存放实际需要传递的数据

  • Signature(签名) :服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。


Header 和 Payload 都是 JSON 格式的数据,Signature 由 Payload、Header 和 Secret(密钥)通过特定的计算公式和加密算法得到。

Header 通常由两部分组成:

  • typ(Type):令牌类型,也就是 JWT。

  • alg(Algorithm) :签名算法,比如 HS256。


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

JSON 形式的 Header 被转换成 Base64 编码,成为 JWT 的第一部分。

Payload

Payload 也是 JSON 格式数据,其中包含了 Claims(声明,包含 JWT 的相关信息)。

Claims 分为三种类型:

  • Registered Claims(注册声明) :预定义的一些声明,建议使用,但不是强制性的。

  • Public Claims(公有声明) :JWT 签发方可以自定义的声明,但是为了避免冲突,应该在 IANA JSON Web Token Registry 中定义它们。

  • Private Claims(私有声明) :JWT 签发方因为项目需要而自定义的声明,更符合实际项目场景使用。


Payload 部分默认是不加密的,一定不要将隐私信息存放在 Payload 当中

JSON 形式的 Payload 被转换成 Base64 编码,成为 JWT 的第二部分。

Signature

Signature 部分是对前两部分的签名,作用是防止 JWT(主要是 payload) 被篡改。

这个签名的生成需要用到:

  • Header + Payload。
  • 存放在服务端的密钥(一定不要泄露出去)。
  • 签名算法。

签名的计算公式如下:

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

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

如何基于 JWT 进行身份验证?

在基于 JWT 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。
jwt

简化后的步骤如下:

  1. 用户向服务器发送用户名、密码以及验证码用于登陆系统。
  2. 如果用户用户名、密码以及验证码校验正确的话,服务端会返回已经签名的 Token,也就是 JWT。
  3. 用户以后每次向后端发请求都在 Header 中带上这个 JWT 。
  4. 服务端检查 JWT 并从中获取用户相关信息。

两点建议:

  1. 建议将 JWT 存放在 localStorage 中,放在 Cookie 中会有 CSRF 风险。
  2. 请求服务端并携带 JWT 的常见做法是将其放在 HTTP Header 的 Authorization 字段中(Authorization: Bearer Token)。

如何防止 JWT 被篡改?

有了签名之后,即使 JWT 被泄露或者解惑,黑客也没办法同时篡改 Signature 、Header 、Payload。

这是为什么呢?因为服务端拿到 JWT 之后,会解析出其中包含的 Header、Payload 以及 Signature 。服务端会根据 Header、Payload、密钥再次生成一个 Signature。拿新生成的 Signature 和 JWT 中的 Signature 作对比,如果一样就说明 Header 和 Payload 没有被修改。

不过,如果服务端的秘钥也被泄露的话,黑客就可以同时篡改 Signature 、Header 、Payload 了。黑客直接修改了 Header 和 Payload 之后,再重新生成一个 Signature 就可以了。

密钥一定保管好,一定不要泄露出去。JWT 安全的核心在于签名,签名安全的核心在密钥。

如何加强 JWT 的安全性?

  1. 使用安全系数高的加密算法。
  2. 使用成熟的开源库,没必要造轮子。
  3. JWT 存放在 localStorage 中而不是 Cookie 中,避免 CSRF 风险。
  4. 一定不要将隐私信息存放在 Payload 当中。
  5. 密钥一定保管好,一定不要泄露出去。JWT 安全的核心在于签名,签名安全的核心在密钥。
  6. Payload 要加入 exp (JWT 的过期时间),永久有效的 JWT 不合理。并且,JWT 的过期时间不易过长。

原文章地址

JWT 基础概念详解

标签:Header,JWT,概念,Token,详解,签名,Signature,Payload
From: https://www.cnblogs.com/istart/p/16588957.html

相关文章

  • jsp_概念和原理
    jsp_概念概念:javaserverPages:java服务器端页面可以理解为:一个特殊的页面其中既可以指定定义html标签又可以定义java代码用于简化书写jsp和HTMl的区别HTML......
  • http和https的概念 和 区别
    1、http和https的基本概念http http是客户端和服务端传输请求应答的标准,用与从www服务器传输超文本到本地浏览器的超文本传输协议。httpshttps是以安全为目的的ht......
  • MVC_jsp演变历史以及MVC详解
    MVC_jsp演变历史jsp演变历史1、早期只有servlet,只能使用response输出标签数据,非常麻烦2、后来有jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java......
  • innobackupex参数详解
    innobackupex参数解析 --apply-log   通过应用同一目录下的事务日志文件xtrabackup_logfile,在BACKUP-DIR目录准备一个备份。页建立一个新的事务日志文件。innoDB的......
  • Albert理论详解:用矩阵分解与跨层参数共享减少参数量
    1.介绍Albert是Bert的一个变种,它在Bert的基础上减少了参数量,使整个模型更加的“轻量化”,同时也保持了Bert的性能,但值得注意的是,Albert虽然显著地减少了参数量,但并没有显著......
  • MVC_jsp演变历史和详解
    MVC_jsp演变历史MVC: 开发模式(ModelViewController)1.jsp演变历史1.早期只有Servlet,只能使用response输出标签数据,非常麻烦2.后来又jsp,简化了Se......
  • 使用"新概念英语"提升英语水平?
    最近想了下学生时代,英语是一直都没有解决的问题,同时在找工作的时候,也没法看外企的机会.所以想学习一下外语.最先想到的是"新概念"英语,这套丛书4册,特别经典.我就找了......
  • Option键使用技巧详解,提升Mac工作效率!
    众所周知快捷键可以提升日常效率,本文重点讲解Mac电脑上Option键是使用,进而加快自己电脑操作的速度。Option+访达当我们谈到macOS的时候,总是会下意识地把它与Windows......
  • 技术分享 | 实战详解接口测试请求方式Get、post
    原文链接本文节选自霍格沃兹测试开发学社内部教材在日常的工作当中,http请求中使用最多的就是GET和POST这两种请求方式。那么掌握这两种请求方式的原理,以及两种请......
  • JSP概念和JSP原理
    JSP入门学习概念:JavaServerPages:Java服务器端页面可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写<html><head>......