以前WEB网站认证方式都是基于传统的服务器session+浏览器cookie的Auth手段,近年来Web网站认证方式逐步转变为基于OAuth2等开放协议的SSO模式。其中Json Web Token(简称JWT) 成为当前热门的Token Auth 机制。 那么什么是JWT呢?JWT是一个轻量级的OAuth2规范,允许我们使用JWT在两个或多个组织之间安全可靠的传递数据。通俗的说JWT其实就是在易碎品外包了层气泡膜,保护数据不会被破坏和破解。 我们通常在网络上所看到的关于JWT讲解的文章大多是讲解的是JWS,因此导致需对人对JWT产生了误解,其实JWS并不是JWT,它只是JWT的一种实现方式。一般常见的JWT实现有JWS和JWE,下面我们来看一下什么是JWS和JWE。
JWS全称是 Json Web Signatura,是一个简单的统一表达形式的字符串。这个字符串中包含Header、Payload和Signtrue. 其中,Header用于描述JWT的基本信息,一般包含Type(类型)和alg(签名所用的算法),Header的算法必须经过Base64编码。 Payload包含5个字段,这5个字段都是由JWT定义的:
同样,Payload内容也需要经过Base64编码。 Signature这个部分的内容是Header+Payload内容,并经过加密后的字符串。加密方式则是Header中所声明的签名方式。 JWS的目的主要是保证数据在传输过程中不被修改,验证数据的完整性,但是由于使用Base64对消息进行编码,因此无法保证数据不泄露,所以一般不会用它传输敏感数据。
为了保证数据的安全性与完整性,JWE出现了。JWE包含5部分:JOSE Header、JWE Encrypied Key、Initialization Vector、Ciphertext和Authentication Tag。JWE的生成步骤如下:
从前面的5各步骤可以看出JWE的生成以及计算过程相对复杂不够轻量,因此它比较适合在数据传输上使用,不建议在token认证中使用。