JWT: Json Web Tokens

JWT是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于将各方之间的信息安全地传输为JSON对象。因为它是经过数字签名的,所以该信息可以进行验证并信任,无法伪造。

JWT可以使用密钥进行签名,如:HMAC算法,RSA算法,ECDSA等对公钥/私钥进行签名。

什么时候应该使用 JSON Web Tokn(JWT令牌)

  • Authorization 授权:

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

  • Information Exchange 信息交换

由于 JWT 可以签名(例如,使用公钥/私钥对),因此您可以确定发送方是不是有效用户。此外,由于签名是使用(Header)标头和(Payload)有效载荷计算的,因此您还可以验证内容是否未被篡改。

JSON Web 令牌结构

以紧凑的形式,JSON Web 令牌由三个部分组成

  • Header 标头
  • Payload 有效载荷
  • Signature 签名

格式如下

xxxxx.yyyyy.zzzzz

header

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

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

然后,第一部分对这个json串进行Base64Url编码,作为JWT的第一部分

Payload

令牌的第二部分是(payload)有效载荷。

通常包含三种类型的声明:注册声明(Registered claims)、公共声明(Public claims)和私有声明(Private claims)

  • 注册声明:这些是一组预定义的声明,不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是:iss(发行人)、exp(到期时间)、sub(主题)、aud(观众)和 其他

‎请注意,声明名称的长度只有三个字符,因为 JWT 应该是紧凑的。‎

  • 公共声明:这些可以由使用JWTs的人随意定义。但为了避免冲突,它们应该在IANA JSON Web Token Registry中定义,或者定义为包含防冲突命名空间的URI。

  • 私有声明:这些是创建自定义声明,用于在同意使用它们各方之间共享信息,既不是注册声明,也不是公开声明
  • 示例
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

然后对payload进行Base64Url‎‎ 编码,形成 JSON Web 令牌的第二部分

‎请注意,对于已签名的令牌,此信息虽然受到保护以防止篡改。但任何人都可以读取。不要将机密信息放在 JWT 的payload和Header 中,除非它已经加密。

Signature(签名)

‎要创建签名部分,您必须获取Base64Url‎‎ 编码后的Header 、Base64Url‎‎ 编码后的payload、一个密钥、header中指定的算法,并对其进行签名。‎

例如,如果要使用 HMAC SHA256 算法,将按以下方式创建签名:

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

签名用于验证消息在此过程中是否被篡改,并且,对于使用私钥签名的令牌,它还可以验证 JWT 的发送者是否是它所说的发件人。

总结

The output is three Base64-URL strings separated by dots that can be easily passed in HTML and HTTP environments, while being more compact when compared to XML-based standards such as SAML.

输出是三个 Base64-URL 字符串,由点分隔。可以在HTML、HTTP环境中轻松传递,同时与基于XML的标准(如SAML)相比更加紧凑。

以下展示了一个JWT,它通过对header和payload进行编码,并用一个secret(秘钥)进行Signature(签名)

如果您想使用JWT并将这些概念付诸实践.你可以访问 jwt.io ,测试用于解码、验证和生成JWT的调试器

  • Base 64 解码
  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  • eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

Base64 在线编码解码 | Base64 加密解密 - Base64.us

JSON Web Token是如何工作的?

在身份验证中,当用户使用其凭据成功登录时,将返回一个JSON Web Token。由于令牌是凭证,因此必须非常小心地防止安全问题。一般来说,您不应该将Token保存的时间超过所需时间。

由于缺乏安全性,您也不应该在浏览器存储中存储敏感会话数据。

每当用户想要访问受保护的路由或资源时,Http请求的user agent都应该发送JWT,通常使用Bearer 模式的Authorization 报头(header)中。标题的内容应如下所示:

Authorization: Bearer <token>

在某些情况下,这可能是一种无状态授权机制。服务器的受保护路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。如果JWT包含必要的数据,可能会减少查询数据库中某些操作的需要,尽管情况并非总是如此。

如果Token在 Authorization header中发送,则跨源资源共享(CORS)不会成为问题,因为它不使用cookie。

下图显示了如何获取JWT并使用其访问API或资源:

1.应用程序(Application)或客户端(Client) 向授权服务器 (Authorization Server )请求授权.这是通过不同的授权流程实现的。例如,一个典型的OpenID Connect兼容web应用程序将使用授权代码流通过/oauth/authorize 端点。

2.当授权被授予时,授权服务器向应用程序返回一个访问令牌( access token)。

3.应用程序使用访问令牌( access token)访问受保护的资源(如API)。

请注意,对于签名令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法被篡改。这意味着您不应该将机密信息放入令牌中。

我们为什么要使用JSON Web Token?

让我们来谈谈JSON Web Token(JWT)与Simple Web Token(SWT)和安全断言标记语言令牌Security Assertion Markup Language Tokens (SAML)相比的优势。

由于JSON没有XML那么冗长,所以编码时它的大小也更小,这使得JWT比SAML更紧凑。这使得JWT成为在HTML和HTTP环境中传递的好选择。

就安全性而言,SWT只能由使用HMAC算法的共享密钥对称签名。然而,JWT和SAML令牌可以使用X.509证书形式的公钥/私钥对进行签名。与签署JSON的简单性相比,使用XML数字签名签署XML而不引入模糊的安全漏洞是非常困难的。

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

关于使用,JWT在互联网范围内使用。这突出了在多个平台(尤其是移动平台)上客户端处理JSON Web Token的便利性。

编码JWT和编码SAML的长度比较

如果您想阅读更多关于JSON Web令牌的信息,甚至开始在自己的应用程序中使用它们来执行身份验证,请浏览Auth0上的JSON Web Token登录页

原文

JSON 网络令牌简介 - jwt.io

[翻译]Introduction to JSON Web Tokens的更多相关文章

  1. JWT & JSON Web Tokens

    JSON Web Tokens https://jwt.io json web token example https://jwt.io/introduction/ https://medium.co ...

  2. JSON WEB TOKENS

    用JWT来保护我们的ASP.NET Core Web API   在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 ...

  3. [Node.js] Creating JWTs (JSON Web Tokens) in Node

    In this lesson we will look at all of the pieces that combine together to create a JWT (j AWT) or JS ...

  4. JSON Web Tokens(JWT)

    现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证.它有以下特点: JWT是跨不同语言的,JWT可以在 .NET, Python, ...

  5. JSON Web Tokens测试工具

    JSON Web Tokens官方提供测试工具https://jwt.io某些静态资料需要链接google.twitter服务器,被墙无法访问.现在提供可以方法测试工具http://hingtai.c ...

  6. Implement JSON Web Tokens Authentication in ASP.NET Web API and Identity 2.1 Part 3 (by TAISEER)

    http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-an ...

  7. Java分布式:JWT(JSON Web Tokens)

    Java分布式:JWT(JSON Web Tokens) 0.优势 Session方式存储用户状态占用大量服务器内存.一般而言,大型应用还需要借助一些KV数据库和一系列缓存机制来实现Session的存 ...

  8. 服务安全-JWT(JSON Web Tokens):百科

    ylbtech-服务安全-JWT(JSON Web Tokens):百科 JSON Web Tokens是一种开放的行业标准 RFC 7519方法,用于在双方之间安全地表示索赔. JWT.IO允许您解 ...

  9. ASP.NET Core 简单集成签发 JWT (JSON Web Tokens)

    什么是 JWT ? 从 https://jwt.io/ 可以了解到对 JWT 的描述:JSON Web Tokens are an open, industry standard RFC 7519 m ...

随机推荐

  1. js 简单版发布留言 案例

    <!DOCTYPE html>   <html lang="en">   <head>       <meta charset=" ...

  2. laravel源码分析-队列Queue

    laravel 源码分析具体注释见 https://github.com/FX-Max/source-analysis-laravel 前言 队列 (Queue) 是 laravel 中比较常用的一个 ...

  3. .NET 微服务——CI/CD(4):避坑和一点经验

    如果你看过之前几篇文章,应该已经Jenkins成功搭建了CICD环境,但是进入正式环境会有一些坑,不注意中招的话很难受,这里总结一下,避免重复消耗精力. 后门漏洞 Jenkins有后门,这是个老问题了 ...

  4. git 生成忽略文件

    一.在.git的同级目录下打开git bash 二.在命令行输入 三.在生成的文件中添加忽略提交的文件夹名称 来自为知笔记(Wiz)

  5. linux .gz文件 压缩与解压缩命令

    1. 压缩文件 gzip 源文件 如压缩 b.txt 使用命令 gzip b.txt 注意 压缩为 .gz 文件 源文件会消失 如果想保留源文件 使用命令 gzip -c 源文件 > 压缩文件 ...

  6. 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)

    问题描述 如何在一个AppService下同时部署运行多个Java 应用程序呢? 问题解答 因为App Service的默认根目录为 wwwroot.如果需要运行多个Java 应用程序,需要在 www ...

  7. Echart可视化学习(十一)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...

  8. rockchip-rk3399 RGA的使用

    RGA的使用 RGA即二维图像辅助计算单元,该单元可以在极短时间内拷贝.旋转.格式转换.缩放.混合图片. rk官方RGA库链接:https://github.com/rockchip-linux/li ...

  9. markdown mermaid流程图

    流程图 所有流程图都由节点.几何图像.箭头或线条组成. mermaid代码定义了这些节点和边的制作和交互方式.可以有不同的箭头类型.多向箭头以及与子图的连接. 节点 节点 flowchart LR i ...

  10. Android官方文档翻译 十五 3.3Supporting Different Platform Versions

    Supporting Different Platform Versions 支持不同的平台版本 This lesson teaches you to 这节课教给你 Specify Minimum a ...