はじめに
✅ JWT (JSON Web Token) は、ユーザーの認証情報を含むデータを安全にやり取りするためのトークン形式 です。
✅ Cognito では、ユーザー認証後に JWT トークン (AccessToken, IDToken, RefreshToken) を発行します。
🔹 JWT トークンの構造
JWT は以下の 3つの部分 で構成されます。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzMGE4ZTQ4NyJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSIsImlhdCI6MTUxNjIzOTAyMn0
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
📌 3つの部分
部分 | 説明 |
---|---|
1. ヘッダー (Header) | 使用するアルゴリズムやトークンの種類を定義 |
2. ペイロード (Payload) | ユーザー情報や権限 (claims) を含む |
3. 署名 (Signature) | トークンの改ざんを防ぐための署名 |
🔹 Cognito で発行される JWT トークンの種類
1️⃣ AccessToken
- API Gateway で認証するときに使用
- Cognito ユーザープールで発行される
- 有効期限 (デフォルト: 1時間)
2️⃣ IDToken
- ユーザー情報 (メール, 名前など) を含む
- フロントエンドアプリでユーザー情報を取得するときに使用
3️⃣ RefreshToken
- アクセストークンの有効期限が切れた際に、新しいトークンを取得するために使用
- 有効期限 最大 30日
🔹 JWT トークンの内容を確認
Cognito で取得した AccessToken をデコードすると、以下のような情報が含まれています。
📌 JWT デコード方法 (コマンドライン)
echo $ACCESS_TOKEN | awk -F. '{print $2}' | base64 -d | jq .
📌 JWT デコード結果 (例)
{
"sub": "1234567890",
"iss": "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX",
"client_id": "4rap65b59one3tf6j36ec4b21d",
"username": "example_user",
"exp": 1742310338,
"iat": 1742306738
}
ポイント
-
"sub"
→ ユーザーID -
"iss"
→ トークン発行元 (Cognito の URL) -
"client_id"
→ このトークンが発行されたクライアント ID -
"exp"
→ トークンの有効期限 (UNIX 時間) -
"iat"
→ トークンが発行された時間 (UNIX 時間)
🔹 Cognito で JWT トークンを取得
1️⃣ ユーザーログインして AccessToken
を取得
ACCESS_TOKEN=$(curl -X POST \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth" \
--data @- https://cognito-idp.ap-northeast-1.amazonaws.com/ <<EOF | jq -r '.AuthenticationResult.AccessToken'
{
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": "your-app-client-id",
"AuthParameters": {
"USERNAME": "your_username",
"PASSWORD": "your_password"
}
}
EOF
)
2️⃣ AccessToken
を API Gateway に送信
curl -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"action": "convert"}' \
https://your-api-id.execute-api.ap-northeast-1.amazonaws.com/Prod/convert
🔹 JWT トークンのメリット
✅ トークンの検証だけでユーザーを認証できる (データベース不要)
✅ トークンの改ざんができない (署名付き)
✅ 異なるサービス間 (API Gateway, Lambda) で統一した認証を実装できる
🚀 まとめ
項目 | 説明 |
---|---|
JWT とは? | 認証情報を含むセキュアなトークン |
トークンの構造 |
Header.Payload.Signature の 3つの部分で構成 |
AccessToken の用途 | API Gateway で認証に使用 |
トークンの取得方法 | Cognito にログインして取得 |
API にトークンを送信 |
Authorization: Bearer <TOKEN> をヘッダーに設定 |