在多个服务器实例上运行的分布式系统的JWT令牌

MyT*_*nts 2 authentication jwt

我正在使用JWT令牌来实现Rest API的安全性。

登录用户后,使用DB检查用户的凭据。

如果匹配,我们将对其加密以进一步提高安全性,然后将其传递给jwt以创建令牌

现在,为了匹配用户的令牌,我们需要将密码保留在某处,以便我们可以在用户登录后发送任何请求时匹配它们。

我们可以通过2种方式做到这一点:1.在数据库中保存详细信息,每次触发rest调用时,都要检查Database中带有Token的令牌,这对于每个rest调用来说都太昂贵了。2.在JVM的某个地方保留秘密并使用它。在这里,我尝试了HttpSession从包

javax.servlet.http.HttpServletRequest

//我的关键发布代码

// Encrypt it
    Key key = keyGenerator.generateKey(password);
    jwtToken = Jwts.builder()
            .setSubject(username)
            .setIssuer(uriInfo.getAbsolutePath().toString())
            .setIssuedAt(new Date())
            .setExpiration(toDate(LocalDateTime.now().plusMinutes(1)))
            .signWith(SignatureAlgorithm.HS512, key)
            .compact();
Run Code Online (Sandbox Code Playgroud)

//向会话添加详细信息

HttpSession httpSession = currentRequest.getSession();
httpSession.setAttribute("userSecret", password)
Run Code Online (Sandbox Code Playgroud)

这对于单个Server实例运行正常。

但是在某些时候,我们需要扩展并运行多个服务器实例。

如果用户可能使用1个实例登录并且可能使用负载平衡使用另一个实例为rest呼叫提供服务,我们将如何处理这种情况。

由于用户机密仅在第一台服务器的JVM中可用。

mrt*_*maa 6

您可以在服务器之间共享用于加密JWT的私钥。服务器收到API调用后,您可以尝试使用解密JWT private key。如果解密成功,则您具有有效的JWT,并且可以处理请求。如果解密失败,则意味着它是无效的JWT。创建JWT后,您无需访问数据库。我认为这是JWT的主要用法。我不确定你的意思userSecret