OAuthとは?権限を貸す仕組みをカードキーにたとえて解説

thoughtfulness

結論: OAuth(オー・オース)とは、「自分のパスワードを他人に教えることなく、特定のデータや機能へのアクセス権限を安全に貸し出す」ための仕組みです。

SNSアカウントを使って別のサービスにログインしたり、Googleカレンダーの予定を外部アプリに表示させたりするとき, 裏側ではこのOAuthが動いています。

この記事では、OAuthが解決した問題から、混同されやすい「認証」との違い、ホテルのカードキーに例えた仕組みの全貌までを詳しく解説します。

Contents

OAuthが必要な理由:パスワードを預けるリスク

なぜOAuthという複雑な仕組みが必要なのでしょうか。その理由は、一言で言えば「セキュリティの確保」です。

OAuthが普及する前、あるサービス(サービスA)が別のサービス(サービスB)のデータを利用したい場合、ユーザーはサービスAに「サービスBsのIDとパスワード」を直接入力して教えるしかありませんでした。

しかし、この方法には致命的なリスクがあります。

  • パスワードの持ち出し: サービスAが悪意を持っていたり、ハッキングされたりすると、サービスBのパスワードが流出する。
  • 権限が強すぎる: パスワードを渡すと、サービスAはサービスBのすべての操作(データの削除や設定変更など)ができてしまう。
  • 連携解除が大変: 連携を止めたい場合、サービスBのパスワードを変更しなければならず、他の連携サービスまで止まってしまう。

これらの問題を解決し、「パスワードを隠したまま、必要な権限だけを、期間限定で渡す」ために作られたのがOAuthです。

「認証」と「認可」の決定的な違い

OAuthを理解する上で、最も重要で、かつ最も多くの人が混乱するのが「認証(Authentication)」と**「認可(Authorization)」**の違いです。

用語意味問いかけ役割
認証本人確認「あなたは誰ですか?」ログイン(ID/パスワード確認)
認可権限の付与「何をしてもいいですか?」データの閲覧・編集の許可

OAuthは、本来「認可」のためのプロトコル(手順)です。

例えば、「Googleアカウントでログイン」という機能。これは「Googleがあなたの身元を保証する(認証)」だけでなく、「そのアプリにあなたのメールアドレスを見る権限を与える(認可)」という、2つの側面を持っています。

Yachi

専門家の間でもこの使い分けは厳密に議論されます。OAuth 2.0自体は認可の仕組みですが、その上に認証の機能を載せた「OpenID Connect(OIDC)」という拡張仕様があり、現在の「SNSログイン」の多くは、このOIDCとOAuthがセットで動いています。

「SSO(シングルサインオン)」や「多要素認証」の基本についてはこちらの記事もチェック!

ホテルのカードキーで例えるOAuthの仕組み

OAuthの動きを理解するには、ホテルのチェックインに例えると非常にスムーズです。

登場人物

  • リソースオーナー(あなた): 宿泊客。
  • クライアント(連携したいアプリ): ホテルの部屋を掃除したい「清掃サービス」。
  • 認可サーバー(SNSなどの運営): ホテルの「フロント」。
  • リソースサーバー(データ本体): あなたの「客室」。

具体的な流れ

  • 1. 認可のリクエスト: 清掃サービス(アプリ)があなたに「お部屋の掃除をしてもいいですか?」と尋ねます。
  • 2. 同意: あなたは「いいですよ」と承諾し、ホテルのフロント(認可サーバー)へ行きます。
  • 3. 認証と承認: フロントで本人確認(ログイン)を行い、「清掃サービスに、私の部屋に入る許可を出してください」と伝えます。
  • 4. アクセストークンの発行: フロントは、あなたのマスターキーを清掃サービスに渡すのではなく、「14時から15時まで、301号室だけに入れるカードキー(アクセストークン)」を発行して清掃サービスに渡します。
  • 5. リソースへのアクセス: 清掃サービスはそのカードキーを使って部屋(データ)に入り、掃除を行います。

この「カードキー(アクセストークン)」こそがOAuthの肝です。清掃サービスはあなたの合鍵(パスワード)を持っていないので、勝手に深夜に部屋へ入ることはできません。また、あなたがカードキーを無効化すれば、パスワードを変えなくても連携を止められます。

アクセストークンとスコープの重要性

OAuthを語る上で欠かせないのが「アクセストークン」と「スコープ」という概念です。

アクセストークン

パスワードの代わりになる「期間限定の引換券」です。これを持っているアプリは、ユーザーに代わってデータにアクセスできます。文字列自体は意味を持たないランダムな記号の羅列であることが多いですが、これが漏洩すると第三者にデータを操作される恐れがあるため、非常に厳重に扱われます。

スコープ(Scope)

「何ができるか」の範囲です。

  • 連絡先の名前だけを見る(Read Only)
  • カレンダーに予定を追加する(Write)
  • メールの送信代行をする(Send)

SNS連携をするときに「このアプリが以下の権限を求めています」という画面が出ますよね?あれが、スコープの確認画面です。必要以上の権限を求めてくるアプリには注意、と言われるのはこのためです。

Yachi

開発者の視点では、セキュリティの原則である「最小権限の原則」を意識する必要があります。アプリを作る際は、本当に必要なスコープだけを要求するようにしましょう。不必要に広い権限を求めると、ユーザーに警戒されて離脱の原因になります。

データの共通規格「JSON」や「Cookie」の仕組みについてはこちらの記事が参考になります。

OAuthの具体的なユースケース

実務や日常で、OAuthはどのように現れるのでしょうか。

1. サードパーティ製ツールの連携

SlackにGoogleドライブのファイルを共有したり、ZoomとGoogleカレンダーを連携させて会議URLを自動発行したりする場合です。Google側のパスワードをSlackやZoomに教えることなく、特定の操作だけを許可しています。

2. スマートホームデバイス

「アレクサ、家の電気を消して」と命令する際、Amazonのサーバーと照明メーカーのサーバーがOAuthで連携しています。Amazonは照明メーカーの管理画面に入るパスワードは知りませんが、「電気を操作する権限」だけを預かっています。

3. モバイルアプリのバックエンド

スマホアプリから自社のサーバーにアクセスする際も、毎回IDとパスワードを送るのではなく、一度ログインした後はアクセストークンを使い回す仕組み(OAuthに準拠した形式)が一般的です。

実装時に注意すべき「脆弱性」と「ハマりポイント」

OAuthは便利な反面、正しく理解して実装しないとセキュリティホールになります。

「リダイレクトURL」の検証不備

ホテルでいう「カードキーの受け渡し場所」を偽装される攻撃(リダイレクトURIの書き換え)があります。開発時には、あらかじめ登録したURL以外にはトークンを送らない設定を徹底する必要があります。

「トークンの保存場所」問題

フロントエンド(ブラウザ)のJavaScriptだけでアクセストークンを管理すると、XSS(クロスサイトスクリプティング)などの攻撃でトークンを盗まれるリスクが高まります。最近では、ブラウザ側にトークンを持たせず、サーバーサイドで管理する構成(BFFパターンなど)が推奨されることがあります。

認可コード横取り攻撃 (PKCE)

スマホアプリなどでOAuthを使う場合、通信を横取りされるリスクがあります。これを防ぐために「PKCE(ピクシー、Proof Key for Code Exchange)」という拡張仕様を使うのが、現在のスタンダードな運用です。

Yachi

初めてOAuthの実装に取り組むなら、RFC(仕様書)をいきなり読むのではなく、Auth0やFirebase Authenticationといった「ID管理サービス(IDaaS)」が提供しているライブラリを使うことを強くお勧めします。自前ですべてを実装するのは、車輪の再発明であるだけでなく、非常に危険です。

「API」の基本や「SSL/TLS」による通信保護については以下の記事で詳しく解説しています。

まとめ:OAuthを避けては通れない理由

現代のWeb開発において、OAuthは「知らなくてもなんとかなる」技術ではなく、避けては通れない必須知識です。

  • ユーザーにとっては: パスワードを漏らすことなく、便利な連携機能を使える安心の仕組み。
  • 開発者にとっては: 他サービスの強力な機能を安全に自社サービスに取り込むためのルール。

「パスワードではなく、権限を閉じ込めたカードキーを渡している」というイメージさえ持っておけば、複雑なシーケンス図を見ても、今何が行われているのかを見失うことはありません。

生成AIのAPI(例えばGPTのAPIなど)を自社ツールに組み込む際も、このトークンベースの考え方が基本となります。認証・認可の概念を整理し、安全なシステム設計に役立ててください。

この記事を書いた人

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

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

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

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

Contents