AWS

AWS Cognitoでユーザーの認証とアクセス制御

NEW 2026年9月1日

目次Category


はじめに

今回は、AWS Cognito(コグニート)について取り扱います。どんなサービスでどのように使うのか、その仕組みについて理解を深めていきましょう!

AWS Cognitoとは

 「Webアプリやモバイルアプリに必要な
         ユーザーの登録・ログイン・認証・アクセス制御を提供するサービス」

似たようなサービスだと,Firebase AuthenticationやAuth0があります。
この2つのサービスとの違いは、やはりAWS純正のサービスでありAWS環境に統合しやすい所です。(そりゃそうだわ)
 Cognitoの認証とアクセス制御には、有名な国際標準であるOpenID Connect(OIDC)と
OAuth2.0を利用して実現されています。

・OpenID Connect : 認証のための仕組み → その人が誰かを確実に明らかにすること

・OAuth2.0: 認可のための仕組み → 認証済みの人のアクセス権限を判断する情報を渡すこと

Cognitoのフローではこのように捉えてもらえたらいいです。(OAuthは厳密には少し違う)
ちなみに、OIDCはOAuth2.0を基に認証機能を追加した仕組みなのでフローはほとんど同じです。(興味があったら調べてみて!)

料金

AWS Cognitoの料金は、3つのプラン(Lite . Essentials , Plus)に分かれています。
各プランの料金は以下の通りです。
 *MAU : 月間アクティブユーザー
 Liteプランはユーザーが増えるほどMAU当たりの金額が安くなります。

特に指定していない場合は、Essentialsがデフォルトになります。
LiteとEssenatialsには無料枠があり、Amazon Cognito またはソーシャル ID プロバイダー経由で直接サインインするユーザーを対象にMAU1万人までが無料となります。

MAU判定 : 管理作成または更新、サインアップ、サインイン、サインアウト、トークンの更新、パスワードの変更、ユーザー アカウント属性の更新、ユーザーに対する属性クエリ (AdminGetUser API) など、あるユーザーのために ID オペレーションを生成したユーザーは 1 MAU としてカウント

プランの違いについては下記を参照してください。
Amazon Cognito – 料金

今回のハンズオンでは、Cognitoの料金は気にしなくてよいです。ただ、API GatewayとLambdaは呼び出すたびに料金が発生するのでやりすぎには注意です。

今回使用するサービス

 

今回のフロー

構築手順

2-1.Lambda作成

Lambdaを開いて、以下の設定でLambdaを作成してください。

【名前】lambda-cognito-[name]-01

【ランタイム】Python 3.14

 以降はデフォルト

Lambdaが作成出来たら、コードタブに以下のコードを貼り付けてください。

import json

def lambda_handler(event, context):

    print(event)

    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": json.dumps({
            "message": "認証されたユーザーだけが見られる情報です"
        }, ensure_ascii=False)
    } 

Lambdaの作成は以上です。次に移りましょう。

 

2-2.API Gateway作成

API Gatewayを開いて、作成を押してください。
”REST API”を選択してください。

以下の内容で設定を行ってください。

【名前】api-cognito-[name]-01

【説明】cognito練習用(なんでもよい)

【AWS エンドポイントタイプ】リージョン

【セキュリティポリシー】デフォルト(なにもなし)

【IPアドレスタイプ】IPv4

作成後、詳細画面に移るのでそのまま設定を続けます。

・リソースを作成

【リソース名】profile

・メソッドを作成 (メソッドリクエストタブ内)

【メソッドタイプ】GET

【統合タイプ】Lambda関数

【Lambda関数】作成したもの

 以降デフォルト

*今回、REST APIで作成している理由
 Cognito User Pool Authorizerを直接利用でき、Cognitoによる認証・Access Tokenによる認可・Lambdaへのアクセス制御の流れを分かりやすく確認できるためです。HTTP APIでも実現は可能ですが、やり方が変わるのでCognitoの仕組みがわかることを優先しています(JWT Authorizerを利用)。

 

2-3.Cognito User Pool・Managed Login設定

AWS Cognitoを開いて、”5分未満で無料を開始できます”を選択
*User Poolを使うため左を選択しています。右を選ぶとID Poolを使うことになります(一時的なAWS認証情報を発行するためのもの)。

以下の内容で設定を行ってください。

【名前】cognito-[name]-01

【サインイン識別子のオプション】メールアドレス

【自己登録】デフォルト

【サインアップのための必須属性】なし

【リターンURL】http://localhost:8000/

Cognitoの設定後、”ユーザディレクトリを作成”をクリック
*ユーザープールの名前は、自動生成なのでどれが作成したものか確認しておいてください。

 

2-4.テストユーザー作成

ユーザディレクトリの作成ができたら次のような画面が出てきます。

ここから、テストユーザーの作成を行います。
【サインインページを確認】の”ログインページを表示”をクリックしてください。
ログインページが表示されるので”create an account“からアカウントを作成します。

【メールアドレス】社用メール (もしくは確認メールが届けばなんでもOK)

【パスワード】Test1234@

テストユーザーの作成が完了すれば、リターンURLで設定したページが開きます。(今回は遷移先のページは用意していないのでエラー画面になります)
URLを見てもらうと、リターンURLにcode=xxxxxxxxxxが付随していると思います。

http://localhost:8000/?code=xxxxxxxxxxxx

このcodeは、Authorizationコードになります。Cognitoのログインに成功をしたこと示すもので、トークン生成に利用します。
有効期限が5分なので、2-5,6をしていると過ぎてしまうのでトークン生成の際にログインをし直します。
次にうつりましょう。

2-5.Cognito Authorizer作成

API Gatewayのサイドバーにある”オーソライザー”を選択 -> 作成を押してください。
以下の内容で設定しましょう。

【名前】authorizer-cognito-[name]-01

【オーソライザータイプ】cognito

【ユーザープール】作成したもの

【トークンのソース】Authorization

 

2-6.API Gatewayを認証必須に変更

API GatewayのリソースからGETを選択しましょう。
”メソッドリクエストタブ”の編集をクリックしてください。
以下の項目を次の設定内容にしてください。

・メソッドリクエストの設定

【認可】作成したAuthorizer

【認可スコープ】openid

 以降デフォルト

保存ができたら、リソース画面に戻るのでそのまま”APIデプロイ”を押してください。
新しいステージ -> 【ステージ名】dev -> デプロイ

*デプロイしないと変更が反映されないので気を付けてください。

devステージの詳細が表示されるので、【URLを呼び出す】をコピーして手元に残しましょう。
動作確認で使用しますので、URLの最後に/profileを付け加えておいてください。

 

2-7.各種トークン生成

PowerShellやUbuntu等のCLIを準備してください。
AuthorizationコードをCognitoのToken Endpointに送ってトークンを生成します。
本来であれば、Webサイト内部で上記の処理を実装し、受け取ったトークンでAPI Gatewayにアクセスし、Webサイトのページを表示します。
今回は、Webサイトを用意してないので、コマンドで実行します。

トークン生成に必要なもの(記載場所)
・Cognitoのドメイン  ( Cognitoのユーザープール -> 作成したユーザープール詳細 -> ブランディングのドメイン)
・App Client ID  (ユーザープール詳細 -> アプリケーションのアプリケーションクライアント)
・Authorization コード
・Client Secret  (App Client ID の下)
・リターンURL

生成されるトークン
・ID Token : ユーザーの認証情報
・Access Token : サービス等へのアクセス認可
・Reflesh Token : 上記トークンを再取得するため
*Reflesh Token以外はJWT形式のトークン

Authorizationコードの有効期限がおそらく切れているはずなので、再度ログインして取得してください。
必要なものが準備できたら下記のコマンドに追記して実行してください。(リターンURLは記述してます)

Linux用
 curl -X POST  "https://<Cognitoドメイン>/oauth2/token" -u "<App Client ID>:<Client Secret>"
    -H "Content-Type: application/x-www-form-urlencoded" 
    -d "grant_type=authorization_code&code=<Authorizationコード>&redirect_uri=http://localhost:8000/"

PowerShell用
  curl.exe -X POST "https://<Cognitoドメイン>/oauth2/token" -u "<App Client ID>:<Client Secret>"
    -H "Content-Type: application/x-www-form-urlencoded" 
    -d "grant_type=authorization_code&code=<Authorizationコード>&redirect_uri=http://localhost:8000/"

成功したら、json形式で各種トークンが返ってきます。 ({ Access Token : “xxxxxxxx…..}と来るはず)
冒頭に”Access Token”とあるので、その項目の内容だけコピーしてください。(文字量すごいので頑張ってください!)

 

2-8.動作確認

構築ができたので、アクセス制御ができているか動作確認をしていきましょう。
まずは、Access Tokenの有無でアクセス制御ができているかを確認します。

トークン無し

curl <2-6で最後に取得したURL(/profile忘れないように)>

{message : “Unauthorized”}と出ればOK

トークンあり

curl -H "Authorization : <Access Token>" <2-6で最後に取得したURL(/profile忘れないように)>

Lambda関数の内容が返ってきたらOK
次に、Access Tokenが改ざんされてしまったときにアクセス制御ができているか確認します。

Access Token改ざん

Access TokenはJWT形式のトークンでHeader.Payload.Signetureの構成となっています。
データの改ざんがされる場合、Payload部分の情報が変わるのでそこを適当に変更してコマンドを実行してみましょう。
{message : “Unauthorized”}が返ってくれば成功です。

*JWTトークンの構成について
・Header:トークンをどのように作ったか(使用したアルゴリズムやトークンの種類等)
・Payload:ユーザーやトークン等の本体情報
・Signeture:JWTの改ざん確認用電子署名 (Header + Payload + 署名用鍵で生成)

 

まとめ

以上で今回のハンズオンは終了です。
Cognitoが実際にどう使われるかや片付けについてお話して終わりとします。

Webサイトで使用するには

テストユーザを作成したときに使用したログインページを、Webサイトのログインページとして埋め込んで使用します。
リターンURLには、トークン生成の処理を行うエンドポイントを付与したURLを設定します。

簡単な流れ
ログインページ ->サインイン/アップ -> トークン生成のエンドポイント
-> Access Tokenをヘッダーに付与したGETメソッドをAPIへ送信 -> Webサイトのホームページ

詳細には書いていないので気になる方は調べてみてください。

片付け

・API Gateway
・Lambda用IAM(自動生成されてます)
・Lambda
・AWS Cognito(ユーザープール)

これらを削除してもらったらよいです。残しておいても料金は基本発生しない物ばかりですが消しておきましょう。
最後に、動作確認で改ざんを行いましたが、実はSignetureの部分を一部変更してもアクセスできてしまう場合があります。
どうしてそうなってしまうのか調べてみてもよいかもです。(仕組みに詳しくなれるチャンス!改ざんでSignetureが変わることそうないけどね)

この記事を書いた人

神山颯太

hayato_kamiyama

26卒の神山です。
運動が大好きです。