小呆呆的生活

  • 首页
  • 分类
    • Linux
    • MySQL
    • SpringBoot
    • SpringCloud
  • 工具
  • 留言
  • 登录
  • 注册
  • 友情链接
    • 咸鱼的窝
    • DIY熙的家
    • Farmer的自习室
    • Dark的小黑屋
  • 关于
人的一生注定会遇到两个人
一个惊艳了时光,一个温柔了岁月
  1. 首页
  2. 后端
  3. 正文

JWT(Json Web Token)介绍

2021年 9月 5日 1169次阅读 2人点赞 0条评论

image-20220329153755307

什么是JWT?

  JSON Web Token (JWT) 是一个开放式标准(RFC 7519),它定义了一种紧凑且自成一体的方式,用于将各方之间的信息安全传输为 JSON 对象。此信息可以验证和信任,因为它是数字签名的。JWT 可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公/私密密钥对进行签名。

我们为什么要用JWT?

与简单的 Web 令牌(SWT) 和安全断言标记语言令牌 (SAML)相比,让我们来谈谈 JSON Web 令牌(JWT)的好处。

  • 由于 JSON 比 XML 更冗长,因此在编码时,其大小也更小,使 JWT 比 SAML 更紧凑。这使得 JWT 成为在 HTML 和 HTTP 环境中传递的一个不错的选择。

  • 在安全性方面,SWT 只能通过使用 HMAC 算法的共享密秘密进行对称签名。但是,JWT 和 SAML 令牌可以使用以 X.509 证书形式形式的公共/私人密钥对进行签名。与签署 JSON 的简单性相比,在不引入模糊安全漏洞的情况下使用 XML 数字签名是非常困难的。

  • JSON 解析器在大多数编程语言中很常见,因为它们直接映射到对象。相反,XML 没有自然的文档对对象映射。这使得与 JWT 合作比 SAML 断言更容易。

  • 在使用方面,JWT 在互联网规模上使用。这突出了在多个平台(尤其是移动平台)上对 JSON Web 令牌进行客户端处理的便利性。

JWT的构成

  • Header 头部

    ‎头‎‎通常‎‎由两个部分组成:令牌的类型(即 JWT)和正在使用的签名算法,如 HMAC SHA256 或 RSA。‎

    例如:

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

    ‎然后,此 JSON 是‎‎Base64Url‎‎编码,以形成 JWT 的第一部分。‎

  • Payload 负载 (类似于飞机上承载的物品)

    令牌的第二部分是有效载荷,其中包含有效信息。有效信息包含三个部分:

    • 注册的声明(建议但不强制使用):
    iss: jwt签发者
    sub: jwt所面向的用户
    aud: 接收jwt的一方
    exp: jwt的过期时间,这个过期时间必须要大于签发时间
    nbf: 定义在什么时间之前,该jwt都是不可用的.
    iat: jwt的签发时间
    jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
    • 公共的声明:

    公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

    • 私有的声明:

    这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册的声明,也不是公共的声明。

    例如:

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

    ‎然后,对有效载荷‎‎进行 Base64Url‎‎编码,以形成 JSON Web 令牌的第二部分。‎

    ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==
  • Signature 签名/签证

    令牌的第三部分是签名,要创建签名,必须使用Base64Url‎编码后的Header头部、Base64Url‎编码后的Payload 载荷和一个secret(盐),Header头部和Payload 载荷使用.连接组成的字符串,通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

    ‎例如,如果您想要使用 HMAC SHA256 算法,则会以以下方式创建签名:‎

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

    签名用于验证信息,在途中没有更改,并且对于使用私人密钥签名的令牌,还可以验证 JWT 的发送者是否为其所声明的发送者。

    注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

JWT的应用场景

Authentication(鉴权) : 这是使用JWT最常见的情况。 一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。 单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

Information Exchange(信息交换) : JSON Web Tokens是在各方之间安全传输信息的好方式。 因为JWT可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。 此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

参考文档

Introduction to JSON Web Tokens

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 后端 安全 标准
最后更新:2022年 3月 29日

小呆呆

知足常乐,就会拥有幸福

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

小呆呆

知足常乐,就会拥有幸福

最新 热点 随机
最新 热点 随机
本站暂时停止更新,后续文章将在CSDN更新 数据库索引简析 Java多线程的使用场景以及线程的创建方式 Spring事务的使用示例和传播行为以及失效场景 Spring Boot使用JUnit和Mockito进行Service层单元测试 Spring Cloud Zuul和Gateway的简单示例(搭建方式)
记由于自己呆瓜操作引发的“血案” Spring Boot整合Thymeleaf MySQL练习(一) JWT(Json Web Token)介绍 Java面试高频(一) Reids客户端Jedis的访问模式(下)
标签聚合
后端 MySQL SpringCloud SpringBoot 干货 面试 Java Spring
最近评论
我是可是尼古拉斯·爱新觉·罗·G·钰豪啊 发布于 4 年前(04月08日) 我来注水了胜哥 :hehe:
鸟人金 发布于 4 年前(03月03日) v
鸟人金 发布于 4 年前(03月03日) 胜哥yyds
鸟人金 发布于 4 年前(03月03日) 我滴偶像!!!!!!!!!!!!!!!
水军2号 发布于 4 年前(03月03日) 胜哥tql
归档
  • 2024 年 4 月
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 8 月
  • 2023 年 6 月
  • 2022 年 11 月
  • 2022 年 8 月
  • 2022 年 6 月
  • 2022 年 4 月
  • 2022 年 3 月
  • 2022 年 1 月
  • 2021 年 12 月
  • 2021 年 9 月
  • 2021 年 8 月
  • 2021 年 6 月
  • 2021 年 4 月
  • 2020 年 10 月
  • 2020 年 9 月
  • 2020 年 8 月
  • 2020 年 7 月
  • 2020 年 6 月
  • 2020 年 5 月
  • 2020 年 4 月
  • 2020 年 3 月

COPYRIGHT © 2023 小呆呆的生活. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备2020104583号

粤公网安备44011802000463号