PKCE 【Proof Key for Code Exchange】
概要
PKCE(Proof Key for Code Exchange)とは、OAuth 2.0の拡張仕様で、認可コード横取り攻撃を防止する仕組みを定義したもの。スマートフォンなどで悪意あるアプリが認可コードを不正に取得するのを防ぐ。IETFによってRFC 7636として標準化されている。OAuthはネットワーク上のサービス間で横断的に権限の認可(authorization)を行うための手順やデータ形式を定めた標準規格の一つで、利用者が認可サーバに認可コードを要求し、サーバが認可コードを発行するという手順が含まれる。
スマートフォンなどでは同じURIスキームを処理するアプリを複数登録することができるものがあるため、Webブラウザなどから発行を要求した認可コードを悪意のあるアプリが受領してしまい、利用者になりすましてアクセス権限を行使する「認可コード横取り」攻撃が可能となってしまう。
PKCEの仕組み
PKCEではこれを防ぐため、利用者が操作するアプリが認可コードを要求する際に「client_verify」という毎回異なるランダムな値と、そのハッシュ値である「client_challenge」を生成する。認可サーバへ認可コードを要求する際には client_challenge を通知する。
認可コード受領後、アクセストークンの発行を依頼する際には認可サーバに client_verify を通知する。サーバ側では client_verify からハッシュ値を生成し、先に受け取っていた client_challenge に一致すれば、認可コードを持っているのが同じ相手であると確認できる。
端末に悪意のあるアプリがいたとしても最初に利用者が行う認可コード請求のやり取りを盗み見ることはできないため、正しい client_verify の値は分からない。認可コードを横取りしたとしても認可サーバに偽物であることが露見してしまい、アクセストークン発行など権限の行使は拒否される。
(2024.8.31更新)