概要
2025/11/12 に ALB のJSON Web Token(JWT)検証機能が発表されました。
これにより、JWT検証をアプリケーションで行うことなく、ALBでマネージドに行えるようになりました。この機能を試してみます。
公式ドキュメントはこちら
手順
Congito
[1] Cognito でユーザープールを作成します。アプリケーションタイプは「Machine to Machine」を選びます。
[2] 作成後、「アプリケーションクライアント」に移動します。先程作成したユーザープールの Quick Setup ガイドにアクセストークンを取得するための curl コマンドが表示されます。
クライアントシークレットはコンソールから確認できます。
これを実行するとアクセストークンが取得できます。
curl -X POST https://ap-northeast-xxxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=xxxx&client_secret=<client secret>&scope=default-m2m-resource-server-xxx/read"
{"access_token":"ey...","expires_in":3600,"token_type":"Bearer"}
[3] JWT 検証用の公開鍵URLを取得します。こちらはユーザープールのコンソールに「トークン署名キー URL」として表示されています。
ALB
[1] ALBを作成します。
『JSON ウェブキーセット (JWKS) エンドポイント』には、さきほど取得したCognitoの「トークン署名キー URL」を設定します。
発行者は、Cognitoの場合 https://cognito-idp.<リージョン>.amazonaws.com/<ユーザープールID> の形式となるため、ユーザープールのIDを補完してください。
なお、JWT 検証はHTTPSリスナーでサポートされています。
今回はレスポンスを固定にします。
「セキュアリスナーの設定」も求められますが、後ほどALBのDNS名を設定した証明書を使いたいので、ここは一度適当な証明書を作成して登録しておきます。(コマンドは[2]を参考にしてください)
ここで一旦ALBが作成されます。
[2] ALBのDNS名を確認できたら自己証明書を作成します。
openssl req -x509 -newkey rsa:2048 -nodes -days 365 \
-keyout private-key.key \
-out certificate.crt
# Common Name は 作成した ALB のDNS名を設定します
[3] 再びALBのコンソールから、証明書をインポートします。
「証明書をインポート」で、作成した証明書、秘密鍵の内容を入力します。
さきほどのコマンド例で言えば、private-key.keyを『証明書のプライベートキー』に、certificate.crtを『証明書本文』に入力します。
[4] デフォルトの証明書を[3]でインポートした証明書に変更します。
動作確認
Cognitoから取得したアクセストークンを使って、ALBにリクエストしてみます。
jq を使ってますがコピー&ペーストでも問題無いです。
# アクセストークンを変数に設定
ACCESS_TOKEN=$(curl -X POST https://ap-northeast-xxxxx.auth.ap-northeast-1.amazoncognito.com/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=xxxx&client_secret=<client secret>&scope=default-m2m-resource-server-xxx/read" \
| jq -r '.access_token')
# ALB にリクエスト
curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
https://<ALBのDNS>
成功すると、さきほど設定した固定レスポンスが応答されます。
{"message": "JWT verification succeeded"}
${ACCESS_TOKEN} をブランク等にしてリクエストすると失敗します。失敗時は以下のように401でhtmlが応答されます。
レスポンスのカスタマイズが出来るかまでは未確認ですが、コンソールを少し見た限り設定できる場所は無さそうでした。
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
</body>
</html>
おわりに
簡単ですが Cognito を使って ALB のJWT検証を試してみました。認証の負荷をアプリケーションからオフロードできる点は魅力的ですね。



