世界を動かす技術を、日本語で。

OAuthとは何ですか?

2026年2月21日原文(leaflet.pub)

概要

OAuthの本質は「安全な委任」の標準化 歴史的背景と設計理由を中心に解説 OpenID Connectとの関係や進化の経緯 具体的なユースケース動機の紹介 複雑化の理由と設計思想の整理

OAuthの歴史と設計理由

  • OAuth は、ユーザーの パスワードを渡さず に他サービスへ権限委譲するための標準仕様
  • 2000年代半ば、 Twitter やFlickrなど多くのWebサービスが 外部アプリからのアクセス を求められる状況
  • 当時は各サービスが 独自仕様や非安全な方法 (パスワード直渡し等)を採用
  • これを解決するため、 共通の安全な枠組み としてOAuthが誕生
  • XKCD 927「標準の乱立」ジョークの通り、標準化の必要性の高まり

OAuthのコアアイデア

  • ユーザーの 明示的な同意 のもと、 委任先(アプリ)多用途な秘密情報(トークン) を発行
  • 委任先はそのトークンを使って、 ユーザーの代理 としてAPI等にアクセス
  • これにより パスワードを共有せず に安全な連携が可能
  • 具体的な流れ
    • ユーザーがアプリに権限付与を許可
    • アプリは発行されたトークンでAPIにアクセス
  • 設計動機 :Web 2.0時代の多様なクライアント(デスクトップ、ウェブ等)対応

OpenID Connectとの関係

  • OpenID Connect(OIDC) はOAuthの上に構築された「サインイン」用仕様
  • OIDCの本質は「 マジックリンク認証」に近い
    • ユーザーしかアクセスできない場所(例:メール)に秘密を送る
    • その秘密を提示できることで本人確認
  • OIDCは 認証(Authentication)、OAuthは 認可(Authorization) に主眼
  • OIDCの登場で、OAuthの応用範囲がさらに拡大

標準化の経緯と「フレームワーク」的性質

  • OAuthは 厳密な仕様 というより フレームワーク的 な側面
    • すべての実装が全機能を持つ必要はない(HTMLと同様)
  • 標準化には 合意形成・用語整理・UX設計 など多様な要素が関与
  • 標準の策定は セキュリティや相互運用性 確保のため、複雑化しがち
  • OIDCはOAuthとOpenIDの長所を組み合わせた進化形

OAuthが複雑に見える理由と本質

  • 本質は「 安全な委任」だが、標準化の過程で 多くの細則や例外 が追加
  • 実装時は「 何をしたいか」という目的意識が重要
  • 標準の複雑さに惑わされず、「 本当に必要な要件」を見極めることが肝要
  • 複雑に見えるのは、 実際の目標や動機が隠れてしまう から

まとめ:OAuth設計の根本動機

  • パスワード共有を避けたい という明確な要請
  • 安全性と利便性 の両立
  • 多様なクライアント・サービス連携 への対応
  • 標準化による相互運用性とセキュリティ向上
  • なぜこの設計なのか?」を理解することで、OAuthの本質が見えてくる

Hackerたちの意見

OAuthって実はすごくシンプルなんだよね。でも、シンプルになるまでに、誰も説明してくれない複雑な詳細をたくさん理解しなきゃいけないんだ。

「Twitterでログイン」っていうのが新しい革命的なアイデアだった頃に、OAuthログインを作ったことを思い出すよ。その頃は、詳細を扱うためのライブラリなんてなかったから、TwitterやFacebookのエンジニアが書いたブログを元に直接作ってたんだ。あの頃はまだ標準化もされてなかったと思う。あの辛い経験のおかげで、今はOAuthが本当にシンプルに感じるようになった。V2でかなり整理されたしね。

私にとって、MicrosoftのOAuth 2.0に関するページを読むのがすごく助けになったよ。イラスト付きのフローチャートがあって、それからRFCに戻るといい感じ。とはいえ、非自明な詳細がたくさんあって、特に多くの場合、OAuth 2.0を基にしたOIDCを扱わなきゃいけないから、急にJWKやら何やらに直面することになるんだよね。

OAuthについて、謙虚に言うと、もっと良いアナロジーを借りたいんだけど、ダグラス・クロックフォードからのもので、彼が関数型プログラミングのモナドについてコメントした内容をアレンジすると、こんな感じになる。「OAuthはシンプルなアイデアだけど、呪いがある:理解すると、説明する能力を失う。」

実装が正しいかどうかをチェックするためのバリデーションやテストスイートって、どこかにありますか?

たくさんの人が苦労する理由は、消費者の視点からOAuthを始めるからだと思う。つまり、彼らはデータをリクエストする第三者で、OAuthの実装はリソース保持者によって強制されるから、明確な理由がない多くの手続きを踏まなきゃいけない。サービスプロバイダーやリソース保持者の視点からOAuthを始めると、全てがクリアになるよ。ウェブセキュリティもそんな感じで、CORSやHTTPSのような問題に直面する人は、セキュリティの問題を解決しようとしているわけじゃなくて、上流のプロバイダーがユーザーのデータを信頼されるためにセキュリティ基準を上げるように強制されているからなんだ。

うまく解決できるといいですね!ありがとう、でもできなかった。OAuthとOpenID Connectは、それを扱わなきゃいけない人間の脳に対するサービス拒否攻撃だよ。

自宅のラボでOIDC(Autheliaを使って)を使ってるけど、すごく簡単に扱えるよ。何をやってるのかよく分からないけど、ドキュメントを信じてるし、特に難しい設定ってわけでもないんだ。

AはBにアカウントを持ってて、Cにも別のアカウントがある。AはCにBのデータにアクセスさせたい(またはAの代わりにBにデータを送信させたい)。BはCがAの代わりに行動しているとどうやって確信できるの?Aはリスクを減らすためにCに特定のデータだけにアクセスを許可することはできるの?その三者間の交渉を可能にするプロトコルがOAuthなんだ。ほとんどの仕様書と同じように、複雑さは後の年に、何千人ものユーザーや複雑なエッジケースを持つ企業によって追加されていくんだ。彼らが議会を支配していて、彼らのニーズが新しいバージョンを推進してる。だから、ほとんどの仕様を学ぶ最良の方法は、古い仕様から新しいものに学ぶことだよ。OAuth2を最初に読んだり使ったりすると、余計な複雑さに圧倒されるから、現役の専門家もそんな風には始めてないよ。追いつきたいなら、いつも古い仕様やバージョンから始めるのがいいよ。

OAuthをクライアントとサーバーの両方で実装したことがあるけど、一番複雑なのは散らばったドキュメントや、異なるプロバイダーからのちょっとしたトラブルだね。全体としては、そんなに複雑じゃないんだ。

いや、それはSAMLのことを考えてるよ。

完全に同意だね。OAuth、Auth0、Okta、OIDC。

Hacker Newsで議論の続きを見る