OAuth(オー・オース)とは?認証との違いや認可コードフローの仕組み

結論:OAuth(オー・オース)とは、ユーザーがIDやパスワードを相手に教えることなく、特定のアプリに対して「自分のデータを利用する権限」だけを安全に貸し出すための標準的な仕組み(プロトコル)です。

Contents

【誤解】OAuthは「ログイン機能」ではない

Webサービスやアプリを作っていると、必ずと言っていいほど「Googleでログイン」や「GitHubでログイン」といったボタンを見かけるはずです。多くの人が「これがOAuthだ」と認識していますが、実はここには大きな誤解があります。

OAuthの本質は「認可(Authorization)」であり、「認証(Authentication)」ではありません。

この2つは似て非なるものです。セキュリティの世界では明確に区別する必要があります。

Mikoto

え、ちょっと待ってください。「Googleでログイン」っていつも使ってますけど、あれって認証(ログイン)じゃないんですか?

Yachi

画面上はそう見えますよね。でも、裏側で動いているOAuthという仕組み自体は、あくまで「鍵(権限)を渡す」ためのもので、「その人が誰か(身分証明)」を確認するためのものじゃないんです。

  • 認証 (Authentication): 「Who are you?(あなたは誰ですか)」を確認すること。身分証明。
  • 認可 (Authorization): 「What can you do?(あなたは何ができますか)」を許可すること。権限付与。

認証と認可の違い

項目認証 (Authentication)認可 (Authorization)
目的本人確認権限の付与
問いあなたは誰?何をしていい?
現実の例パスポート、免許証の提示映画のチケット、ホテルのカードキー
OAuthの役割対象外(本来は)ここを担当

OAuth(Open Authorization)はその名の通り「認可」のプロトコルです。あくまで「データのアクセス権限を渡す」ことが主目的であり、本来は「この人が本人かどうか」を確認する機能は持っていません。

現在よく見かける「ソーシャルログイン」の多くは、OAuth 2.0の仕組みを土台にしつつ、本人確認の機能を正式に追加したOpenID Connect (OIDC)という規格で動いています。

Yachi

現場で「OAuthでログイン機能を実装しよう」という会話が出たら要注意です。それは古い知識か、セキュリティ的に不十分な実装になりがちです。現代のWeb開発では、ログイン機能には必ず「OpenID Connect」を使うのが鉄則です。

ログインの利便性や安全性を高める「SSO」や「MFA」についてはこちらの記事が参考になります。

概念図解:オフィスビルの「ゲスト入館証」

OAuthの仕組みは、少し抽象的で複雑です。これを直感的に理解するために、厳重なセキュリティゲートがあるオフィスビルへの「ゲスト招待」に置き換えてみましょう。

あなたが社員として働いているビルに、外部の清掃業者が入って会議室を掃除する必要があるとします。このとき、あなたは業者にどうやって入館してもらいますか?

絶対にやってはいけないこと:社員証を貸す

もしあなたが「私の社員証(ID/パスワード)を使って入っていいよ」と現物を渡してしまったらどうなるでしょうか。
業者は会議室だけでなく、あなたの執務エリア、機密書類の保管庫、社員食堂まで、あなたがアクセスできる全ての場所に入れてしまいます。さらに、もしその社員証をコピーされたり紛失されたりしたら、あなたのセキュリティは崩壊します。

これは、アプリ連携のために「Googleのパスワードをそのまま教える」のと同じ行為です。絶対にやってはいけません。

Mikoto

うわ、それは怖すぎますね…。社員証コピーされたら終わりじゃないですか。

Yachi

そうなんです。でもOAuthがない時代は、ユーザーにIDとパスワードを直接入力させるアプリが平気で存在していたんですよ。

正しいやり方:受付で「入館証」を発行する(OAuth)

通常は、以下のような手順を踏むはずです。これがまさにOAuthの仕組みです。

  • 1. 依頼: 業者が「掃除をしたいので入れてください」と来る。
  • 2. 確認: ビルの受付(認可サーバー)が、あなた(社員)に「この業者を入れていいですか?」と確認を取る。
  • 3. 同意: あなたが「OKです」と承認する。
  • 4. 発行: 受付が業者に対して、「ゲスト入館証(アクセストークン)」を発行する。
  • 5. 利用: 業者はその入館証を使ってゲートを通り、会議室へ向かう。

この「ゲスト入館証」には、社員証とは決定的に違う優れた特徴があります。

  • Scope(範囲制限): 「会議室エリア」にしか入れない設定ができる。機密エリアには入れない。
  • Expire(有効期限): 「今日の17時まで」といった期限があり、それを過ぎると無効になる。
  • Revoke(無効化): 万が一業者が怪しい動きをしたら、あなたの社員証を変えることなく、その入館証だけを即座に無効にできる。

OAuthとは、このように「マスターキー(ID/パスワード)を守りながら、限定的な権限(アクセストークン)だけを安全に渡す仕組み」なのです。

OAuth 2.0の仕組み:4つの役割と認可フロー

ここからは、実際のWeb開発の現場で使われる用語とフローを見ていきましょう。
OAuth 2.0の仕様書(RFC 6749)では、4つの登場人物(ロール)が定義されています。

ここでは、「日程調整ツール(クライアント)」が、あなたの「Googleカレンダー(リソース)」の予定を読み取って空き時間を提案する、というシナリオで解説します。

4つの登場人物 (Roles)

  • 1. Resource Owner (リソースオーナー)
    あなた(ユーザー)です。データの持ち主であり、権限を与える決定権を持っています。
  • 2. Client (クライアント)
    データを欲しがっているアプリ。ここでは「日程調整ツール」です。ブラウザ上で動くWebアプリやスマホアプリなどを指します。
  • 3. Authorization Server (認可サーバー)
    同意画面を表示し、トークンを発行するサーバー。ここでは「Googleの認証システム」です。
  • 4. Resource Server (リソースサーバー)
    実際にデータが保管されている場所。ここでは「GoogleカレンダーAPI」です。

認可コードフロー (Authorization Code Grant)

OAuthにはいくつかのフローがありますが、Webアプリで最も一般的で安全なのが「認可コードフロー」です。

Mikoto

「認可コード」…? いきなり難しくなってきました。

Yachi

ここが一番の難所であり、一番重要なポイントです。「なぜわざわざ面倒な手順を踏むのか」を意識しながら見ていきましょう。

1. Authorization Request(連携の開始)

ユーザーが日程調整ツールで「Googleカレンダーと連携する」ボタンを押します。
ツールは、ユーザーをGoogleの認可サーバー(受付)へ転送(リダイレクト)させます。
URLには以下のような情報が含まれます。

  • client_id: 「私は日程調整ツールです」という名乗り
  • scope: 「カレンダーの読み取り権限をください」
  • redirect_uri: 「終わったらこのURLに戻してください」

2. Authentication & Consent(同意)

ユーザーの画面はGoogleのページに切り替わります。ここでユーザーはGoogleにログインし、「日程調整ツールがカレンダーの参照を求めています。許可しますか?」という同意画面(Consent Screen)を確認し、「許可」を押します。

3. Authorization Code Grant(認可コードの発行)

Googleはユーザーをツール側の redirect_uri に戻します。このとき、URLのパラメータに「認可コード (Authorization Code)」という短い文字列(引換券)を付与します。
これが「認可コードフロー」と呼ばれる所以です。まだアクセストークンは渡されません。

4. Token Request & Exchange(トークンの交換)

ツール(サーバー側)は、受け取った「認可コード」と、自分しか知らない秘密の鍵「クライアントシークレット」をセットにして、Googleの認可サーバーに裏側から直接(バックチャネルで)送信します。
「ユーザーから貰った引換券と、私の身分証を持ってきたので、トークンをください」というリクエストです。

5. Access Token Issue(アクセストークンの発行)

Googleは内容を検証し、問題なければ「アクセストークン (Access Token)」を発行してツールに返します。

6. Resource Access(API利用)

以降、日程調整ツールはアクセストークンを使ってGoogleカレンダーAPI(リソースサーバー)にアクセスし、予定データを取得できるようになります。

なぜ「認可コード」を挟むのか?

Mikoto

ちょっと待って、手順3で引換券をもらって、手順4でわざわざ交換してますよね?最初から手順3で「アクセストークン」をくれれば早くないですか?

Yachi

鋭いですね!実は昔はそういう手順(インプリシットフロー)もあったんです。でも、それだとURLの履歴に大事な「鍵」が残ってしまうリスクがあるんです。

「認可コード」という一時的な引換券をユーザー経由(ブラウザのURL)で渡し、本物の鍵(トークン)はサーバー同士の直接通信でこっそり受け渡すことで、安全性を担保しているのです。

Yachi

個人的には、セキュリティ要件が厳しい現代のWeb開発において、特別な理由がない限り「認可コードフロー(+ PKCE)」一択で良いと考えています。ブラウザのURLバーにアクセストークンが表示される古いやり方は、今では非推奨になっています。

【ここでのポイント】OAuth 2.0の認可コードフローは、「ユーザーのブラウザ経由で引換券(認可コード)を渡し」「サーバー間の裏通信で本物の鍵(アクセストークン)を受け取る」という2段階認証を行うことで、鍵の盗難を防いでいます。

データの受け渡しに使われる「API」の基本はこちらの記事で解説しています。

ID/パスワード共有の廃止と歴史的背景

なぜこれほど面倒な手順を踏むのでしょうか。それは、OAuth以前のインターネットが「パスワード共有」という非常に危険な状態にあったからです。

Basic認証時代のアンチパターン

かつて、ある写真現像サービスがFlickr上の写真を印刷しようとした場合、ユーザーに「FlickrのIDとパスワード」を直接入力させていました。
これは、外部のアプリ開発者にあなたの全権限を預けることを意味します。

  • アプリ開発者が悪意を持てば、写真を全て削除したり、アカウントを乗っ取ったりできます。
  • パスワードを変更すると、連携していた全てのアプリが動かなくなります。

OAuth 2.0がもたらしたメリット

OAuthの登場により、パスワードを教えることなく連携が可能になりました。特に2012年に標準化されたOAuth 2.0は、現在のWebサービスの基盤となっています。

  • 1. Scope(権限の最小化)
    「カレンダーの読み取り」は許可するが「メールの読み取り」は許可しない、といった細かい制御が可能になりました。ユーザーは必要最小限の権限だけを渡せます。
  • 2. Revoke(個別の無効化)
    「あの日程調整ツール、もう使わないな」と思ったら、Googleの設定画面からそのツールの連携だけを解除できます。パスワードを変更する必要はありません。
  • 3. 実装の簡素化(1.0からの進化)
    2007年のOAuth 1.0は、署名計算(暗号化処理)が非常に複雑で、開発者泣かせでした。OAuth 2.0では通信路の暗号化をSSL/HTTPSに任せる(Bearer Token仕様)ことで、開発者が扱いやすいシンプルな仕組みになり、スマホアプリでの採用が爆発的に普及しました。
OAuthの安全性を支える「SSL/TLS」の仕組みについてはこちらの記事もチェック!

よくある質問 (FAQ)

アクセストークンの有効期限が切れたらどうなりますか?

A: リフレッシュトークンを使って再発行します。
セキュリティのため、アクセストークンの寿命は短く(例:1時間)設定されることが多いです。期限が切れるたびにユーザーに「許可」ボタンを押させるのは不便なので、「リフレッシュトークン (Refresh Token)」という長期有効な更新用チケットを最初に一緒に発行しておくのが一般的です。アプリはこれを使って、裏側で自動的に新しいアクセストークンを取得し続けます。

「認可」と「許可」は違うのですか?

A: 日常会話では同じですが、IT用語としては「認可」を使います。
英語の「Authorization」の訳語として、情報セキュリティ分野では「認可」が定着しています。システムがリソースへのアクセス制御を行うプロセス全体を指す言葉です。一方、ユーザーが同意画面で「OK」を押す行為は「Consent(同意)」や「Permission(許可)」と表現されます。

OAuthを使えば絶対に安全ですか?

A: 仕組みは安全ですが、万能ではありません。
OAuth自体は堅牢なプロトコルですが、実装ミスやフィッシング詐欺のリスクは残ります。
例えば、偽サイトが本物そっくりの「認可画面」を表示して、ユーザーに許可ボタンを押させようとする攻撃(Consent Phishing)があります。ユーザーとしては、連携ボタンを押した後に表示される画面で「アプリ名」と「求められている権限の内容」を必ず確認する癖をつけることが重要です。


まとめ

OAuthは、現代のWebサービス連携において空気のように当たり前に存在していますが、その裏側では「ユーザーの鍵(パスワード)を守る」ために計算された精密なフローが動いています。

  • 認証(本人確認)ではなく、認可(権限付与)の仕組みである。
  • パスワードを渡すのではなく、権限範囲と期限付きの「入館証(トークン)」を発行する。
  • 認可コードフローを使うことで、トークンの盗難リスクを最小限に抑えている。
Yachi

個人的には、OAuthの仕組みを理解することは、エンジニアとして「セキュリティ意識」を高める一番の近道だと思っています。単にライブラリを使って実装するだけでなく、「今、鍵がどこを通って、誰に渡っているのか」をイメージしながら設計してみてください。それが堅牢なアプリケーションを作るコツです。

この記事を書いた人

生成AIコンサルタント / テックリード

外資系IT企業にて社内の生成AI活用推進と
生成AIプロダクト開発リードを担当。

かつてはWeb系のエンジニアとして、
モダンな技術スタックでのシステム開発から
数百億レコード規模のデータベース運用までを
フルスタックに経験。

「コードも書けるコンサルタント」として、
活用論と実装論の両面から、
現場で使えるIT知識を発信します。

私と本サイトの詳細は運営者情報をご確認ください。

Contents