JWT即JSON WEB TOKEN的缩写,轻量级的令牌认证(相比于oauth),可用于数据交换间的安全传输,同时可以使用公钥/私钥的非对称算法对信息进行数字签名,如RS256算法。javascript
它由3部分组成:php
3部分的所包含的内容及详细组成网上已不少,这里再也不啰嗦,咱们只对jwt实际使用过程的注意事项及坑作下分享,但愿后来者能够更好的使用jwt。 html
【一】项目实践中须要注意一下几点: 前端
一、因为palyload部分的实际数据可很容易被解出,因此在实际应用中,切记不可在其中传输敏感数据,如密码、秘钥等信息,jwt能作到的主要是防止数据被篡改。java
二、非对称算法,如RS256皆是服务于签名,即Signature部分,目的就是为了让服务器能够很明确的知道收到的数据是否合法,所以在客户端去作此jwt生成过程是不明智的,容易将密钥公之于众,这样也就失去了jwt防篡改功能。(有一点想不明白的是,若是使用非对称算法,那么公钥理论能够公开,这时候如何保证数据的合法性??咱们目前使用的是HS256算法,只有一个密钥且不可公开)node
三、jwt涉及base64及加密处理,因此会使传输的数据会比裸传数据大不少,这个须要根据实际状况评估并作好平衡git
【二】 可能的使用场景:github
一、单点登陆,此场景也是使用最广的一种,流程原理很简单:算法
用户登陆成功-》生成token返回前端并保存(cookie或localstorage)-》以后每次请求在header或body中带此token-》服务器验证此token以保证数据合法性segmentfault
如下引用jwt官网的一张图,可大概说明以上jwt过程:
此场景应用相比于cookie直接保存登陆信息,可有效防止CSRF攻击(原理可见:https://segmentfault.com/a/1190000003716037),
CSRF (Cross Site Request Forgery),它讲的是你在一个浏览器中打开了两个标签页,其中一个页面经过窃取另外一个页面的 cookie 来发送伪造的请求,由于 cookie 是随着请求自动发送到服务端的。
二、与第三方接口的数据传输,在处理对外接口时(特别是公司以外业务)可很方便的做为一个约定,可很好的减小因为数据安全性问题所要作的沟通工做。
但因为jwt涉及base64及加密处理,因此会使传输的数据会比裸传数据大不少,这方面你们能够根据实际状况作平衡取舍。对于公司内部的项目及对传输数据量有极高要求的更要慎重考虑用jwt方式;对于这种状况,咱们目前的处理方式是模仿jwt,但使用内部约定的签名方式对数据进行数字签名,以达到目的。
【三】JWT、JWS、JWE区别(网上摘录)
一开始很迷茫于这几个缩写的区别,应该不少人跟我有一样迷茫,特地查了下,
一、3个的全拼:JWT(JSON Web Tokens)、JWS(JSON Web Signature)、JWE(JSON Web Encryption)
二、关于JWT,可参考RFC7519(https://tools.ietf.org/html/rfc7519)的描述:
JSON Web Token (JWT) 是一个间接地、URL安全的,表现为一组声明,能够在双方之间进行传输。一个JWT的声明,是指通过编码后的一个JSON对象,这个JSON对象能够是一个JSON Web Signature(JWS)结构的荷载(payload),或者是一个JSON Web Encryption(JWE)结构的明文。容许使用声明进行数字签名,或者经过一个Message Authentication Code(MAC)进行完整性保护可选择是否加密。
即,一组JWT声明(JSON格式的Claims)被经过JWS结构或JWE结构发送。JWS和JWE其实是一个荷载,JWT则是一种基于荷载的实际实现。
三、JWS,对内容进行数字化签名
四、JWE,对内容进行加密,而不是签名,JWT声明会被加密码,所以带来了内容的保密性。JWE能够被签名并附在JWS里。这样的话就能够同时加密和签名。
五、对于客户端,分辨JWS或JWE
JWS的Header与JWE的Header是不一样的,能够经过检查“alg”Header参数的值来区分。若是这个值表现为一个数字签名或者MAC的算法,或者是”none“,则它是一个JWS。
若是它表现为一个 Key Encryption, Key Wrapping, Direct Key Agreement, Key Agreement with Key Wrapping, or Direct Encryption algorithm。则它是一个JWE。
还能够经过Header里的“enc”(encryption algorithm)是否存在来判断,若是"enc"这个成员存在的话说明是JWE,不然的话就是JWS.
附,如下我整理了下开发过程用到的jwt包:
在线debuger及各类语言lib包:https://jwt.io/
php包:https://github.com/psecio/jwt
javascript/nodejs包:https://kjur.github.com/jsrsasign