JSON Web Tokens介绍

什么是JWT

这篇文章选择性翻译于https://jwt.io/introduction/

JWT简介

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且字自包含的标准,用于将各方之间的信息地传输为JSON对象。 该信息是通过数字签名进行验证。使用HMAC算法或使用RSA的公钥/私钥对JWT进行签名,所以它的安全性非常高。

进一步解释它的特点或者概念: • 紧凑型(compact):由于是加密后的字符串,JWT数据体积非常的小,可通过 POST参数或HTTP请求头发送。 另外,数据体积小意味着传输速度很快。 • 自包含(self-contained):JWT包含了用户的所有信心,所以避免了每次查询数据库,降低了服务器的负载。

JWT应用场景

一般什么时候应该使用JWT呢?,一般使用在以下场景:

• 验证:这是使用JWT的最常见的场景。 一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。 单点登录是一个广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用。 • 信息交换:JWT是在各方之间安全传输信息的好方法,因为它们可以被签名,例如使用公钥/私钥对. 另外,当使用标题和有效载荷计算签名时,还可以验证内容是否未被篡改。

JWT结构

JWT由三个部分组成,分别为“.”分隔,三部分组成如下:

  • Header(头)
  • Payload(有效载荷)
  • Signature(签名) 因此,JWT通常格式如下:

xxxxx.yyyyy.zzzzz

现在,依次对这三个组成部分,分开讲解:

1. Header

标题通常由两部分组成:令牌的类型,即JWT,以及使用的哈希算法,如HMAC SHA256或RSA。 比如:

{
  “alg”:“HS256”,
  “typ”:“JWT”
}

将header进行Base64 编码作为JWT的第一部分。

2. Payload

这是JWT的第二部分,包含了用户的一些信息和Cliam(声明、权利),有三种类型的Cliam:保留,公开和私人声明。 一个典型的payload应该如下:

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

将payload进行Base64 编码作为JWT的第二部分。

3. Signature

要创建签名部分,需要使用到用Base64编码后header和payloader,以及秘钥,将它们签名,一个典型的格式如下: 
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT是如何使用的

来说下最常见的应用场景,即认证方面,如图所示。客户端通过用户名密码向服务器请求获取某用户的信息,包括用户一些额外信息,比如权限,这些信息经过加密以JWT形式返回。获取到该JWT的客户端,在以后的每次请求中,都需要携带该JWT,这样做的好处就是每次不需要查询数据库获取该用户的信息,在微服务这样的分布式系统中,可以实现单点登录。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术专栏

慕课网Flask高级编程实战-3.蓝图、模型与CodeFirst

应该讲一些初始化工作,放在对应层级的包的初始化文件 __init__.py 中。比如Flask核心应用app对象初始化应该放在应用层级app包的 __init_...

1302
来自专栏一个会写诗的程序员的博客

一篇文章读懂 React and redux 前端开发 -DvaJS, a lightweight and elm-style framework.快速上手Dva 概念 #例子和脚手架Dva 图解K

DvaJS: React and redux based, lightweight and elm-style framework.

673
来自专栏超然的博客

BAT 前端开发面经 —— 吐血总结

最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘,在此总结一下 一是备忘、总结提升,二是希望给大家一些参考 其他面试及基础相关可以...

1222
来自专栏QQ空间开发团队的专栏

React Native For Android 架构初探

React Native 让开发者使用 JavaScript 和 React 编写应用,利用相同的核心代码就可以创建 基于Web,iOS 和 Android 平...

1.7K0
来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 + 项目准备

REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络...

7676
来自专栏技术专栏

慕课网Flask高级编程实战-11.Python与Flask的结合应用

视图函数接受用户填写的email账号,如果不存在应该跳转到404界面,这个逻辑flask-sqlalchemy为我们提供了良好的封装,不需要手动去处理,只需要调...

1503
来自专栏一个会写诗的程序员的博客

jdk 5 到 jdk 10各个版本的新特性

3.静态导入,如:import staticjava.lang.System.out

733
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb08-XML,tomcat,HTTP轻松入门

XML&tomcat&HTTP 一.XML基础知识 1. xml介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种...

3589
来自专栏前端达人

JavaScript基础——深入学习async/await

大家好,上周我们一起学习了《JavaScript基础——Promise使用指南》, 明白了ES6增加的新特性——Promise让我们能够更加优雅的书写回调函数,...

17917
来自专栏Seebug漏洞平台

TCTF/0CTF2018 XSS Writeup

刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。

7678

扫码关注云+社区