作者:mantou叔叔 || 编辑:搜云库技术团队

出处:https://dwz.cn/7bikj3yk

1. JWT 介绍

JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

虽然JWT可以加密以提供各方之间的保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的索赔的完整性,而加密令牌隐藏来自其他方的索赔。当令牌使用公钥/私钥对进行签名时,签名还证明只有持有私钥的方是签名方。

我们来进一步解释一些概念:

Compact(紧凑) :由于它们尺寸较小,JWT可以通过URL,POST参数或HTTP标头内发送。另外,尺寸越小意味着传输速度越快。Self-contained(自包含) :有效载荷(Playload)包含有关用户的所有必需信息,避免了多次查询数据库。

2. JWT适用场景

Authentication(鉴权) :这是使用JWT最常见的情况。一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。Information Exchange(信息交换) :JSON Web Tokens是在各方之间安全传输信息的好方式。因为JWT可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

3. JWT结构

在紧凑的形式中,JWT包含三个由点(.)分隔的部分,它们分别是:

  • Header

  • Payload

  • Signature

JWT结构通常如下所示:

  1. xxxxx.yyyyy.zzzzz

下面我们分别来介绍这三个部分:

Header

Header通常由两部分组成:令牌的类型,即JWT。和常用的散列算法,如HMAC SHA256或RSA。

例如:

  1. {

  2.  "alg": "HS256",

  3.  "typ": "JWT"

  4. }

Header部分的JSON被Base64Url编码,形成JWT的第一部分。

Payload

这里放声明内容,可以说就是存放沟通讯息的地方,在定义上有3种声明(Claims):

Registered claims(注册声明):

  1. 这些是一组预先定义的声明,它们不是强制性的,但推荐使用,以提供一组有用的,可互操作的声明。其中一些是:`iss` (发行者), `exp` (到期时间), `sub` (主题), `aud` (受众)等。[#Registered Claim Names#](https://tools.ietf.org/html/rfc7519#section-4.1)

Public claims(公开声明) : 这些可以由使用JWT的人员随意定义。但为避免冲突,应在IANA JSON Web令牌注册表中定义它们,或将其定义为包含防冲突命名空间的URI。Private claims(私有声明):

  1. 这些是为了同意使用它们但是既没有登记,也没有公开声明的各方之间共享信息,而创建的定制声明。

Playload示例如下:

  1. {

  2.  "sub": "1234567890",

  3.  "name": "John Doe",

  4.  "admin": true

  5. }

Playload部分的JSON被Base64Url编码,形成JWT的第二部分。

Notice:

请注意,对于已签名的令牌,此信息尽管受到篡改保护,但任何人都可以阅读。除非加密,否则不要将秘密信息放在JWT的有效内容或标题元素中。这也是很多文章争论jwt安全性原因,不要用 JWT 取代 Server-side 的 Session状态机制。详情请阅读这篇文章:Stop Using Jwt For Sessions .

Signature

第三部分signature用来验证发送请求者身份,由前两部分加密形成。

要创建签名部分,您必须采用编码标头,编码有效载荷,秘钥,标头中指定的算法并签名。

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

  1. HMACSHA256(

  2.  base64UrlEncode(header) + "." +

  3.  base64UrlEncode(payload),

  4.  secret)

3. JWT实践

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

以下JWT示例,它具有先前的标头和有效负载编码,并且使用秘钥进行签名。

我们可以使用jwt.io调试器来解码,验证和生成JWT:

4.JWT工作原理

在身份验证中,当用户使用他们的凭证成功登录时,JSON Web Token将被返回并且必须保存在本地(通常在本地存储中,但也可以使用Cookie),而不是在传统方法中创建会话 服务器并返回一个cookie。

关于存储令牌(Token)的方式,必须考虑安全因素。

参考:#Where to Store Tokens#

无论何时用户想要访问受保护的路由或资源,用户代理都应使用承载方案发送JWT,通常在请求头中的 Authorization字段,使用 Bearer schema:

  1. Authorization: Bearer <token>

这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器受保护的路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。由于JWT是独立的,所有必要的信息都在那里,减少了多次查询数据库的需求。

这使得我们可以完全依赖无状态的数据API,甚至向下游服务提出请求。无论哪些域正在为API提供服务并不重要,因此不会出现跨域资源共享(CORS)的问题,因为它不使用Cookie。

Notice:

请注意,使用已签名的令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改它。在JWT中,不应该在Playload里面加入任何敏感的数据,比如像密码这样的内容。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。

5. 常见问题

JWT 安全吗?

Base64编码方式是可逆的,也就是透过编码后发放的Token内容是可以被解析的。一般而言,我们都不建议在有效载荷内放敏感讯息,比如使用者的密码。

JWT Payload 內容可以被伪造吗?

JWT其中的一个组成内容为Signature,可以防止通过Base64可逆方法回推有效载荷内容并将其修改。因为Signature是经由Header跟Payload一起Base64组成的。

如果我的 Cookie 被窃取了,那不就表示第三方可以做 CSRF 攻击?

是的,Cookie丢失,就表示身份就可以被伪造。故官方建议的使用方式是存放在LocalStorage中,并放在请求头中发送。

空间及长度问题?

JWT Token通常长度不会太小,特别是Stateless JWT Token,把所有的数据都编在Token里,很快的就会超过Cookie的大小(4K)或者是URL长度限制。

Token失效问题?

1、无状态JWT令牌(Stateless JWT Token)发放出去之后,不能通过服务器端让令牌失效,必须等到过期时间过才会失去效用。2、假设在这之间Token被拦截,或者有权限管理身份的差异造成授权Scope修改,都不能阻止发出去的Token失效并要求使用者重新请求新的Token。

6. JWT使用建议

1、不要存放敏感信息在Token里。2、Payload中的 exp 时效不要设定太长。3、开启 OnlyHttp 预防XSS攻击。4、如果担心重播攻击(replay attacks )可以增加 jti (JWT ID), exp (有效时间) Claim。5、在你的应用程序应用层中增加黑名单机制,必要的时候可以进行Block做阻挡(这是针对掉令牌被第三方使用窃取的手动防御)。

长按二维码 ▲

关注「架构师小秘圈」公众号

如有启发,点个在看↓

面试官:谈谈JWT鉴权的应用场景及使用建议?相关推荐

  1. jwt token 太长_理解 JWT 鉴权的应用场景及使用建议

    JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象 ...

  2. ASP.Net Core实战——身份认证(JWT鉴权)

    踩坑不背锅,.NET Core 试深浅 关于鉴权认证 什么是鉴权认证 常见鉴权方式 关于JWT认证 JWT认证流程 JWT组成 JWT实践 关于鉴权认证 什么是鉴权认证 鉴权(authenticati ...

  3. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  4. jwt鉴权(react express jsonwebtoken)

    此文记录jwt鉴权(react express jsonwebtoken)思路流程 整个项目可以在https://github.com/furfur-jiang/DevConnector处查看,欢迎s ...

  5. go语言 | jwt鉴权初涉

    各自努力,最高处见!加油! jwt鉴权初涉 一.JWT的工作流程 二.如何使用JWT 目录设计 1.设计路由 2.生成与解析JWT 3.token验证的中间件 4.路由处理逻辑 5.userInfo ...

  6. Go语言使用golang-jwt/jwt/v4进行JWT鉴权

    文章目录 1.什么是JWT 2.JWT的数据结构 2.1 Header 2.2 Payload 2.3 Signature 2.4 Base64URL 3使用JWT 安装 生成Token 参考: 最近 ...

  7. 面试官:谈谈分库分表吧?

    面试官:"有并发的经验没?"  应聘者:"有一点."   面试官:"那你们为了处理并发,做了哪些优化?"   应聘者:"前后端分离 ...

  8. 前后端交互 - JWT鉴权到底是何方神圣

    JWT鉴权 JWT全称 JSON Web Token,是一套开放的标准(RFC 7519),它定义了一种紧凑且自URL安全的方式,以JSON对象的方式在各方之间安全地进行信息传输. 使用密钥 ( se ...

  9. 微服务网关鉴权:gateway使用、网关限流使用、用户密码加密、JWT鉴权

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

最新文章

  1. 浅聊程序化世界构建流程
  2. 牛客网_PAT乙级_1019旧键盘 (20)
  3. 内建模块_月隐学python第14课
  4. Delphi-IOCP学习笔记三====工作线程和Listener
  5. 机器学习入门系列(1)--机器学习概览
  6. Java语言用于定义接口的关键字是_定义类的保留字是(__)定义接口的保留字是(__);...
  7. python编程求极限_Sympy笔记一
  8. NCB|心咽发育多样化的单细胞转录轨迹分析
  9. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)C. Voltage Keepsake
  10. [转帖]jQuery框架学习第四天:使用jQuery操作元素的属性与样式
  11. 20165221 JAVA第四周学习心得
  12. L3_08——图中所有边都是相等的常数
  13. 大数据的Java/Hbase+C云平台开发技术 课程
  14. MPQ4420HGJ DCDC电源设计+SIMetrix+Spice仿真模型
  15. 【项目实战】Python基于Apriori关联规则算法实现商品零售购物篮分析
  16. python爬虫实现大麦抢票_爬虫 大麦网
  17. linux压缩文件命令_Linux 系统压缩和解压 zip 格式文件
  18. 2021年焊工(初级)考试资料及焊工(初级)新版试题
  19. js实现每次调用一个函数自动加1
  20. 数学基础 - 第十八章 平行四边形

热门文章

  1. codeblocks安装及使用教程(手把手傻瓜式教学)
  2. P1160 队列安排
  3. 使用Teams接收Azure服务运行状况通知
  4. ES6精华:字符串扩展
  5. 易点租加速电脑租赁市场布局
  6. jenkins搭建cc++自动化构建
  7. 模块化的 Windows 7
  8. 《中国人工智能学会通讯》——11.52 基于直推式学习的异质人脸图像 合成
  9. 工作中用不到的技术要不要学?
  10. 《少有人走的路:心智成熟的旅程》--[美]M·斯科特·派克