AWS

【Java版】CognitoのIDトークンのJWT検証とダミートークンの作成

前回、AWS SDK を使って Cognito 認証を実現しました。

【Java版】AWSのSDKを使ってCognito認証を実現するAWS で運用している API サービスに対して、特定のクライアントからのアクセスを許可したい。 こんな時、AWS Cognito...

その際、取得した ID トークンについて JWT 形式の文字列を検証してみようということになりました。

今回は、この JWT の文字列の中身の確認とダミートークンの作成について紹介していきます。

JWT形式について

JWT は JSON Web Token(ウェブトークン)の略で、ドット区切りの文字列で構成されています。

・ヘッダ
・ペイロード
・署名

ドットでセパレートされたそれぞれの文字列は Base64 エンコードされているので、デコードすることで中身の確認ができます。

AWS でも以下のドキュメントが用意されているので、署名も含めて検証される場合は参考にしてください。

ID トークンの署名は、JWT トークンのヘッダーとペイロードに基づいて計算されます。Web API のアプリケーション外で使用するときは、常にこの署名を検証してからトークンを受け入れる必要があります。

アプリケーションの認証方法として Amazon Cognito ユーザープールを使用したいと考えています。クライアントからアプリケーションに送信された ID とアクセストークンを検証する安全な方法は何ですか?

ヘッダ部の確認

参考までに、ヘッダ部を見てみましょう。

おっと、JSON 文字列の最後のカッコが抜けているようですね。

{“kid”: “xxxxxxxxxxxxxxxxxxxx”,”alg”: “RS256”

Base64 エンコードされているものの、どうやらパディング部分が省略されているので必要に応じて「=」を追加してみると良さそうです。

結果、以下の JSON が確認できると思います。

「alg」はトークンの署名に使用されるアルゴリズムで、RS256 は SHA-256 を持つ RSA 署名のこと。

ペイロード部の確認

ペイロード部にはトークンの有効期限や所有者(ユーザ)に関連する情報があります。

この中でチェックしておくと良い項目は以下の 4 つです。

・aud(対象者)
・token_use
・iss(Issuer)
・exp(有効期限)

ダミートークンの作成

ダミートークンはライブラリを使うと簡単にできますが、アルゴリズムによって署名の部分がややこしいです。

HMAC256 だと楽なのですが、RS256 は少し面倒かな・・・。

今回は java-jwt のライブラリを利用してみます。

Gradle で利用する場合は以下の通り。

implementation(“com.auth0:java-jwt:3.18.3”)

HMAC256

HMAC256 は任意の文字列で Algorithm オブジェクトが生成できるのでそのまま使えます。

RS256

無理やりダミーの署名を用意しましょうか。

まとめ

Cognito 認証で取得した ID トークンの JWT の中身を確認してみました。

メインはトークンの有効期限チェックになると思いますが、その他の情報も知っておくといいですね。

また ID トークンに見せかけた、ダミーの JWT の作成にもチャレンジしました。

純粋にトークンを作成したい場合や、テスト用のトークン作成用途として使えそうです。

JWT 形式の文字列は、利用用途が増えてきているので、どのような形式になっているのか理解しておきたいですね。