首先,为了消除歧义,解释一下JWT。JSON WEB Token,是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。
我在开发中想通过使用JWT鉴权来缓解一下服务器压力。思路是服务器不存储或缓存sessionId或是token,不用频繁的进行数据库查询或缓存查询。
百度了一下JWT,很多文章是不推荐使用JWT的。如https://www.jianshu.com/p/af8360b83a9f等等。
原因大概有以下几个:
1.更多的空间占用
作者“主张“”将用户相关信息存入token中以方便后续操作。由此产生两个问题。
-
-
-
- 1.JWT占用的空间变大,无法存储到Cookie
- 2.存放在LocalStorage中如果受到XSS攻击会产生巨大的安全隐患
-
-
乍一看很有道理,看了评论区之后恍然大悟。针对这一条评价我的观点是。首先,JWT是一个鉴权标准,目的是为了鉴别来访请求的身份,并没有要存储过多的用户信息到JWT串中,由此也不会产生JWT占用空间过大,无法存储到Cookie中利用HttpOnly的属性来防止XSS攻击,从而不得不使用LocalStorage等方法存储JWT串。另外,即使存放在LocalStorage中,产生安全隐患的前提也是作者假定程序中没有做XSS攻击的防护。在此前提下,即使不使用JWT,使用简单的服务器端缓存token和cookie-session也存在着相同的安全隐患。这是一个由偷懒产生问题,并不是JWT的一个缺点。
2.更不安全
作者“主张”将敏感信息保存到客户端(浏览器,移动端)。这条评价的前提同样是建立在程序没有做XSS防护。退一步讲,假设现在还没有XSS防护这个概念,安全性上来说,敏感信息不应该保存到客户端中。按这种说法来讲,即使程序安全系统做的滴水不漏,用户电脑中病毒导致个人信息泄露,也是JWT的缺点,因为JWT没能“防止用户电脑中病毒”。我认为这应该归为设计缺陷 。
3.token发出后无法更改
Oauth的定义是:
Because the token can be verified without doing a database lookup, there is no way to invalidate a token until it expires. You’ll need to take additional steps to invalidate tokens that are self-encoded
翻译为:
因为可以在不进行数据库查找的情况下验证令牌,所以在令牌过期之前无法使令牌无效。 您需要采取其他步骤来使自编码的令牌无效。
对此oauth提供了Refresh token,也不能称之为一个问题吧。
总的来说,我认为JWT是一个安全性比较强的鉴权标准/方式。