凭证

JWT

JWT(JSON Web Token)定义于RFC 7519标准之中,是目前广泛使用的一种令牌格式,尤其经常与 OAuth2 配合应用于分布式的、涉及多方的应用系统中。

架构安全性 - 图1

第一部分是令牌头(Header),内容如下所示
  1. {
  2. "alg": "HS256",
  3. "typ": "JWT"
  4. }
HS256 为 HMAC SHA256 算法的缩写
令牌的第二部分是负载(Payload),这是令牌真正需要向服务端传递的信息。
  1. {
  2. "username": "icyfenix",
  3. "authorities": [
  4. "ROLE_USER",
  5. "ROLE_ADMIN"
  6. ],
  7. "scope": [
  8. "ALL"
  9. ],
  10. "exp": 1584948947,
  11. "jti": "9d77586a-3f4f-4cbb-9924-fe2f77dfa33d",
  12. "client_id": "bookstore_frontend"
  13. }
令牌的第三部分是签名(Signature),签名的意思是:使用在对象头中公开的特定签名算法,通过特定的密钥(**Secret,由服务器进行保密,不能公开**)对前面两部分内容进行加密计算,以例子里使用的 JWT 默认的 HMAC SHA256 算法为例,将通过以下公式产生签名值:
  1. HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload) , secret)
  • 签名的意义在于确保负载中的信息是可信的、没有被篡改的,也没有在传输过程中丢失任何信息。
  • 由于签名这件事情只能由认证授权服务器完成(只有它知道 Secret),任何人都无法在篡改后重新计算出合法的签名值,所以服务端才能够完全信任客户端传上来的 JWT 中的负载信息。

散列消息认证码

散列消息认证码(Hash-based Message Authentication Code,HMAC)。

可以简单将它理解为一种带有密钥**的哈希摘要算法,实现形式上通常是把密钥以加盐方式混入,与内容一起做哈希摘要**。

HMAC 哈希与普通哈希算法的差别是普通的哈希算法通过 Hash 函数结果易变性保证了原有内容未被篡改,HMAC 不仅保证了内容未被篡改过,还保证了该哈希确实是由密钥的持有人所生成的

架构安全性 - 图2

令牌刷新机制

  • 微软身份平台和 OAuth 2.0 授权代码流

https://learn.microsoft.com/zh-cn/azure/active-directory/develop/v2-oauth2-auth-code-flow#refresh-the-access-token

  • AWS 使用刷新令牌

https://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-refresh-token.html

您可以使用刷新令牌来检索新的 ID 令牌和访问令牌。默认情况下,刷新令牌会在您的应用程序用户登录用户池的 30 天后过期。当您为用户池创建应用程序时,您可以将应用程序的刷新令牌到期时间设置为介于 60 分钟和 10 年之间的任何值。

如果存在有效的(未过期)刷新令牌,则 Mobile SDK for iOS、Mobile SDK for Android、Amplify for iOS、Android 和 Flutter 会自动刷新您的 ID 和访问令牌。ID 和访问令牌的剩余有效期至少为 2 分钟。如果刷新令牌已过期,您的应用程序用户必须通过再次登录用户池来重新进行身份验证。如果访问令牌和 ID 令牌的最小值设置为 5 分钟,并且您正在使用 SDK,则刷新令牌将持续用于检索新访问和 ID 令牌。您会看到预期行为的最小值设置为 7 分钟,而不是 5 分钟。