全栈项目|小书架|服务器开发-JWT 详解
JWT
文章基本是官网内容的翻译,英文不错的同学可点击上面的链接直接看英文文档。
什么是 JWT
JWT
全称是JSON Web Token(JWT)
是一个开放标准(RFC 7519)
,它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON
对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。
可以使用密钥(HMAC算法
)或使用RSA
或ECDSA
的公用/专用密钥对对JWT
进行签名。
什么时候使用 JWT 验证
- 授权
(Authorization)
这是使用JWT
的最常见情况。一旦用户登录,每个后续请求将包括JWT
,从而允许用户访问该令牌允许的路由,服务和资源。单一登录是当今广泛使用JWT
的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。 - 信息交换
(Information Exchange)
JWT
是在各方之间安全地传输信息的好方法。因为可以对JWT
进行签名(例如,使用公钥/私钥对),所以您可以确保发件人是他们所说的人。另外,由于签名是使用Header
和payload
计算的,因此您还可以验证内容是否未被篡改。
JWT 的结构格式
由三部分组成,这些部分由点.
分隔,分别是:
Header
Payload
Signature
因此,JWT
通常如下所示。
xxxxx.yyyyy.zzzzz
Header
通常由两部分组成:
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,将此JSON
通过Base64Url
编码以形成JWT
的第一部分。
Payload
令牌的第二部分是有效负载
,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。共有三种类型的索赔: registered、public、private claims
Registered claims
这些是一组预定义的权利要求,不是强制性的,而是建议使用的,以提供一组有用的可互操作的权利要求。其中一些是:iss
(发出者),exp
(到期时间),sub
(主题),aud
(受众) 等。
Tip: 请注意,声明名称仅是三个字符,因为JWT
是紧凑的。Public claims
这些可以由使用JWT
的人员随意定义。但是为避免冲突,应在IANA JSON Web
令牌注册表中定义它们,或将其定义为包含抗冲突名称空间的URI
。Private claims
这些是自定义声明,旨在在同意使用它们的各方之间共享信息,既不是注册声明也不是公共声明。
有效负载示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
同样需要Base64Url
编码,以形成JWT
的第二部分。
Signature
签名(Signature)
用于验证消息在整个过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT
的发送者是它所说的真实身份。
例如,如果要使用HMAC SHA256
算法,则将通过以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
将这三部分合并
输出是三个由.
分隔的Base64-URL
字符串,可以在HTML
和HTTP
环境中轻松传递这些字符串,与基于XML
的标准(例如SAML
)相比,它更紧凑。
下图显示了一个JWT
,它已对先前的Header
和Payload
进行了编码,并用一个Signature
。
可以在这个网页 jwt.io Debugger 验证和生成JWT
JWT 如何工作
在身份验证中,当用户使用其凭据成功登录时,将返回令牌。由于令牌是凭据,因此必须格外小心以防止安全问题。通常,令牌的有效时间不宜设置过长。
Tip: 由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器存储中。
每当用户想要访问受保护的路由或资源时,用户代理通常应在Bearer
模式中使用授权头发送JWT
。Header
的内容应如下所示:
Authorization: Bearer <token>
在某些情况下,接口访问并不需要身份授权。服务器的受保护路由将在Authorization Header
中检查JWT令牌
是否有效,如果存在且有效,则将允许用户访问受保护的资源。
如果JWT
包含必要的数据,则可以减少查询数据库中某些操作的需求。
如果令牌是在Authorization Header
中发送的,则跨域资源共享 (CORS) 不会成为问题,因为它不使用cookie
。
下图显示了如何获取JWT
并将其用于访问API或资源
:
- 应用程序或客户端向授权服务器请求授权。生产
JWT令牌
。 - 授予授权后,授权服务器会将访问令牌返回给应用程序。
- 应用程序使用访问令牌来访问受保护的资源(例如API)。
- 服务器检查
JWT令牌
是否有效,返回对应结果给客户端
下图详细的流程:
ps:请注意,使用签名令牌,令牌或令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将机密信息放入令牌中。
为什么需要 JWT
对比 Simple Web Tokens (SWT) 和Security Assertion Markup Language Tokens (SAML),看看使用JSON Web Tokens (JWT) 有什么好处。
- 由于
JSON
不如XML
冗长,因此在编码时JSON
的大小也较小,从而使JWT
比SAML
更紧凑。这使得JWT
是在HTML
和HTTP环境
中传递的不错的选择。 - 在安全方面,
SWT
只能使用HMAC算法
进行对称签名。但是JWT
和SAML令牌
可以使用X.509证书形式
的公用/专用密钥对进行签名。与签名JSON
的简单性相比,使用XML Digital Signature
签名XML
而不引入模糊的安全漏洞是非常困难的。 JSON
解析器在大多数编程语言中都很常见,因为它们直接映射到对象。相反,XML
没有自然的文档到对象映射。与SAML
断言相比,这使使用JWT
更加容易。- 关于用法,
JWT
是在Internet
规模上使用的。这强调了在多个平台(尤其是移动平台)上对JSON Web令牌
进行客户端处理的简便性。
如果您想了解有关JSON Web令牌的更多信息,甚至开始使用它们在自己的应用程序中执行身份验证,请浏览到 Auth0上的JSON Web令牌登录 页面。
咨询请加微信:轻撩即可。
全栈项目|小书架|服务器开发-JWT 详解的更多相关文章
- 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证
通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...
- 全栈项目|小书架|服务器开发-NodeJS 项目分包
唠嗑 参考的是慕课网七月老师的课程,七月的课质量真的挺高的,推荐一波.这次的小书架项目源码不会全部公开,因为用了七月老师课程的绝大部分代码.虽然代码不全,但是只要思路看得懂,代码实现就很简单了. 小书 ...
- 全栈项目|小书架|服务器开发-Koa2 全局异常处理
什么是异常 做开发的基本都知道异常,像Android开发中常见的ANR异常.空指针异常,服务器开发中经常遇到的异常404,500异常,还有一些其他常见的异常,具体可见HTTP状态码. 基本上这些异常可 ...
- 全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下
KOA2 是什么? Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 asyn ...
- 全栈项目|小书架|服务器开发-Koa2 连接MySQL数据库(Navicat+XAMPP)
为什么使用数据库 为什么需要数据库?-知乎 相比与文件系统,数据库具有以下优势: 高效率:查找效率高 高可用:可数据库共享 安全性强:数据不能随意修改 选择哪个数据库 数据库可以分为关系型数据库和非关 ...
- 全栈项目|小书架|服务器开发-Koa2 参数校验处理
为什么需要做参数校验 在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环. 例如像App的注册登录表单提交页面,就要做好多层的判断 ...
- 全栈项目|小书架|服务器开发-NodeJS 中使用 Sequelize 操作 MySQL数据库
安装 官网:https://sequelize.org/v5/manual/getting-started.html 安装sequelize及数据库连接驱动 npm install --save se ...
- 全栈项目|小书架|服务器开发-Koa全局路由实现
什么是路由 路由就是具体的访问路径,指向特定的功能模块.一个api接口是由ip(域名)+端口号+路径组成,例如 :https://www.npmjs.com/package/koa-router就是一 ...
- 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口
通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...
随机推荐
- Docker容器启动失败 Failed to start Docker Application Container Engine的解决办法
当编辑完daemon.json时,准备systemctl start docker.service启动docker时报以下错误: 网上查找的诸多方法都不行,后面看到一篇类似的文章:http://www ...
- 微信小程序发起请求
一.示例代码 wx.request({ url: 'test.php', // 仅为示例,并非真实的接口地址 data: { x: '', y: '' }, header: { 'content-ty ...
- RF页面断言
title should be(断言title与预期指定的title内容相等): should be equal (断言某个字符串与预期指定的字符串相等) should not be equal ( ...
- Jenkins构建Jmeter项目之源代码管理(SVN)
1.查看项目创建中是否又svn插件,没有的话下载插件subversion 2.配置svn源代码管理,如下图(testcases目录下包含build.xml和脚本文件) 3.查看Jenkins本地工作空 ...
- 九、Executor框架
Executor框架 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,从JDK1.5开始 ...
- MySQL常用sql语句-----数据表的查询操作
常用的sql语句如下,应对工作足以 1.查询指定字段 select c_id,c_age,c_name from t_student; select c_id as 编号,c_name as 姓名,c ...
- 学习笔记:flutter项目搭建(mac版)
什么是flutter Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的 ...
- org.thymeleaf.exceptions.TemplateInputException: Error resolving template 报错
org.thymeleaf.exceptions.TemplateInputException: Error resolving template报错 遇到二次,第一次是刚刚学的时候,都是一个原因,而 ...
- Eureka和zookeeper的比较
什么是CAP? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不 ...
- Nginx、WSGI、 uWSGI、 uwsgi的区别
当我们部署完一个应用程序,浏览网页时具体的过程是怎样的呢?首先我们得有一个 Web 服务器来处理 HTTP 协议的内容,Web 服务器获得客户端的请求,交给应用程序,应用程序处理完,返回给 Web 服 ...