クライアントは、URL の非予約文字から 43〜128 文字の code_verifier を生成し、認可リクエストで code_challenge_method=S256 とともに code_challenge = BASE64URL(SHA256(code_verifier)) を送信します。その後、code_verifier をトークンエンドポイントに送ることで所有を証明します。plain メソッドは code_verifier そのものをチャレンジとして送るため、使うべきではありません。
PKCE は、ほかのアプリがリダイレクト URI を横取りできるモバイルアプリ向けに設計されましたが、Web アプリでの認可コードインジェクションも防ぎます。そのため、RFC 9700 はすべてのクライアントに PKCE を推奨しており、OAuth 2.1 のドラフトは必須としています。機密クライアントのクライアント認証に代わるものではなく、チャレンジが送られた場合、認可サーバーは code_verifier を含まないトークンリクエストを拒否しなければなりません。