我刚刚读到了这关于为什么JWT很糟糕的文章。我现在不确定我应该使用什么来进行身份验证。
上下文:我编写的API主要用于移动应用程序(iOS和Android)。在未来,它也将被访问通过一个反应前端。
在过去,我只是在令牌身份验证中使用DRF的构建。然后,手机只需将此令牌存储在相应的应用程序中。
现在,我被告知,这是不安全的,我应该使用JWT。在研究JWT的时候,我发现了上面的文章,其中详细阐述了为什么JWT的suck和基本会话身份验证更好。但据我所知,当作为API使用时,我不能使用DRF进行会话身份验证,是吗?
所以我的问题是?我应该使用哪些DRF工具来进行身份验证,这样它才是安全的?
发布于 2018-04-30 13:32:29
我是这篇文章的作者,也是我给出的关于为什么JWT糟糕且愚蠢的技术演讲( @joepie91 91已经雄辩地写了比我以往任何时候都更好的文章:http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/)。
考虑到您的应用程序需求(移动应用程序+只与后端API对话的JS前端应用程序),我建议您使用OpenID连接授权代码流(对于您的移动应用程序使用w/ PKCE )。
具体来说,对于您的移动应用程序,我建议使用非常棒的AppAuth库:https://appauth.io/ (它为iOS +Android都提供了很好的库)。
现在,你可能想知道为什么我会建议使用OpenID连接(也就是JWT)来做一些事情,当我如此公开地召集人们反对使用JWT的时候:我会告诉你--对于大多数事情来说,这并不重要。
事情是这样的:是的,在构建安全的应用程序时,JWT的使用非常糟糕。它们很复杂,大多数库目前还没有完整的规范,使用JWT加密等更高级的特性几乎肯定会给您带来严重的麻烦和服务之间的兼容性问题。
此外,JWT之所以变得流行于身份验证,是因为它们经常用于缓存身份验证和授权数据--在安全世界中,整个实践是一个大不可以的。
缓存敏感数据(如身份验证和授权数据)是您为安全所能做的最糟糕的事情:您信任过时的信息。目前建立在JWTs之上的所有auth系统都受到这种天真的影响。
一旦您尝试通过使用JWT来“加快”您的站点/API的速度,您就已经犯了安全错误,现在正处于危险之中。
此外,一旦人们开始使用JWT并意识到他们处于危险之中,他们就会尝试重新集中所有东西(正如另一位评论者所建议的),并开始使用吊销列表,以便在发生坏事时可以撤销令牌。这导致了与传统会话管理相同的速度惩罚,但由于JWT比会话cookie“重”,而且更脆弱,速度惩罚更大。
对不起,我的建议是:
如果您正在构建敏感内容,请尽可能使用服务器端会话cookie。否则呢?不要为细节操心,要随心所欲。
发布于 2018-04-29 11:37:59
海事组织,你有两个很好的选择:
https://security.stackexchange.com/questions/184855
复制相似问题