【解説】JWT形式で発行されるIDトークン、アクセストークン、リフレッシュトークンの違いと役割
Webアプリケーションやモバイルアプリケーションの開発において、認証と認可は非常に重要な要素です。Amazon CognitoやOAuth 2.0などの認証プロバイダーを使用する際に、しばしば登場するのがIDトークン、アクセストークン、リフレッシュトークンの3種類のトークンです。
この記事では、それぞれのトークンがどのような役割を果たしているのか、どのように使い分けるべきかを詳しく解説します。
トークンの基本概念
JWT(JSON Web Token)とは?
3種類のトークンは、通常、JWT(JSON Web Token)形式で発行されます。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成され、各部分はドットで区切られた文字列になっています。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWTは、ユーザー情報や認可情報を安全にクライアントとサーバー間でやり取りするためのトークン形式です。
1. IDトークン
概要
IDトークンは、ユーザーが認証されたことをクライアントアプリケーションに通知するためのトークンです。これにより、クライアントアプリケーションは「誰がログインしているのか」を把握することができます。
主な用途
- ユーザー情報の表示: IDトークンには、ユーザーの名前やメールアドレスなどの情報が含まれており、クライアントアプリケーションでこれらの情報を表示する際に使用します
- ユーザの認証: シングルページアプリケーション(SPA)などでは、IDトークンが有効なものかを確認することで、ユーザーの認証を行う事ができる
含まれる主なクレーム
-
sub
: ユーザーの一意識別子(ID) -
email
: ユーザーのメールアドレス -
name
: ユーザーのフルネーム -
iat
: トークンの発行日時 -
exp
: トークンの有効期限
使用シナリオ
IDトークンは、主にクライアントアプリケーション内で使用され、ユーザーのプロファイル情報を表示したり、ユーザーがログインしていることを確認するために使われます。
2. アクセストークン
概要
アクセストークンは、ユーザーが特定のリソースやAPIにアクセスする権限を持っていることを証明するためのトークンです。APIリクエストにおいて、認証済みのユーザーとしてリクエストを送信するために使われます。
主な用途
- APIアクセスの認可: クライアントアプリケーションがAPIにアクセスする際に、このトークンを使用してユーザーがその操作を行う権限を持っていることを証明します
含まれる主なクレーム
-
sub
: ユーザーの一意識別子(ID) -
iss
: トークンの発行者 -
aud
: トークンの対象(クライアントID) -
scope
: ユーザーが持つアクセス権限 -
exp
: トークンの有効期限
使用シナリオ
アクセストークンは、APIリクエストのAuthorization
ヘッダーに含めて使用されます。これにより、リソースサーバー(APIサーバー)は、このリクエストが正当なものであり、リクエスト元ユーザーがその操作を行う権限を持っていることを確認できます。
3. リフレッシュトークン
概要
リフレッシュトークンは、アクセストークンの有効期限が切れた後でも、ユーザーが再度ログインすることなく新しいアクセストークンを取得するためのトークンです。これにより、ユーザーのセッションをシームレスに延長することができます。
主な用途
- アクセストークンの再発行: クライアントアプリケーションが、ユーザーの再ログインを求めることなく、バックグラウンドで新しいアクセストークンを取得するために使用します。
含まれる主なクレーム
リフレッシュトークン自体には、一般的にユーザー情報や認可情報が含まれず、サーバー側でのみ有効性を検証するために使用されます。
使用シナリオ
リフレッシュトークンは、クライアントアプリケーションがアクセストークンの有効期限が切れたときに、新しいアクセストークンを取得するためのリクエストをサーバーに送信する際に使用します。このプロセスにより、ユーザーは再度ログインすることなくセッションを継続できます。
トークンの使い分け
トークン種別 | 役割 | 使用場所 | 有効期間 | 主なクレーム |
---|---|---|---|---|
IDトークン | ユーザーの認証情報を提供 | クライアントアプリ内 | 短期間(数分〜1時間) | sub, email, name |
アクセストークン | APIアクセスの認可 | APIリクエスト | 短期間(数分〜1時間) | sub, scope, exp |
リフレッシュトークン | アクセストークンの再発行 | サーバー側(バックエンド) | 長期間(数日〜数週間) | なし(クライアントが知る必要がないため) |
まとめ
Cognitoを使う上で色々な用語がでてきますが、違いが理解できたので、実際の設計での使い分けする事ができました。
IDトークン、アクセストークン、リフレッシュトークンは、それぞれ異なる役割を持ち、認証と認可のプロセスにおいて重要な役割を果たします。
参考