JWT 介绍

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

这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

虽然JWT可以加密以提供各方之间的保密性,但我们将重点关注已签名的令牌。签名的令牌可以验证其中包含的索赔的完整性,而加密令牌隐藏来自其他方的索赔。

当令牌使用公钥/私钥对进行签名时,签名还证明只有持有私钥的方是签名方。

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

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

JWT适用场景

  • Authentication(鉴权)

    这是使用JWT最常见的情况。一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。

    单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

  • Information Exchange(信息交换):JSON Web Tokens是在各方之间安全传输信息的好方式。因为JWT可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。

    此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

JWT结构

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

  • Header

  • Payload

  • Signature

JWT结构通常如下所示:

xxxxx.yyyyy.zzzzz

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

Header

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

例如:

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

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

Payload

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

  • Registered claims(注册声明):这些是一组预先定义的声明,它们不是强制性的,但推荐使用,以提供一组有用的,可互操作的声明。其中一些是: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(私有声明):

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

Playload示例如下:

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

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

Notice:

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

Signature

第三部分signature用来验证发送请求者身份,由前两部分加密形成。
要创建签名部分,您必须采用编码标头,编码有效载荷,秘钥,标头中指定的算法并签名。

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

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

JWT实践

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

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

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

JWT工作原理

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

关于存储令牌(Token)的方式,必须考虑安全因素。
参考: #Where to Store Tokens#https://auth0.com/docs/tokens/concepts/token-storage

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

Authorization: Bearer 

这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器受保护的路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。由于JWT是独立的,所有必要的信息都在那里,减少了多次查询数据库的需求。这使得我们可以完全依赖无状态的数据API,甚至向下游服务提出请求。无论哪些域正在为API提供服务并不重要,因此不会出现跨域资源共享(CORS)的问题,因为它不使用Cookie。

Notice:

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

常见问题

① 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失效问题?

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

JWT使用建议

  • 不要存放敏感信息在Token里。

  • Payload中的exp时效不要设定太长。

  • 开启Only Http预防XSS攻击。

  • 如果担心重播攻击(replay attacks )可以增加jti(JWT ID),exp(有效时间) Claim。

  • 在你的应用程序应用层中增加黑名单机制,必要的时候可以进行Block做阻挡(这是针对掉令牌被第三方使用窃取的手动防御)。


[1] Stop using JWT for sessions:
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/

[3] Use JWT The Right Way!:
https://stormpath.com/blog/jwt-the-right-way

[2] JSON Web Token 维基百科:
https://en.wikipedia.org/wiki/JSON_Web_Token


作者:mantou叔叔

博客园文章地址:

cnblogs.com/mantoudev/p/8994341.html

  • 如何实现一个短链接服务
  • 【领导力】论理想中的技术团队
  • 基于 token 的多平台身份认证架构设计
  • 九年程序人生的技术学习之路
  • 大龄开发人员如何破局

jwt token 太长_理解 JWT 鉴权的应用场景及使用建议相关推荐

  1. jwt token 太长_养三角梅,枝条太长怎么办

    为你提供最新家居产品资讯,传递最新家居设计理念!家,我们的 三角梅又名叶子花,花瓣是三角形的,有单瓣的重瓣的,都挺漂亮的,三角梅虽然可以长成灌木状,但是它也会爬藤,因为它是一种半藤本的爬藤植物,在养三 ...

  2. 面试官:谈谈JWT鉴权的应用场景及使用建议?

    作者:mantou叔叔 || 编辑:搜云库技术团队 出处:https://dwz.cn/7bikj3yk 1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519) ...

  3. SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (三) 鉴权

    项目Github地址: https://github.com/baiye21/ShiroDemo SpringBoot 基于Shiro + Jwt + Redis的用户权限管理 (一) 简介与配置 S ...

  4. jwt token 过期刷新_如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  5. python token认证_理解JWT(JSON Web Token)认证及python实践

    最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式. 这一篇主要内容是 JWT 的认证原理,以及p ...

  6. js如何获取jwt信息_学习后端鉴权系列: 基于JWT的会话管理

    内容回顾 上一节讲了基于Cookie+Session的认证方案. Even:学习后端鉴权系列: 基于Cookie, Session认证​zhuanlan.zhihu.com 由于基于Session方案 ...

  7. jwt token 过期刷新_不要把 JWT 用作 session

    现在很多人使用 JWT 用作 session 管理,这是个糟糕的做法,下面阐述原因,有不同意见的同学欢迎讨论. 首先说明一下,JWT 有两种: 无状态的 JWT,token 中包含 session 数 ...

  8. jwt token 附加用户信息_SpringBoot+JWT实现token验证并将用户信息存储到@注解内

    springboot集成jwt实现token验证 1.引入jwt依赖 io.jsonwebtoken jjwt 0.9.0 com.auth0 java-jwt 3.9.0 2.自定义两个注解 /** ...

  9. mysql键太长_数据库,主键为何不宜太长长长长长长长长?(转)

    本文来自微信公众号 继续回答星球水友提问: 沈老师,我听网上说,MySQL数据表,在数据量比较大的情况下,主键不宜过长,是不是这样呢?这又是为什么呢? 这个问题嘛,不能一概而论: (1)如果是Inno ...

最新文章

  1. PyTorch 数据并行处理
  2. 两个音轨合并_webm格式视频文件合并+weba音频文件无损合并
  3. jquery ajax异步和同步从后天取值
  4. 24点——判断4个数能否经过运算使得结果为24
  5. SpringMVC-开启静态资源访问权限
  6. 4.Python算法之试探算法思想(回溯法)
  7. 开发商微信选房后不退认筹金_网曝!青岛恒大文化旅游城1400余名购房者欲退认筹金,开发商表示.........
  8. JVM内存管理------GC算法精解(复制算法与标记/整理算法)
  9. 企业软件介绍主页html模板
  10. 如何完成支付宝的支付功能?
  11. iPad Air PSD设计模板
  12. 【Java】环境变量配置
  13. led伏安特性实验误差分析_大学物理实验伏安特性曲线的误差分析以及小结要怎么写,谢谢^ω^...
  14. 分类--ROC 和曲线下面积
  15. 百度宣布“百度有啊”正式上线
  16. 010-flutter dart代码后台执行,没有界面的情况下
  17. Canvas 图片加载
  18. 人事管理系统实现(一)
  19. 使用EasyPoi导入导出Excel
  20. [Eigen中文文档] 切片和索引

热门文章

  1. dbms_DBMS | 并发控制
  2. ruby array_Array.select! Ruby中的示例方法
  3. css 隐藏元素 显示元素_使用CSS打印时如何隐藏元素?
  4. 20 图|Nacos 手摸手教程
  5. 当当花160买400的书,确定不囤一波?
  6. nodejs在Liunx上的部署生产方式-PM2
  7. Winform实现漂亮动画-小火车
  8. 《c程序设计语言》练习1-12
  9. ASP.NET MVC 上传图片到项目目录中的文件夹并显示
  10. 初探EntityFramework——空EF设计器模型