#51CTO学院四周年#详解JWT的结构与应用

1. JWT是什么?

JWT,全称JSON WEB TOKEN, 是WEB客户端与服务器之间相互进行安全通信的规范。通信双方的对象本身通过JSON传递数据是不安全的,但是由于有了数字签名的存在,这些信息变的可信的。

2. JWT特点

  • 简洁(Compact): 可以通过URL,POST参数或者在HTTP header发送,因为数据量小,传输速度也很快
  • 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库

3. JWT的应用场景

身份认证:当用户在客户端完成登录后,可以在每个请求中包含JWT,可以验证身份和路由,对服务资源和权限进行验证。由于JWT非常小,可以在不同域名之间传递,因此在单点登录SSO中应用很广泛。

信息交互:由于JWT的信息是经常签名的,因此通信双方通过JWT交换数据是安全并没有进行过篡改的。

4. JWT的结构

JWT由头部(Header),负载(Payload)和签名(Signiture)三部分组成。各部分之间用“.”分开。所以JWT的结构是xxx.yyy.zzz这样的。

头部


头部部分由两部分组成:一部分是协议的类型,即JWT;另一部分是哈希算法,如HMAC SHA256或者RSA。

头部示例

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

对头部进行BASE64URL位编码构成了JWT的第一部分。

负载

负载部分是由实体状态和自定义元数据组成的变量。变量类型可以是保留类型、公开类型或者私有类型。

保留类型变量:定义了一组有用的,彼此协作的变量,虽然不是必须的,但推荐使用。 保留类型变量:iss(发起者issuer),exp(过期时间 expiration time), sub(会话主题subject), aud(接收方audience)等。

公共类型变量:可以随意定义,但为避免冲突,最好加上命名空间。

私有变量:自定义的通信双方进行交换数据。

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

负载部分也是进行Base64Url编码组成JWT的第二部分。

签名


对头部和负载进行Base64Url加密后,然后加上密钥,然后使用Header中指定的哈希算法加密,得到的是Header中的签名。

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

签名的主要作用是识别发信人的内容,防止内容在分发过程中被篡改。

JWT的最终内容

将上面三个Base64Url编码的字符串用“.”组合起来就是最终的JWT内容。由于JWT内容很小,它在HTTP和HTML很容易传递。

5. JWT工作流程

在身份认证过程中,当用户使用认证信息(用户名+密码)通过认证后,传统的方式是在服务器端创建session,然后返回给cookie信息给客户端。JWT认证过程则是会返回一个Token信息,然后存储在本地(可以使用local storage,也可以使用cookies)。

后续在客户端与服务器进行交互时,客户端以Bearer语法将Token信息保存到header中发送给服务器,服务端取得token信息后,进行身份认证判断客户端是否有权限访问路由和资源。

Authorization: Bearer <token>

由于用户状态并不会保存在服务器内存中,因此这是一种无状态的身份认证机制。服务端通过检测请求头部中JWT信息来保护路由。如果JWT信息合法,服务器就允许访问被保护的资源。由于JWT信息是自包含的,因此可减少查询数据库的次数。

JWT的特性使得我们可以很好的提供无状态的API服务,而且它解决了跨域访问的问题,因为它不会使用cookies。

6. 为什么使用JWT(VS Simple Web Token & Security Assertion Markup Language Tokens)

相比XML格式,JSON更加简洁,编码之后更小,这使得JWT比SAML更加简洁,更加适合在HTML和HTTP环境中传递。

在安全性方面,SWT只能够使用HMAC算法和共享的对称秘钥进行签名,而JWT和SAML token则可以使用X.509认证的公私秘钥对进行签名。与简单的JSON相比,XML和XML数字签名会引入复杂的安全漏洞。

因为JSON可以直接映射为对象,在大多数编程语言中都提供了JSON解析器,而XML则没有这么自然的文档-对象映射关系,这就使得使用JWT比SAML更方便。

总结:JWT是一种规范,而非一种技术。JWT很好的解决了跨域访问时的身份认证问题,也解决了无状态的RESTful规范请求过程中身份认证问题。也正是有了JWT,让基于JSON请求的Web开发能够更好的进行前后端分离,让前端的技术人员更好的钻研前端技术。

结束语:值此【51CTO学院四周年】之际,祝51CTO学院越来越好,课程越来越赞,学员越来越多。

时间: 2024-10-14 11:21:33

#51CTO学院四周年#详解JWT的结构与应用的相关文章

51CTO学院四周年课程分享:Oracle数据库课程优惠活动清单1.0

        51CTO学院四周年活动(7月1日-7月7日)       Oracle数据库课程优惠活动清单(1年只有1次)  微职位优惠2000+.视频单课原价6折.视频套餐折上8折 活动预约QQ:176140749(风哥);   学习交流QQ群:199479729.158277749 推荐活动一:Oracle 云数据库高级工程师微职位(九大阶段.高薪就业.辅导培训) --立减2000元+ 活动地址 http://edu.51cto.com/px/train/131?xiaotu 课程试听

#51CTO学院四周年#其实、其实,我就是来吐槽的”

51CTO学院四周年啦!51CTO学院四周年啦!51CTO学院四周年啦! (重要的事情要说三遍)一大波的"福利"正向我涌来!哈哈.哈哈~~ 为了这些"福利",文采小白的我也是拼了.经过几天的深思熟虑,最终我还是决定吐槽下我与51CTO学院之间不得不说的几件事情吧.(我怎么感觉"吐槽"二字会让学院博主误会我是猴子派来的~~) 吐槽点之一:与 "君"相识 大学一毕业就来到现在的公司工作,至今也快四个年头了(我发誓绝对不是冒充学院的

#51CTO学院四周年# 终于在这里遇到你

#51CTO学院四周年# 终于在这里遇到你 初次认识软考是在2016年通过中级经济师考试之后,无意中了解到截止目前全国唯一以考代评的高级职称,也是最快速取得高级职称的途径--软考.随后查阅各种资料了解到软考报名条件.考试科目及准备参加报培训班学习的课程后,逐渐对软考有大概了解.在这个过程当中,最纠结的事情,要数选择拟参加学习的培训班啦!试听了无数课程,均没有动心下决定报班. 为何会对报班精挑细选,本人认为选择一个好的培训班,对于全职上班且还要带娃参加考试的我来说是何等重要.选对了好的培训班,会增

#51CTO学院四周年#从程序猿到攻城狮的转变

#51CTO学院四周年#一名大学生在51CTO学院的心路历程 我是来自一名即将实习的大学生,这个学期开学的时候,我就意识到,这学期该出去实习啦,该出去实习啦,该出去实习啦.可身为软件开发的编程狗,真心不喜欢一天到晚脑袋想着算法,手上敲着代码的日子.各位程序猿别喷我,我是属于性子太活,真心的对代码不感兴趣,兴趣是最大的老师,但我不否认代码的魅力所在,我第一次用C做出个计算器,晚上还高兴的多吃啦半碗饭,但时间一长就不行啦. 好啦,言归正传,我不想出去干代码,可我能干什么那.我一直对硬件,以及网络方面

#51CTO学院四周年#从关注到学习,在到改变

#51CTO学院四周年#从关注到学习,再到改变 时至今日,51CTO学院开班已经四周年了,首先祝福51CTO学院生日快乐.开始关注51CTO这个网址的时候大概是在09年左右,因为参加培训班需要在网络上面找一些相关的资料,无意间搜索到了这个网址,并且开始关注.真正进入学院其实还是在13年的时候,因为当时从朋友那里接触到了韩立刚老师的视频,觉得很不错,也很实用,于是乎通过各种方法联系到韩丽刚老师且成为了他的学生,在后来他成为了51CTO的老师,我也由此正式成为了51CTO学院的学生了,从Window

#51CTO学院四周年# 51CTO与我的大学生活

不知不觉已经与51CTO相伴将近两年了,最初接触这个优秀的软件是因为想要考计算机二级,我在软件上学到了很多知识,帮助我过了office二级(附件是我的二级证书).我真的很开心,也很感谢这个学习平台. 我2015年秋季步入大学生活,曾经很憧憬的大学生活却没有实现,大家很少有高中时的斗志,而是都陷于娱乐.但是我不一样,进入一个大城市让我看到了我与身边同学的差距.我是一个来自农村的孩子,没有见过大世面,除了学习外我其他方面的能力很差.大一上学期我浑浑噩噩的过去了.我有一门课时计算机基础,我考得很差,7

#51CTO学院四周年# 我与学院有个约会

在浩瀚的宇宙中,我们是多么的渺小的存在,却不甘平平无所作为,无论多渺小,也要做一个发着微光的小小星辰. 我曾经是个高考落榜生,高考无望大学时,我踏进了社会,曾有过想当一名黑客,当基于没有找的学习的方法,那一点星星之火也悄然熄灭.爱好IT的我,就抱着希望成为IT领域高手在社会徘徊了好几年,当现实支撑不是理想,现实就支配着理想,另他抬不起头.当我渐渐地对IT这方面失去了 信心得时候,一份机遇,让我遇见了他--51CTO. 我来到51CTO不久,就那么一年多,这里却给我带来了希望! 曾经想在IT中努力

51CTO学院四周年优秀讲师评选中,需要您的宝贵一票

51CTO学院四周年优秀讲师评选中,需要您的宝贵一票 投票地址: http://edu.51cto.com/lecturer/350944.html 

#51CTO学院四周年#感谢有你,一路相伴

初次相识51cto从2010年说起,那时候毕业没有多久,工作也不如意.浑浑噩噩度过了4年大学时光,让我找不到称心如意的工作.思虑再三,决定工作之余自学计算机技术.一次在工作中遇到了问题,百度过程中突然打开了51cto的网站,感觉眼前一亮,看完博文感觉写的很有深度,很快我的问题就解决了.我就想何不自己也注册一个帐号,有时间就上来看看,最新的技术动向和精彩的博文. 就这样51cto陪伴我度过了最孤独的一段时期. 每天都按时登录网站,积累下载豆,因为下载技术文档是要下载豆的.看文字的东西是枯燥的,但每