目的
AWS Cognitoの実装の際、ログイン時に返却されるトークンについて気になったので理解を深めるついでにまとめる。またここではCognitoで使用される認証認可のメカニズムであるOpenID Connect(OIDC)の認証認可の流れについては言及しない。
はじめに
Cognitoの認証時に返却されるトークンは以下の三つ
- IDトークン
- アクセストークン
- リフレッシュトークン
これらのうちIDトークンとアクセストークンはOIDCで使用される。
IDトークン
特徴
OIDCで追加されたトークン。
以下の情報を含む
- ユーザの属性情報
- ユーザが認証されたという情報
- トークンが改竄されたかどうかの情報
形式
JWT形式(Json Web Token)
{ヘッダ}.{ペイロード}.{署名}
という形式で表される
ヘッダ
- alg: 署名に使用するアルゴリズム
- typ: トークンの種類の情報
ペイロード
ユーザの属性情報(claimという)。これらを検証することで不正ななりすましを軽減できる。
- sub: 認証されたユーザの識別子
- name: 認証されたユーザの名前
- ita: トークンの発行日時を表すタイムスタンプ
- exp: トークンの有効期限
- iss: 発行者
- aud: 受信者
- nonce: リクエストごとにランダムに変わる値。攻撃者が以前の認証リクエストを再送信してもnonceが異なる場合、正当なトークンとして受け入れられない。
署名
署名情報
用途
- シングルサインオン
- ユーザの属性情報とそのユーザが認証されたこと、トークンが改竄されてないかが確認できれば他のシステムにログイン可能という仕組み
アクセストークン
特徴
OAuth2.0から引き継がれた概念。
リソースに対するアクセスと操作する権限を持つ
用途
リソースに対してアクセスと操作をする
まとめ
OAuth2.0だとアクセストークンが漏洩した場合、攻撃者はユーザーになりすましてリソースへのアクセスが可能となるが、OIDCの場合、IDトークンを検証することによりなりすましのリスクを軽減することができる。
いずれにしても漏洩時は迅速に無効化する仕組みも重要であると感じた。