OAuth 1.0から2.1への展開の道のり
背景
2010年にOAuth Authorization Specification version 1.0 (rfc 5849) が公開され、その2年後に、よりシンプルで使いやすいOAuth 2.0 仕様が公開され (rfc 6749) 、インターネット上で最も身近で広く使われているバージョンになりました。当時は "Ajax applications" と呼ばれ、CORS (Cross-Domain Resource Sharing) はまだ W3C の標準規格ではありませんでした。
このような状況の変化に対応するため、OAuth コミュニティは何年も前から OAuth 仕様にパッチを当て、拡張してきました。OAuth の状況は拡大し、OAuth 2.0 を中核とする拡張認可仕様がどんどん登場しています。そして、OAuth 2.0全体がまるで迷路のように見えるのです。
進化するOAuth2.0
OAuth 2.0のコア仕様(RFC 6749)では、以下のように、認証コード、暗黙の了解、パスワード、クライアント認証の4種類の認証が定義されています。
OAuth 2.0では、最も安全でよく使われるモデルは認証コードモデルです。ローカルアプリ、モバイルアプリの場合、通常は暗黙の認証やパスワード認証を使います。これらはパブリッククライアントなので、本質的に安全ではなく、クライアントの機密を守ることはできませんが、他に良い解決策がなかったのでしょう。
OAuth 2.0のパブリッククライアントの認証セキュリティ問題を解決するために、Proof Key for Code Exchangeと呼ばれるPKCE (RFC 6379) プロトコルが作られました。PKCEの原理は、パブリッククライアントに対して、client_secretが使用できない場合、クライアントは自分で作成した証明(code_verifier)を認可サーバーに提供し、認可サーバーはその暗号化アルゴリズムを使ってクライアントを確認するというものです。
その後、「OAuth 2.0 for Native Apps" (RFC 8252)」という仕様が公開され、ネイティブアプリでも認証コード+PKCEを使うことが推奨されるようになった。
テクノロジーの進化に伴い、スマート TV やプリンターなどのデバイスは、従来の PC や電話とは異なり、ブラウザやキーボードがないため、OAuth 2.0 の通常の認証モデルでは間違いなく不十分であり、そのため Device Grant というデバイス認証シナリオが登場します。
OAuth 2.0 セキュリティベストプラクティス(セキュリティBCP)では、暗黙の了解とパスワードによる認証は非推奨とされ、すべてのクライアントが認証コード+PKCEの組み合わせを使用することが推奨されています。
最終的に、調整されたOAuth認証モデルは、OAuth2.1の考え方である、セキュリティベストプラクティス(BCP)を参考に、最良のものを取り入れ、最悪のものを取り除く、以下の3つに変換され、より合理的なものになるでしょう。
概要
結局、OAuth 2.1はOAuth 2.0を覆すものではなく、安全でない認可処理を取り除き、そのセキュリティベストプラクティス(BCP)に基づいた拡張機能を統合し、迷宮のように複雑だったOAuth 2.0仕様をより簡単で安全な認可仕様にするためのものです。
参考文献
OAuth 1.0 プロトコル
OAuth 2.0認証フレームワーク
OAuth 2.1 認証フレームワーク draft-ietf-oauth-v2-1-04
OAuth 2.1の時代がやってきた
ネイティブアプリ向けOAuth 2.0
OAuth 2.0 デバイス認証グラント
OAuthパブリッククライアントによるコード交換のための証明キー
以上が今回の記事の全内容です。皆様の学習のお役に立てれば幸いです。また、スクリプトハウスを応援していただければ幸いです。
関連
-
UTC時間、GMT時間、ローカル時間、Unixタイムスタンプの具体的な使用方法
-
Burpsuite Intruder Moduleの詳細。
-
UltraEdit エディタ無料起動方法
-
ブロッキング、ノンブロッキング、同期、非同期を1つの記事で理解する
-
Centos7でVscodeが反応しない不具合とその解決方法
-
WSL2の他ホストへのVSCodeリモート接続問題
-
TCPとUDPのプロトコルの原理と違いについての深い理解
-
ハミングコードの符号化原理の解析と検証方法
-
[解決済み】「collect2: error: ld returned 1 exit status」とはどういう意味ですか?
-
C1ミッション01:ゲームアーカイブスの改造方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Xmind無償起動方法(推奨)について
-
BurpSuiteのインストールと設定の詳細
-
ゲートウェイ・ゲートウェイ原理の徹底分析
-
Git.gitignore開発必携アドバイス集
-
VSCodeリモートサーバ接続エラー:Could not establish connection to VSCode
-
roolupを使ったライブラリの構築(ステップバイステップの実装)
-
12 バックエンド管理システム開発のためのフロントエンドフレームワーク(要約)
-
Visual Studio 2019 ネイティブで Azure Functions を実行できない場合の解決方法
-
MATLABチュートリアル データ操作 変数操作と行列表現 詳細
-
[解決済み】コンストラクタが与えられた型に適用できない?