JSON Web Token(JWT)とは? 解説
JSON Web Token(JWT)は、claimの集合をbase64urlでエンコードされたJSONとして運ぶ、コンパクトで署名されたトークンで、サービス間でアイデンティティを証明するために使われます。
JWTは自己完結型の認証情報です。claimの小さなJSON payload - あなたが誰か、何ができるか、いつ失効するか - を詰め込み、受信者が発行者に問い合わせることなく信頼できるように署名します。JWTは現代のCI認証の中心です: GitHub Actionsがクラウドプロバイダーに発行するOIDCトークンはJWTです。
JWTとは
JWTはドットでつながれた3つのbase64urlエンコードされた部分です: 署名アルゴリズムを記述するheader、claimのpayload、signature。headerとpayloadは単なるJSONです。signatureにより、検証者はトークンが信頼できる当事者によって発行され、改変されていないことを確認できます。
claim
payloadはclaimの集合です - 主体に関する記述です。標準的なものには発行者、主体、対象者、失効時刻が含まれます。カスタムのclaimはアプリケーションのデータを運びます。CIのworkflowは、リポジトリ、branch、environmentのようなclaimに依存し、クラウドプロバイダーが正しいパイプラインにのみアクセスを許可できるようにします。
署名されるが暗号化はされない
標準的なJWTは署名されますが暗号化はされないため、誰でもそのclaimをデコードして読めます - 単なるbase64であり、秘密ではありません。signatureは整合性と真正性を保証しますが、機密性は保証しません。隠れることを期待してsecretをJWTのpayloadに入れては決していけません。
CIとOIDCにおけるJWT
CIでの大きな用途は、鍵不要のクラウド認証です。GitHub Actionsはworkflowを記述する短命のOIDC JWTを発行でき、AWS、GCP、Azureがそれを一時的な認証情報と交換します。これは、repoに保存された長命のsecretを、jobの実行期間だけ存在するトークンに置き換えます。
# Request an OIDC JWT for cloud auth in GitHub Actions
permissions:
id-token: write
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::111122223333:role/ci
aws-region: us-east-1Latchkeyについての注記
OIDCはLatchkeyのrunnerでもGitHub-hostedのものと同じように動作するため、JWTベースの鍵不要のクラウド認証を採用し、長命のクラウド鍵をリポジトリのsecretとして保存するのを完全にやめられます。
重要なポイント
- JWTは3つのbase64url部分 - header、claimのpayload、signature - をドットでつないだものです。
- 整合性のために署名されますが暗号化はされないため、そのclaimは誰でも読めます。
- CIはJWTをOIDCに使います: 短命のトークンを一時的なクラウド認証情報と交換し、保存されたsecretを置き換えます。