在基于令牌的身份验证和单页应用程序中注销

Posted

技术标签:

【中文标题】在基于令牌的身份验证和单页应用程序中注销【英文标题】:Logout in token-based authentication and Single page application 【发布时间】:2017-10-03 14:17:16 【问题描述】:

我正在为我的 Spring Boot 应用程序使用 JWT 身份验证。前端将是一个单页应用程序。

我应该在服务器端处理注销功能吗?据我了解,除非我们有一个有状态的服务器(在令牌的最长生命周期内存储注销的令牌),否则无法使 JWT 令牌失效。

SPA 每次发出请求时都会在其 header 中传递 JWT 令牌,当用户访问/logout 时,它可以将其从 localStorage 中删除,而无需调用服务器。

有哪些潜在问题?这个想法是否在其他地方使用过?最佳做法是什么?

【问题讨论】:

看到这个答案:***.com/questions/39238543/log-out-a-stateless-app. 【参考方案1】:

首先你必须决定你是否想要一个有状态的服务器。

有状态的服务器

这很容易。只需向服务器发送注销请求并丢弃会话即可。而已。这是最安全的方法。

无状态服务器

我喜欢无状态服务器,因为您不必管理状态。但当然,你有一个权衡。在这种情况下,安全性。 没有退出方式,因为您没有可以在服务器端使会话无效的会话。

因此,强化您的 JWT 令牌的攻击者可以使用会话直到它结束,并且没有什么可以阻止这种情况发生。

但是你可以做一些事情来避免攻击者获得 JWT 令牌。以下是您可以做的一些事情,并且您已经做对了

    不要使用 cookie 发送令牌。你这样做的方式是完美的。使用标题。这是 SSL 加密的,Single-page-app 必须故意发送。 在 JWT-Token 中加入时间戳,使其在一段时间后自行失效。但请注意时区和时钟等效果不同步。 将一些浏览器指纹信息放入令牌中,例如操作系统或浏览器版本。这样,攻击者也不得不假装。

但这些机制都让攻击者更难。无法进行真正的注销。

注意

如果您正确使用 JWT,您的服务器将具有“状态”。您必须定义一个在所有服务器上都相同的秘密。如果您使用多个服务器,则必须注意这一点。

【讨论】:

以上是关于在基于令牌的身份验证和单页应用程序中注销的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 和单页应用程序

使用 Play 2 框架的基于令牌的身份验证

使用 Laravel 作为后端刷新 Vue.js SPA 的身份验证令牌

SPA 的 Cookie 与基于令牌的身份验证?

一起使用不记名令牌和 cookie 身份验证

如何从 facebook/google/... oauth2 身份验证在 Spring (Boot) 中为单页应用程序派生自定义登录令牌?