【おーおーすぴくし】

OAuth PKCE とは?

最終更新:
💡 コードだけでは交換できない、一時的な確認鍵

OAuthの認可コードをトークンに交換するとき、認可リクエストを始めたクライアントが持つ一時的な値を確認する仕組み。横取りされたコードの不正な交換などを防ぐために使う。

📌 このページのポイント
PKCE:コードだけでは交換できないアプリがverifierを作って保持毎回新しく、予測されにくい値にアプリ認可サーバー① challenge + S256を送る② 認可コードを受け取る③ コード + verifierで交換④ 照合成功 → トークン横取りしたコードだけではverifierがないので交換できないchallengeは、S256でverifierから作る
認可・交換の流れを簡略化した図。S256のchallengeはSHA-256の結果をBase64urlで表し、サーバーがコードと関連付けて照合します。
ひよこ ひよこ
PKCEは、何を守るの?
ペンギン先生 ペンギン先生
OAuthの認可コードをアクセストークンへ交換する手続きを守るよ。たとえばスマホアプリで、悪意あるアプリが同じURLスキームを登録すると、戻ってきたコードを横取りされる場合がある。PKCEはコードだけを手に入れても、交換できないようにするんだ。
ひよこ ひよこ
先に、何を用意するの?
ペンギン先生 ペンギン先生
認可リクエストごとに、予測しにくいランダムなcode_verifierを作って保持するよ。S256方式では、その値をSHA-256で変換し、Base64urlで表したcode_challengeを作る。認可リクエストにはchallengeと方式を送るんだ。
ひよこ ひよこ
コードを受け取ったあとは?
ペンギン先生 ペンギン先生
トークンの交換リクエストに、認可コードと元のverifierを添える。サーバーはそのコードに結び付けていたchallengeと、verifierから計算した値を比べるよ。一致しなければ交換を拒否する。鍵の見本を先に預けて、あとで元の鍵を示すイメージだね。
ひよこ ひよこ
秘密のパスワードを埋め込むの?
ペンギン先生 ペンギン先生
アプリ共通の固定した秘密ではなく、リクエストごとに作る一時的な値だよ。ブラウザーのSPAや配布されるネイティブアプリは、アプリ共通のシークレットを秘匿しにくい。RFC 9700のセキュリティ指針では、パブリッククライアントにPKCEを必須とし、機密クライアントにも推奨しているんだ。
ひよこ ひよこ
使えば、OAuthの安全対策は完了?
ペンギン先生 ペンギン先生
PKCEだけで全部は守れないよ。verifierは漏らさず、S256を使う。HTTPS、正確なリダイレクトURIの照合、使うフローに合うCSRF対策なども必要なんだ。OAuth 2.1は2026年10月4日の確認時点では草案なので、実装では公開済みの仕様や最新のセキュリティ指針も確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「PKCE」って出てきたら「認可コードを、一時的な確認鍵を持つアプリだけが交換できる仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Proof Key for Code Exchange」 = コード交換のための証明鍵
💬 認可リクエストごとの一時的な値で、コードをトークンへ交換する手続きを守るよ。

参考資料

← 用語集にもどる