【问题标题】:JWT & OAuth2 - Does the server store the token? & How are they Secure/Hacker Safe?JWT 和 OAuth2 - 服务器是否存储令牌?以及它们如何安全/黑客安全?
【发布时间】:2016-11-30 12:14:07
【问题描述】:

在安全性、身份验证策略方面,我完全是个菜鸟。所以我正在阅读这篇关于“基于令牌的身份验证”的文章: https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication

我有两个问题:

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

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

【问题讨论】:

    标签: security authentication oauth-2.0 jwt


    【解决方案1】:

    这完全是关于签署令牌而不是加密令牌。服务器只是验证签名,JWT 没有加密(除非你实现它)。 不要在令牌中存储敏感数据,因为它默认不加密。

    【讨论】:

    • 对于每个用户以及同一用户的每个不同登录,此签名是否都会更改?如果是这样,服务器将这些签名存储在哪里以检查传入请求是否有效?
    • 您可以将签名视为实际令牌的加密校验和。当然每个token都不一样,所以签名也不一样。服务器只有用于签署令牌的私钥/公钥。接收令牌时,服务器只需通过将令牌与 is 签名匹配来验证令牌是否真实。中间人攻击(如果不使用 https)可以更改令牌,但他不知道用于签署令牌的密钥,因此服务器会将令牌识别为非真实的,并且调用失败
    【解决方案2】:

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

    JWT 不会保护您免受中间人 (MITM) 攻击。如果攻击者获得了有效的令牌,就可以有效地冒充。即使内容被加密。

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

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

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

    但由于令牌在过期之前保持不变,那如何是更安全的身份验证策略?

    阅读上文。您需要保护您的令牌不被盗:主要使用 HTTPS,或减轻其影响:使用 HttpOnly 存储在 cookie 中(如果您不需要在客户端访问 JWT 内容),设置过期时间短,轮换令牌......

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

    hhhh.pppp.ssss 这样的JWT 的第三部分是签名。签名是使用服务器私钥在标头和有效负载 (hhhh.pppp) 上执行的,以保护内容。如果攻击者更改了内容或签名,服务器将检测到它正在验证签名并拒绝身份验证。

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

    不需要。签名封装在令牌本身(ssss)中,因此说JWT是自包含的

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

    【讨论】:

    • 很棒的解释。
    • 我能够实现这一点并且效果很好,但还有一件事我不确定......我们创建了一个令牌并说我们将其设置为在 15 分钟内到期。无论如何,它都会在 15 分钟内过期,并且用户需要再次进行身份验证。但是,我想要的是只要用户处于活动状态就刷新此令牌,并且仅在他/她变为非活动状态 15 分钟时才将其过期。由于令牌存储在客户端,我们如何才能做到这一点,即使我们通过解码 base64 令牌并重新编码来更改过期时间戳也行不通。
    • 你不能修改 JWT 的过期时间,因为它会破坏签名,服务器会拒绝令牌。您必须在令牌即将到期时更新令牌。例如,在响应请求时,服务器是否发出新的 JWT 并设置自定义标头作为响应。或者执行来自客户端的特定 AJAX 请求以获取新令牌
    • 查看这篇文章,了解如何刷新令牌stackoverflow.com/questions/26739167/…
    • @One-One,看这里看一些常用技巧stackoverflow.com/a/37520125/6371459
    猜你喜欢
    • 2017-12-25
    • 2020-10-30
    • 2021-09-26
    • 2020-08-22
    • 2018-11-12
    • 2012-12-06
    • 1970-01-01
    • 2014-08-16
    • 2019-10-23
    相关资源
    最近更新 更多