7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ALBのJWT検証をCognitoで試す

Last updated at Posted at 2025-11-14

概要

2025/11/12 に ALB のJSON Web Token(JWT)検証機能が発表されました。
これにより、JWT検証をアプリケーションで行うことなく、ALBでマネージドに行えるようになりました。この機能を試してみます。

公式ドキュメントはこちら

手順

Congito

[1] Cognito でユーザープールを作成します。アプリケーションタイプは「Machine to Machine」を選びます。

image.png

[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」として表示されています。

image.png

ALB

[1] ALBを作成します。
『JSON ウェブキーセット (JWKS) エンドポイント』には、さきほど取得したCognitoの「トークン署名キー URL」を設定します。
発行者は、Cognitoの場合 https://cognito-idp.<リージョン>.amazonaws.com/<ユーザープールID> の形式となるため、ユーザープールのIDを補完してください。

なお、JWT 検証はHTTPSリスナーでサポートされています。

image.png

今回はレスポンスを固定にします。

image.png

「セキュアリスナーの設定」も求められますが、後ほど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検証を試してみました。認証の負荷をアプリケーションからオフロードできる点は魅力的ですね。

参考

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?