# 身份令牌 (ID Token) 和访问令牌 (Access Token)

在 Amazon Cognito 中，身份令牌 (ID Token) 和访问令牌 (Access Token) 都是 JSON Web 令牌 (JWT)，但它们的目的和用途不同：

**身份令牌 (ID Token):**

* **用途:** 用于验证用户的身份。它包含有关用户身份的信息，例如用户名、电子邮件地址、自定义属性等。 主要用于客户端应用程序验证用户的身份，例如显示用户的个人资料信息。 [1](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens) [3](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)
* **内容:** 包含用户的身份信息，例如 `sub` (用户 ID)、`email`、`name`、自定义属性等。 它不包含授权信息。 [1](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens) [3](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)
* **安全性:** 因为它包含用户的个人信息，所以应该妥善保管，避免泄露。 通常不应该将其发送到后端服务，因为后端服务应该自己从 Cognito 获取用户信息。 [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens)
* **使用场景:** 用于客户端应用程序验证用户身份，显示用户个人资料，以及在需要用户身份信息但不需要访问后端资源的情况下使用。 例如，在 API Gateway 中用作授权器，验证用户身份。 [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens)

\
**访问令牌 (Access Token):**

* **用途:** 用于授权用户访问受保护的资源或 API。它不包含用户的个人信息，只包含授权信息，例如允许访问的资源或 API 的范围。 [1](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens) [3](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html)
* **内容:** 包含授权信息，例如 `scope` (授权范围)、`client_id` (客户端 ID) 等。 它不包含用户的个人信息。 [1](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html) [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens) [3](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-access-token.html)
* **安全性:** 如果泄露，攻击者可以访问受保护的资源或 API，但无法获取用户的个人信息。 [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens)
* **使用场景:** 用于访问后端 API、AWS 服务或其他受保护的资源。 例如，在向后端 API 发送请求时，在请求头中包含 Access Token。 [2](https://stackoverflow.com/questions/48543948/aws-cognito-whats-the-difference-between-access-and-identity-tokens)

**总结:**

ID Token 用于验证用户身份，Access Token 用于授权用户访问资源。 它们通常一起使用，ID Token 用于验证用户，Access Token 用于授权用户执行操作。 最佳实践是将 ID Token 保留在客户端，而将 Access Token 用于与后端服务的交互。 后端服务不应依赖 ID Token 中的用户数据，而应从 Cognito 或其他数据源中获取必要的信息。
