Rest 注销无状态应用程序

Rest 注销无状态应用程序,rest,security,stateless,Rest,Security,Stateless,下面是我的项目结构 UI:AngularJS应用程序 后端:Java+MongoDB无状态应用程序 UI对给定用户进行身份验证,RESTAPI使用JWT令牌进行响应。对于每个后续请求,RESTAPI都希望在头中包含令牌,如果没有令牌,则返回未经验证的错误 现在,实现注销功能的最佳方法是什么?有一点很清楚,我将从UI cookie中删除令牌。但我需要告诉服务器,用户已注销 我想维护一个内存中的数据库来跟踪谁登录,并在用户注销后将其从内存中删除,但这会使应用程序有某种状态(我猜)。此外,扩展应用

下面是我的项目结构

  • UI:AngularJS应用程序
  • 后端:Java+MongoDB无状态应用程序
UI对给定用户进行身份验证,RESTAPI使用JWT令牌进行响应。对于每个后续请求,RESTAPI都希望在头中包含令牌,如果没有令牌,则返回
未经验证的
错误

现在,实现
注销
功能的最佳方法是什么?有一点很清楚,我将从UI cookie中删除令牌。但我需要告诉服务器,用户已注销

我想维护一个内存中的数据库来跟踪谁登录,并在用户注销后将其从内存中删除,但这会使应用程序有某种状态(我猜)。此外,扩展应用程序可能会变得复杂,因为我必须在所有节点上复制内存中的用户


对于每个REST调用,我都从MongoDB获取用户详细信息。使用数据库存储登录状态是否有意义?我只是想大声说出来。因为我不知道该往哪个方向走

如果您使用JWT在客户端维护会话,那么服务器应该没有登录和注销用户的概念

这是您决定使用JWT所支付的价格(当然,这可能很好,取决于您对应用程序的风险偏好)


如果您希望将用户从服务器端注销,那么应该放弃JWT模型并在服务器端记录会话。这样,您可以在注销时删除服务器端记录和cookie。

如果您使用JWT在客户端维护会话,那么服务器不应该有登录和注销用户的概念

这是您决定使用JWT所支付的价格(当然,这可能很好,取决于您对应用程序的风险偏好)


如果您希望将用户从服务器端注销,那么应该放弃JWT模型并在服务器端记录会话。这样,您可以在注销时删除服务器端记录和cookie。

“但我需要告诉服务器用户已注销。”为什么?无论如何,只需创建一个从后端删除令牌的注销端点。为什么这样服务器就会知道任何后续请求都需要登录凭据。正如我提到的,如果我不这样做,并且令牌被某个人偷走,即使客户端已经注销,他们也可以继续发送请求。仅仅做一个注销端点就会引起我在最后第二段中提到的问题,即可伸缩性。我认为在数据库中存储登录状态与从数据库中删除无效令牌“以便服务器知道任何后续请求都需要登录凭据”之间没有任何性能差异-我不认为您理解“无状态”受限端点(需要特定的权限/访问级别)应该始终需要登录凭据,“但我需要告诉服务器用户已注销”。为什么?无论如何,只需创建一个从后端删除令牌的注销端点。为什么这样服务器就会知道任何后续请求都需要登录凭据。正如我提到的,如果我不这样做,并且令牌被某个人偷走,即使客户端已经注销,他们也可以继续发送请求。仅仅做一个注销端点就会引起我在最后第二段中提到的问题,即可伸缩性。我认为在数据库中存储登录状态与从数据库中删除无效令牌“以便服务器知道任何后续请求都需要登录凭据”之间没有任何性能差异-我不认为“无状态”受限端点(需要特定权限/访问级别)应该始终需要登录凭据