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