OAuth

OAuthは、パスワードを渡さずに「このサービスが私の代わりに操作してよい」という許可を安全に伝えるための仕組みです。

OAuth のアイキャッチ図解
まずは、こう考えるとつかみやすいです。

OAuthは、ホテルのカードキーに似ています。マスターキー(パスワード)は渡さず、特定の部屋だけ開けられる専用カードを発行することで、必要な範囲だけアクセスを許可します。

ひとことで言うと

OAuthは、あるサービスが別のサービスに「この範囲だけ操作してよい」という許可を、パスワードを渡さずに安全に伝えるための仕組みです。

「Googleでログイン」「GitHubでログイン」というボタンを見たことがあるはずです。 あれはパスワードをそのアプリに渡しているわけではなく、GoogleやGitHubが「このアプリに、この情報へのアクセスを許可する」という証明を発行する流れを使っています。これがOAuthです。

たとえ話でもう少し詳しく

OAuthは、ホテルのカードキーの発行に近いです。

  • お客さんはフロントに本物の鍵(パスワード)を渡さない
  • 代わりに「201号室だけ開けられるカード」を作ってもらい、それをスタッフに渡す
  • スタッフはそのカードで部屋に入れるが、他の部屋には入れない
  • カードは期限つきで、用が済めば返却・無効化できる

Webサービスでも同じです。 「このアプリにGoogleカレンダーの読み取りだけ許可する」と承認すると、アプリはGoogleのパスワードを知らなくても、許可された範囲だけGoogleカレンダーにアクセスできます。 許可を取り消せば、アプリはアクセスできなくなります。

OAuthの大まかな流れ

  1. アプリが「Googleでログイン」ボタンを表示する
  2. ユーザーがGoogleの画面でログインし「このアプリに○○を許可する」と承認する
  3. Googleがアプリに「許可証(アクセストークン)」を渡す
  4. アプリはそのトークンを使って、許可された範囲のGoogleサービスにアクセスする

ユーザーのパスワードはGoogleの外には一切出ません。

よく出る場面・使いどころ

  • 「Googleでログイン」「GitHubでログイン」などのソーシャルログイン
  • 会計ソフトが銀行サービスのデータを自動取得するとき
  • スケジュールアプリが別サービスのカレンダーと同期するとき
  • CI/CDツールがGitリポジトリを操作するとき

似た言葉との違い

  • 認証
    • 「あなたは誰ですか」を確認すること
    • OAuthは「あなたに代わってこのサービスがこの操作をしてよいですか」という許可の仕組み
  • トークン
    • 認証済みの証明として使う小さなデータ
    • OAuthではアクセストークンという形でトークンが発行され、許可の証拠として使われる
  • OpenID Connect
    • OAuthの上に「誰が認証したか」という情報を乗せた拡張仕様
    • 「Googleでログイン」の実装には多くの場合OAuthとOpenID Connectが組み合わされている

実務で気にするポイント

  • 許可するスコープ(範囲)は必要最小限にする
  • アクセストークンには有効期限を設け、不要になったら取り消す
  • ユーザーが許可を取り消せる画面を用意する
  • OAuthはあくまで「許可の仕組み」であり、それ単体では認証の完全な代替にはならない

注意: OAuthを「Googleでログインするだけの技術」と思っていると、設計の落とし穴にはまることがあります。OAuthは「誰かに代わって操作する許可を与える」仕組みです。実装する場合は、スコープの設計・トークン管理・フィッシング対策など、セキュリティの考慮が必要です。