【问题标题】:JWT with JDBC token store vs JSESSION ID带有 JDBC 令牌存储的 JWT 与 JSESSION ID
【发布时间】:2020-07-16 16:50:54
【问题描述】:

我已经实现了一个使用 Spring OAuth2 进行身份验证和授权的 Spring Boot 应用程序。

我正在使用 JDBC 令牌存储来管理颁发给客户端的令牌,以在应用程序运行时执行自定义声明验证和其他一些用户状态验证。

问题是,由于我使用传统的 JSESSIONID 和 CSRF 令牌,我找不到新 OAuth 标准的任何优势,因为登录后我会将用户详细信息存储在会话中,并在需要时检索它,对于 OAuth 我存储JWT 令牌本身中的用户详细信息并每次解码令牌以获取用户信息,我也需要访问数据库以进行自定义声明验证,例如 JTI 验证。

每个人都说 JWT 用于无状态应用程序,但使用 JDBC 令牌存储,我持有所有发给每个客户端的令牌。还有一个额外的开销来清除过期的令牌,这将通过 Session 自动完成。我也使用刷新令牌作为实现会话超时的方式。

因此,谁能解释一下,我应该何时使用 JSESSIONID 以及何时使用 JWT?我的应用程序在 AWS 架构上运行。

【问题讨论】:

    标签: spring-boot spring-security jwt httpsession spring-oauth2


    【解决方案1】:

    根据我的经验,基于 cookie 的身份验证使扩展和负载平衡变得非常复杂。如果您已通过第一个服务副本进行身份验证,则您的 cookie 将不适用于另一个副本,因为所有会话都存储在内存中。因此,如果您想在未来扩展您的服务,基于会话的身份验证会使事情变得更加复杂。

    【讨论】:

    • 但是如果我们使用 Spring session 将 session 存储在数据库而不是内存中,因为大多数应用程序需要 oauth 不提供的 session 超时。因为对于银行应用程序,会话超时是必须的,而且出于安全原因,它们大多不是云原生应用程序。
    • 我认为在你的情况下会话更可取。 JWT 的开发是为了在客户端维护一种“会话”。如果由于系统要求而需要将 JWT 存储在数据库中,则没有理由使用它。因此,如果您要减少使用 JDBC 会话的负载平衡问题,那将是一个很好的解决方案。
    • 顺便说一句,我在这里找到了您问题的好答案:stackoverflow.com/questions/43452896/…
    猜你喜欢
    • 2015-12-05
    • 2019-02-01
    • 2018-12-07
    • 2019-05-06
    • 1970-01-01
    • 2018-07-26
    • 2021-12-27
    • 2020-07-24
    • 2016-03-15
    相关资源
    最近更新 更多