【おーおーすぴくし】

OAuth PKCE とは?

公開:
💡 認証コードに南京錠をかけて安全に受け取る仕組み
📌 このページのポイント
OAuth PKCE の認証フロー アプリ (SPA/ネイティブ) 認可サーバー (Google等) ① code_challenge (verifierのSHA256) ② 認可コード返却 悪意あるアプリ コードを横取り! code_verifier を知らないので 交換できない アクセス トークン取得 ③ code_verifier +認可コード送信 → 照合成功! PKCE のポイント code_verifier(ランダム文字列)→ SHA256 → code_challenge を事前に登録 認可コードを横取りされても、code_verifier なしではトークン取得不可
PKCEによる認可コード横取り攻撃の防止フロー
ひよこ ひよこ
ペンギン先生、PKCEって何のためにあるの?
ペンギン先生 ペンギン先生
OAuth 2.0で認可コードを受け取るとき、そのコードを悪意あるアプリに横取りされるのを防ぐための仕組みだよ。
ひよこ ひよこ
認可コードって横取りされることがあるんだね!
ペンギン先生 ペンギン先生
スマホアプリだとカスタムURLスキーム(myapp://callback)を使って認可コードを受け取るけど、悪意あるアプリが同じURLスキームを登録していたら、そっちにコードが飛んでいってしまうんだ。
ひよこ ひよこ
じゃあPKCEはそれをどうやって防ぐの?
ペンギン先生 ペンギン先生
認証開始前にアプリがランダムな文字列(code_verifier)を生成して、そのSHA256ハッシュ(code_challenge)を認可サーバーに送っておくんだ。そして認可コードを受け取った後、元のcode_verifierをトークンリクエストに添えると、サーバーがハッシュを照合して本物かどうか確認するよ。
ひよこ ひよこ
横取りした人はcode_verifierを知らないから、トークンに交換できないんだね!
ペンギン先生 ペンギン先生
正解!PKCEは「先に鍵の形(ハッシュ)を登録しておいて、後で鍵の実物(元の値)を提示させる」南京錠のような仕組みだよ。RFC 7636として標準化されていて、クライアントシークレットを安全に保管できないパブリッククライアントでは必須とされているんだ。
ひよこ ひよこ
SPAやスマホアプリを作るときは必ず使わないといけないんだね!
ペンギン先生 ペンギン先生
そうだよ。2023年のOAuth 2.1ではPKCEがすべての認可コードフローで必須になったんだ。セキュリティを強化しながら実装もシンプルにしてくれる、よくできた仕様だよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
OAuth PKCE」って出てきたら「認可コードを横取りされないようにする安全装置」と思えればだいたいOK!
📖 おまけ:英語の意味
「Proof Key for Code Exchange」 = コード交換のための証明鍵
💬 「証明鍵(Proof Key)でコード交換(Code Exchange)を守る」という直球な名前だよ
← 用語集にもどる