OAuthの歴史:パスワードからグローバルスタンダードへ
毎日目ににする光景です。「Googleでログイン」や「GitHubでログイン」をクリックする。パスワードを入力することなく、瞬時にサイトへアクセスできる。
これはOAuthのおかげです。これはセキュリティのグローバルスタンダードです。しかし、最初からこうだったわけではありません。巨大な問題を解決するために進化してきたのです。
パスワードの問題点
初期の頃は、ウェブサイトごとに新しいパスワードを作成していました。これにより、3つの大きな問題が発生しました。
- あらゆる場所で同じパスワードを使用すること。 一つのサイトから情報が漏洩すると、すべてのカウントが危険にさらされます。
- パスワードを忘れてしまうこと。 「パスワードを忘れた場合」をクリックして過ごす時間が、ウェブを利用する時間よりも長くなっていました。
- ウェブサイトがあなたの生のパスワードを閲覧できてしまうこと。 サイトがハッキングされると、パスワードが盗まれてしまいます。
セキュリティの進化
Basic Auth(基本認証): リクエストのたびにユーザー名とパスワードを送信します。HTTPSを使用していない場合、ハッカーにすべてを見られてしまう可能性がありました。
セッションクッキー: 一度ログインするとセッションIDを取得します。以前よりは改善されましたが、クッキーはXSSやCSRFなどの攻撃によって盗まれる可能性があります。また、あるサイトがあなたのログイン情報を使って別のサイトと通信することもできませんでした。
APIキー: ウェブサイトに特別なキーを渡します。パスワードを送信しなくて済むため、これは改善でした。しかし、APIキーは権限が強すぎる場合が多いのです。アプリにAPIキーを渡すと、そのアプリがあなたのメールを読んだり、メッセージを送信したり、アカウントを削除したりする権限を持ってしまう可能性があります。それは、ホテルのバレーパーキングに車の鍵を預けるようなものですが、その鍵で自宅のドアまで開けられてしまうようなものです。
OAuthによる解決策:バレーキー(Valet Key)
OAuthはゲームのルールを変えました。パスワードを渡す代わりに、「トークン」を渡します。これを「バレーキー」と考えてみてください。バレーキーは、ドライバーがあなたの車を駐車することを許可しますが、トランクを開けたり、自宅にアクセスしたりすることはできません。
OAuthの実践的な仕組み:
- Canvaを使ってGoogleから写真を取り込みたい。
- CanvaがGoogleに許可を求める。
- Googleがあなたに尋ねる:「Canvaがあなたの写真を表示することを許可しますか?」
- あなたは答える:「はい。ただし、表示のみ。削除はさせないでください。」
- GoogleがCanvaに特定のトークンを渡す。
CanvaはあなたのGoogleパスワードを一切目にすることはありません。たとえハッカーがそのトークンを盗んだとしても、短期間写真を表示できるだけです。パスワードを変更したり、お金を移動させたりすることはできません。
現代のセキュリティ:PKCE
モバイルアプリやウェブアプリには弱点があります。シークレット(秘密情報)をうまく隠しきれないのです。これを解決するために、PKCE(Proof Key for Code Exchange)を使用します。
これは予約システムのように機能します:
- アプリが秘密のコード(verifier)を作成します。
- アプリがそのコードのハッシュ化されたバージョン(challenge)をGoogleに送信します。
- アプリがトークンを要求する際、元の秘密のコードを送信します。
- Googleは、そのコードがチャレンジと一致するかどうかを確認します。
一致すれば、Googleはそれが同じアプリであることを認識します。一致しなければ、Googleはリクエストをブロックします。これにより、ハッカーが認可コードを盗むことを防ぎます。
OAuthのロードマップ
- 2007年 (OAuth 1.0): 非常に複雑で、高度な数学を用いていました。
- 2012年 (OAuth 2.0): より高速で簡単になりました。トークンを使用し、HTTPSを必須としました。
- 2016年 (OAuth 2.0 + PKCE): モバイルおよびモダンなウェブアプリ向けのセキュリティが追加されました。
- 2023年 (OAuth 2.1): 新しいゴールドスタンダード。古くて安全でない手法を排除しています。
核心となる教訓: 他のアプリにパスワードを渡してはいけません。期限付きの限定的なチケットを渡しましょう。そうすれば、コントロール権を維持できます。
Source: https://dev.to/gophernment/oauth-elaaaebbprawatisaastr-cchaakrhasphaan-suumaatrthaanolk-16b4
