パブリッククライアント(特にネイティブアプリ)向けグラントタイプとして推奨されているグラントタイプの認可コードグラント+PKCEについて説明する。PKCEは、「Proof Key for Code Exchange」の略でピクシーと読む。
OAuth2.0の概要とその必要性について
「OAuth 2.0 認可コードグラント概要」を参照のこと。
OAuth2.0のロールと関係性
ロール | 説明 |
---|---|
リソースオーナー | サービスで管理しているリソースの所有者。3rdパーティアプリにアクセス権を委譲して、リソースにアクセスする。 |
クライアント | リソースサーバーを利用するアプリケーション。ユーザーによって委譲されたアクセス権の範囲で、リソースにアクセスする。 |
リソースサーバー | データや機能を提供するサービス。リソースオーナーのリソースを管理し、リソースオーナーが許可したアクセスのみを受け入れる。アクセス権の確認には、アクセストークンを利用する。 |
認可サーバー | 以下の機能を持つサーバー。 ・リソースオーナーを認証(リソースオーナーであることを確認)する。 ・クライアントのリソースへのアクセスについて、リソースオーナーの同意を得る。 ・アクセストークンを発行する。 |
認可コードグラント+PKCE
認可コードグラント+PKCEとは、認可コードグラントのリクエストに、検証パラメータを追加し、認可コード横取り攻撃を防ぐ手法である。
認可コード横取り攻撃
認可コード横取り攻撃とは、リソースオーナーが所持するデバイスが以下の条件を満たす場合、
- デバイスには、3rdパーティアプリ(クライアント)と悪意あるアプリがインストールされている。
- 悪意あるアプリは、クライアントと同じカスタムスキームが設定されている。
- 悪意あるアプリは、クライアントのクライアントIDを知っている。
悪意あるアプリによって、認可サーバーが発行した認可コードを奪い、その認可コードを使って、アクセストークンを取得されてしまうことを指す。
認可コード横取り攻撃シーケンス
認可コードグラント+PKCE パラメータ
認可コードグラント+PKCEでは、以下の検証用パラメータを認可コードグラントのリクエストに追加する。
パラメータ | 説明 |
---|---|
code_verifier | 長さが43文字、最大128文字までの間の[A-Z]/[a-z]/[0-9]/"-"/"."/"_"/"~"からなるランダムな文字列。 |
code_challenge | code_verifierに対して、code_challenge_methodの計算を施して算出された値 |
code_challenge_method | plainまたは、S256。基本はS256を利用する。 plain:code_challenge=code_verifier S256:code_challenge=BASE64_URL_ENCODE(SHA256(ASCII(code_verifier))) |
認可コードグランド+PKCE シーケンス
上記のようにリクエスト送付元をcode_verifier
パラメータから検証することで、悪意あるアプリによる認可コードの横取りを防ぐことができる。