码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-04 23:19:18      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:json   升职啦   技能   

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学院越来越好,课程越来越赞,学员越来越多。




本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1944480

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

标签:json   升职啦   技能   

原文地址:http://favccxx.blog.51cto.com/2890523/1944480

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!