Security JWT&;OAuth2-服务器是否存储令牌&;它们如何安全/黑客安全?

Security JWT&;OAuth2-服务器是否存储令牌&;它们如何安全/黑客安全?,security,authentication,oauth-2.0,jwt,Security,Authentication,Oauth 2.0,Jwt,在安全性、身份验证策略方面,我是一个彻头彻尾的傻瓜。所以我读了这篇关于“基于令牌的身份验证”的文章: 我有两个问题: 我不明白为什么中间人(或黑客)无法看到客户端发送的令牌,并使用该令牌冒充该客户端/个人来检索资源?从这个意义上讲,是什么让基于JSON Web令牌/OAuth2的身份验证更安全?如果我们每次都使用一次性使用令牌,我会理解,即使黑客可以读取令牌,他也无法将其用于其他请求。但由于令牌在到期前保持不变,这是一种更安全的身份验证策略吗 服务器如何知道客户端发送的令牌是有效的,即服务器在

在安全性、身份验证策略方面,我是一个彻头彻尾的傻瓜。所以我读了这篇关于“基于令牌的身份验证”的文章:

我有两个问题:

  • 我不明白为什么中间人(或黑客)无法看到客户端发送的令牌,并使用该令牌冒充该客户端/个人来检索资源?从这个意义上讲,是什么让基于JSON Web令牌/OAuth2的身份验证更安全?如果我们每次都使用一次性使用令牌,我会理解,即使黑客可以读取令牌,他也无法将其用于其他请求。但由于令牌在到期前保持不变,这是一种更安全的身份验证策略吗

  • 服务器如何知道客户端发送的令牌是有效的,即服务器在登录期间与客户端交换的令牌。服务器是否将生成的令牌存储在数据库或某个地方,并不断更新“上次访问的时间戳”或其他内容,并不断删除上次访问时间>1小时前的令牌,以便在1小时不活动后使其过期


  • 这完全是关于对令牌进行签名,而不是对令牌进行加密。服务器只是验证签名,JWT没有加密(除非您实现它)。 不要将敏感数据存储在令牌中,因为默认情况下它未加密

    我不明白为什么中间人(或黑客)无法看到客户端发送的令牌,并使用该令牌冒充该客户端/个人来检索资源

    JWT不会保护您免受中间人(MITM)攻击。如果攻击者获得有效令牌,则可以有效模拟。即使内容是加密的

    JWT应与SSL/TLS连接一起使用,以避免MITM

    从这个意义上讲,是什么让基于JSON Web令牌/OAuth2的身份验证更安全

    JWT是一种令牌格式,oauth2是一种协议。oauth2可以使用jwt。Oauth2对于使用第三方站点的用户来说更安全,因为凭据只从用户发送到主站点,然后站点会发出令牌,第三方站点可以使用该令牌对用户进行身份验证。第三方站点从未看到用户凭据

    但由于令牌在到期前保持不变,这是一种更安全的身份验证策略吗

    读上面。您需要保护您的令牌不被窃取:主要使用HTTPS,或减轻其影响:仅使用HttpOnly存储在Cookie中(如果您不需要在客户端访问JWT内容),缩短到期时间,轮换令牌

    服务器如何知道客户端发送的令牌是有效的,即服务器在登录期间与客户端交换的令牌

    类似JWT的
    hhh.pppp.ssss
    的第三部分是签名。签名是通过头和有效负载(hhh.pppp)上的服务器私钥执行的,它保护内容。如果攻击者更改了内容或签名,服务器将检测到它验证签名并拒绝身份验证

    服务器是否将生成的令牌存储在数据库或某处,并不断更新“上次访问的时间戳”或其他内容,并不断删除上次访问时间>1小时前的令牌,以便在1小时不活动后使其过期

    这是不必要的。签名打包在令牌本身(
    ssss
    )中,因此可以说JWT是自包含的


    服务器具有加密密钥或密钥对(公用和专用)。令牌使用密钥(对于HMAC对称密钥)进行签名和验证,或者使用私钥进行签名并使用相应的公钥(对于RSA非对称密钥)进行验证。

    对于每个用户以及同一用户的每个不同登录,此签名是否会更改?如果是,服务器在哪里存储这些签名以检查传入请求是否有效?您可以将签名视为实际令牌的加密校验和。当然,每个令牌是不同的,因此签名是不同的。服务器只有用于对令牌进行签名的私钥/公钥。当接收令牌时,服务器只需通过将令牌与is签名匹配来验证令牌是否真实。中间人攻击(如果不使用HTTPS)可以改变令牌,但他不能知道用于签署令牌的密钥,所以服务器会识别令牌不是真的,并且将失败的令人震惊的解释。我能够实现这一点,并且它工作得很好,但还有一件事我不确定。我们创建了一个令牌,并将其设置为15分钟后过期。无论发生什么情况,它都会在15分钟内过期,用户需要再次验证。然而,我想要的是,只要用户处于活动状态,就刷新此令牌,并且只有当用户处于非活动状态15分钟时,此令牌才会过期。由于令牌存储在客户端,即使我们通过解码base64令牌并将其重新编码来更改过期时间戳,我们如何才能做到这一点。您不能修改JWT的过期时间,因为它将破坏签名,服务器将拒绝令牌。您必须在令牌即将到期时续订令牌。例如,在响应请求时,服务器是否发出新的JWT并在响应中设置自定义头。或者从客户端执行一个特定的AJAX请求以获得一个新的令牌检查,这篇文章还提供了关于如何在One-One上刷新令牌的建议,在这里查看一些常见的技术