我正在制作SPA,并决定使用JWT进行身份验证/授权,并且我读了一些有关令牌与Cookie的博客。我了解Cookie授权的工作原理,并了解基本令牌授权的工作原理。问题是,我看不到刷新令牌如何适合它,对我而言似乎降低了安全性。让我来解释一下,
通过用户名和密码对用户进行身份验证时,您将创建与该用户关联的会话ID。并将其设置为cookie,每次客户端调用您的服务器时,它将发送该cookie,然后服务器可以在数据库或其他服务器端存储中查找关联的用户。
这种方法容易受到CSRF(跨站点请求伪造)的影响。为了防止CSRF,您可以将令牌与cookie一起使用
服务器还需要不断查找存储以查看Cookie指向的用户。
当您通过用户名和密码对用户进行身份验证时,您将创建一个签名的令牌,并在有效载荷中带有到期日期,电子邮件地址或用户ID,角色等。为了安全起见,令牌应具有较短的到期时间。令牌可以存储在本地存储,会话存储,cookie的任何位置。我将使用本地存储或会话存储来防止XSRF。
因此,我想使用刷新令牌来防止用户需要不断登录。因此,可以说在身份验证上,我给了用户访问令牌和刷新令牌,当用户访问令牌过期时,用户可以使用刷新令牌来获取新访问令牌,这是我没有得到的。 >
目前我正在考虑使用:
让我们说它看起来像这样:
+--------+ +---------------+
| |------------ Authorization Grant --------->| |
| | | |
| |<--------------- Access Token -------------| |
| | & Refresh Token (cookie) | |
| | & XSRF Token | |
| | | |
| | | |
| |--------- Access Token ------------------->| |
| | | |
| |<----- Protected Resource -----------------| |
| Client | | Server |
| |--------- Access Token ------------------->| |
| | | |
| |<----- Invalid Token Error ----------------| |
| | | |
| | | |
| |---------------- Refresh Token ----------->| |
| | & XSRF Token | |
| | | |
| |<--------------- Access Token -------------| |
| | & XSRF Token | |
+--------+ & Optional Refresh Token +---------------+
每次使用刷新令牌时,服务器都会发行新的XSRF令牌(使用了一个XSRF令牌后,它将停止工作,服务器会发行新的XSRF令牌)。 您对该实现有何看法?在我看来,这限制了服务器对数据库的查找,因为它使用访问令牌,访问令牌的寿命很短,并且由于使用刷新令牌,用户不必经常登录/ cookie女巫受XSRF令牌保护。
可以吗?
谢谢!
答案 0 :(得分:1)
将访问令牌视为“脏”令牌。令牌共享很多。我不必是将令牌传递到的一台服务器,可以很多。因此,攻击面上升。如果一台服务器做一些愚蠢的事情,例如将令牌写入服务器日志,然后再将日志公开,那么您想限制负面影响,因此访问令牌的寿命很短,以限制攻击者执行恶意操作的时间。>
另一方面,刷新令牌是“干净”令牌。您存储的东西可以记住并仅在必要时使用。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权,那么它就结束了。但是在这里,我们试图保护免受远程攻击者的攻击。仅当与身份验证服务器或身份验证端点对话时,才应使用刷新令牌。如果您决定将其设置为cookie,则可以-只需记住将目录路径限制为仅将令牌传递到REST端点即可。
在我看来不错。也许我不会为了节省精力而实现XSRF令牌。我的意思是,如果有人尝试对CSRF进行攻击,最糟糕的事情是什么?他也许能够使您刷新令牌。但是令牌不会仅由于CSRF而暴露给攻击者。
我喜欢你的问题。真的写得很好! :)