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. APICloud超实用经验分享——平台功能

    从2016年开始使用APICloud进行app项目开发,到现在也有五六年了.在此过程中伴随着APICloud一起成长,踩过一些坑,自己的技术也提升不少.在APICloud 推出avm框架一年之后,ID ...

  2. Centos7 logrotate日志切割

    https://www.cnblogs.com/kevingrace/p/6307298.html 在当前目录下 vim  *****  文件 需要切的日志  /home/soft/app/logs/ ...

  3. 您应该知道的35个绝对重要的Linux命令

    https://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=2247499293&idx=2&sn=1353b78d6ad01d ...

  4. [ flask-migrate ] 记自己犯的一次低级错误

    问题描述 从github上pull了别人的项目学习,项目用flask-migrate来迁移数据库.查看了一下,作者把数据库文件 app.db 删除了,不过migrations文件夹留着的,因此我只需要 ...

  5. centos7 date时间命令

    date "+%F %T" %F     full date; same as %Y-%m-%d  --相当于年月日格式 %T     time; same as %H:%M:%S ...

  6. 几张图解释明白 Kubernetes Ingress

    来源:K8s技术圈 作者:阳明 Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到 ...

  7. 创建VS Code 扩展插件

    VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...

  8. uboot无法通过nfs加载ubuntu18.04中的文件(转)

    问题描述: i.mx6ull开发板,采用alientek官方维护的uboot,使用ubuntu18.04 lts作为nfs server,导致开发板uboot上nfs命令无法加载网络文件系统. 解决: ...

  9. Visaul Studio 2015 MFC 应用程序工程创建

    近一段时间开始接触到MFC桌面开发程序,忙完了一段时间的项目开发之后,来整理整理Visaul Studio 2015开发MFC桌面程序的基本功能. 首先从创建软件工程项目开始,Visaul Studi ...

  10. MobaXterm中文乱码问题

    现在Xshell和SecureCRT都要收费,本着不用盗版的原则,同时需要标签管理session,快捷命令等功能,最后选择了MobaXterm. 但是使用后发现中文会乱码.后按照博客的方法,修改了终端 ...