#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。


头部示例

1
"alg""HS256""typ""JWT"}


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


负载


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


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


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


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


1
"sub""1234567890""name""John Doe""admin"true}


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


签名


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


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


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


JWT的最终内容


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


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

5. JWT工作流程


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


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


1
Authorization: Bearer <token>


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


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


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


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开发能够更好的进行前后端分离,让前端的技术人员更好的钻研前端技术。






本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1944480,如需转载请自行联系原作者