Cognitoでセッションの強制失効がサポートされたので試してみた

Cognitoでセッションの強制失効がサポートされたので試してみた

Amazon Cognito ユーザープールで、一覧から選んだ特定のセッションを強制的に失効できるようになりました。Essentials プランで管理者の IAM 認証による失効と、アクセストークンによる失効の両方を実行し、失効したセッションのトークンが Cognito API で使えなくなることを確認しました。
2026.11.13

はじめに

2026年11月11日に、Amazon Cognito ユーザープールでセッションの強制失効が可能になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/11/amazon-cognito-session-management/

デバイスの紛失などのインシデント発生時に、ユーザーの全トークンを失効する従来の操作に加えて、セッションを一覧表示して特定のセッションのみを失効できるようになりました。

セッション追跡の有効化

検証には AWS CLI 2.40.1 を使い、東京リージョンに Essentials プランのユーザープールとアプリクライアントを作成しました。

aws cognito-idp create-user-pool \
  --pool-name <pool-name> \
  --user-pool-tier ESSENTIALS

aws cognito-idp create-user-pool-client \
  --user-pool-id <user-pool-id> \
  --client-name <client-name> \
  --no-generate-secret \
  --explicit-auth-flows ALLOW_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH

セッション追跡は既定でオフです。有効にできるのは Essentials または Plus プランのユーザープールで、Lite プランは対象外です。Pre Token Generation トリガーが独自の sid クレームを付けているユーザープールでは、有効にしても追跡されません。次のコマンドで有効にします。

aws cognito-idp set-user-pool-session-configuration \
  --user-pool-id <user-pool-id> \
  --user-session-tracking ENABLED \
  --token-session MaxPerUser=20

このコマンドは設定全体を置き換えるため、変更しない --token-session も省略できません。ここでは既定値と同じ 20 を指定しました。別の値を設定済みのユーザープールでは、現在の値を指定します。

サインインとセッションの一覧

検証ユーザーは admin-create-user で作成し、admin-set-user-password --permanent でパスワードを確定しました。initiate-auth API でのサインインを同じユーザーで3回実行し、3回ともトークンセッションが作られました。以降、1回目から順にトークンセッション A、B、C と呼びます。

aws cognito-idp initiate-auth \
  --client-id <client-id> \
  --auth-flow USER_PASSWORD_AUTH \
  --auth-parameters USERNAME=testuser1,PASSWORD=<password>

admin-list-user-sessions で一覧を取得します。

aws cognito-idp admin-list-user-sessions \
  --user-pool-id <user-pool-id> \
  --username testuser1
{
    "Sessions": [
        {
            "SessionId": "tknoba4eiihr6yj9gqz3a1ys22wo",
            "SessionType": "TOKEN",
            "ClientId": "1example23456789abcdefghij",
            "CreateDate": "2026-11-13T02:38:30.995000+09:00",
            "LastActiveDate": "2026-11-13T02:38:30.995000+09:00",
            "DeviceType": "aws-cli 2, Linux",
            "LastIPAddress": "203.0.113.10",
            "LastLocation": {
                "City": "Yokohama",
                "Country": "Japan"
            },
            "IsCurrentSession": false
        },
        {
            "SessionId": "tknmgg3d7gn7wgz1hg5v5a0nslot",
            "SessionType": "TOKEN",
            "ClientId": "1example23456789abcdefghij",
            "CreateDate": "2026-11-13T02:38:33.796000+09:00",
            "LastActiveDate": "2026-11-13T02:38:33.796000+09:00",
            "DeviceType": "aws-cli 2, Linux",
            "LastIPAddress": "203.0.113.10",
            "LastLocation": {
                "City": "Yokohama",
                "Country": "Japan"
            },
            "IsCurrentSession": false
        },
        {
            "SessionId": "tknwzjaxloc19unujct3hsko60fc",
            "SessionType": "TOKEN",
            "ClientId": "1example23456789abcdefghij",
            "CreateDate": "2026-11-13T02:38:36.497000+09:00",
            "LastActiveDate": "2026-11-13T02:38:36.497000+09:00",
            "DeviceType": "aws-cli 2, Linux",
            "LastIPAddress": "203.0.113.10",
            "LastLocation": {
                "City": "Yokohama",
                "Country": "Japan"
            },
            "IsCurrentSession": false
        }
    ]
}

同じ端末から3回サインインしたため、端末種別、IPアドレス、位置情報は3件とも同じ値でした。A、B、C それぞれのアクセストークンの sid クレームは、一覧の対応する SessionId と一致しました。

セッションの失効

従来から、AdminUserGlobalSignOut でユーザーの全トークンを失効できました。追跡を有効にしていれば、この操作で全トークンセッションと SSO セッションも失効します。今回追加された失効 API では、一覧のセッションIDで指定した特定のセッションのみを失効できます。

https://docs.aws.amazon.com/cognito/latest/developerguide/managing-user-sessions.html

管理者による失効

失効前は、トークンセッション A のアクセストークンで get-user が成功し、リフレッシュトークンによるトークンの更新も成功しました。次に、管理者の IAM 認証で admin-revoke-user-session を実行し、ユーザー名とセッションIDを指定して A を失効しました。コマンドは出力なしで成功しました。

aws cognito-idp admin-revoke-user-session \
  --user-pool-id <user-pool-id> \
  --username testuser1 \
  --session-id tknoba4eiihr6yj9gqz3a1ys22wo

失効後は、A のアクセストークンでの get-user も、リフレッシュトークンによるトークンの更新も失敗しました。

aws cognito-idp get-user \
  --access-token <A のアクセストークン> \
  --no-sign-request
aws: [ERROR]: An error occurred (NotAuthorizedException) when calling the GetUser operation: Access Token has been revoked
aws cognito-idp initiate-auth \
  --client-id <client-id> \
  --auth-flow REFRESH_TOKEN_AUTH \
  --auth-parameters REFRESH_TOKEN=<A のリフレッシュトークン> \
  --no-sign-request
aws: [ERROR]: An error occurred (NotAuthorizedException) when calling the InitiateAuth operation: Refresh Token has been revoked

一覧からも A が消えました。

aws cognito-idp admin-list-user-sessions \
  --user-pool-id <user-pool-id> \
  --username testuser1 \
  --query 'Sessions[].{SessionId:SessionId,SessionType:SessionType}'
[
    {
        "SessionId": "tknmgg3d7gn7wgz1hg5v5a0nslot",
        "SessionType": "TOKEN"
    },
    {
        "SessionId": "tknwzjaxloc19unujct3hsko60fc",
        "SessionType": "TOKEN"
    }
]

ユーザー本人による失効

revoke-user-session は、ユーザー本人のアクセストークンで呼びます。IAM 認証は不要です。トークンセッション B のアクセストークンを使って、同じユーザーの別のセッション C を失効しました。

aws cognito-idp revoke-user-session \
  --access-token <B のアクセストークン> \
  --session-id tknwzjaxloc19unujct3hsko60fc \
  --no-sign-request

C のアクセストークンでの get-user は Access Token has been revoked で失敗しました。リフレッシュトークンによるトークンの更新は Refresh Token has been revoked で失敗しました。どちらも A のときと同じエラーです。

B のアクセストークンで B 自身のセッションを失効しようとすると、ForbiddenException で拒否されました。

aws: [ERROR]: An error occurred (ForbiddenException) when calling the RevokeUserSession operation: The current session cannot be revoked with RevokeUserSession.

呼び出しに使ったアクセストークン自身のセッションは失効できないため、この API はアプリのサインアウトボタンには使えません。最後に一覧を取得すると、B の1件だけが残りました。

まとめ

Cognito のセッション管理が強化され、ユーザーのセッションの確認や、特定のセッションの強制失効が可能になりました。

本人のアクセストークンで自分の別のセッションを失効できるため、不審なアクティビティに気づいたユーザーが、自分でそのセッションを止める手段としても使えます。

ただし、失効したトークンが即時に無効になるのは Cognito API での検証に限られます。署名と有効期限だけを検証する JWT ライブラリでは、失効したトークンも有効と判定されるため注意が必要です。

https://docs.aws.amazon.com/cognito/latest/developerguide/token-revocation.html

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事