OAuthは認証じゃない? 認証と認可の違い、OAuthとOIDCの関係を整理する

目次

「OAuth認証」と呼んでいませんか?

「うちのサービス、OAuth認証でGoogleログインできるようにしました」。この説明、実は技術的に正確ではありません。OAuthは「認証」ではなく「認可」のフレームワークだからです。

「認証と認可って違うの?」「OAuthで認証しちゃダメなの?」「じゃあGoogleログインは何なの?」 ― こうした疑問を一つずつ整理していきます。

認証と認可の違い ― 30秒で理解する

まず、この2つの違いを日常の例で考えましょう。

【認証(Authentication)】= 「あなたは誰?」
ホテルのフロントでパスポートを見せて、本人確認する
→ 身元を証明すること

【認可(Authorization)】= 「あなたは何ができる?」
ホテルのカードキーで、自分の部屋だけ入れる(他の部屋は入れない)
→ 権限を与えること
項目 認証(Authentication) 認可(Authorization)
問い あなたは誰ですか? あなたは何をしていいですか?
目的 本人確認 アクセス権限の付与
日常の例 パスポート、社員証 部屋のカードキー、入館証
技術の例 ID/パスワード、生体認証 OAuth、IAMポリシー

認証は「誰か」を確認すること。認可は「何ができるか」を決めること。この2つは別の概念です。

OAuthは「認可」のフレームワーク

OAuth 2.0は、「あるサービスが持っているリソースへのアクセス権を、別のサービスに委譲する」ための仕組みです。

具体例で見てみましょう。

【OAuthの典型的な流れ】

1. あなたが写真編集アプリを使いたい
2. 写真編集アプリが「Googleフォトの写真を読み取っていいですか?」と聞く
3. あなたがGoogleの画面で「許可」を押す
4. 写真編集アプリがGoogleフォトの写真にアクセスできるようになる

→ これは「認可」。写真編集アプリに「Googleフォトを読む権限」を与えた
→ 写真編集アプリは「あなたが誰か」を知る必要はない

OAuthが発行するのはアクセストークンです。このトークンは「Googleフォトの写真を読み取れる」という権限情報を持っていますが、「このトークンの持ち主が誰か」という情報は含んでいません

ここがポイントです。アクセストークンは「鍵」のようなもの。鍵を持っていればドアは開くけれど、鍵は「誰が持ち主か」を教えてくれない。だからアクセストークンが盗まれたら、盗んだ人もドアを開けられてしまう

OIDCは「認証 + 認可」のフレームワーク

では「Googleでログイン」は何を使っているのか。答えはOIDC(OpenID Connect)です。

OIDCはOAuthを拡張して「認証」の機能を追加した仕組みです。OAuthの認可フローに加えて、IDトークンを発行します。

項目 OAuth 2.0 OIDC(OpenID Connect)
目的 認可(リソースへのアクセス委譲) 認証 + 認可
発行するトークン アクセストークン アクセストークン + IDトークン
ユーザー情報 含まない IDトークンに含まれる(メール、名前等)
「誰か」が分かるか
典型的な用途 API連携、サードパーティアクセス Googleでログイン、SSOなど

IDトークンはJWT(JSON Web Token)形式で、「このトークンを発行したのはGoogle」「対象ユーザーのメールアドレスはxxx@gmail.com」といった情報が署名付きで含まれています。署名を検証すれば、改ざんされていないことが確認できる。

つまり、「Googleでログイン」を正しく実装するなら、OAuthではなくOIDCを使うべき。OAuthのアクセストークンだけでログインを実装すると、セキュリティ上の問題が生じます。

なぜ「OAuth認証」が危ないのか

OAuthのアクセストークンだけで「認証」を実装した場合、以下のリスクがあります。

トークン置換攻撃

アクセストークンには「誰に対して発行されたか」「どのアプリに対して発行されたか」の情報がありません。悪意あるアプリAで取得したアクセストークンを、別のアプリBのログインに使い回すことが可能になります。

【トークン置換攻撃のイメージ】

1. ユーザーが悪意あるアプリAにOAuthでログイン
2. アプリAがユーザーのアクセストークンを入手
3. アプリAがそのトークンを使って、アプリBにユーザーとしてログイン
4. アプリBはトークンの「持ち主」を確認できないので、そのまま通してしまう

OIDCのIDトークンにはaudience(対象アプリ)やissuer(発行者)が含まれているため、「このトークンはこのアプリ向けに発行されたものか?」を検証でき、この攻撃を防げます。

結局どう使い分ける?

やりたいこと 使うべきもの
「Googleでログイン」を実装したい OIDC
SSO(シングルサインオン)を導入したい OIDC
外部サービスのAPI(Google Drive等)にアクセスしたい OAuth 2.0
自分のAPIへのアクセス制御をしたい OAuth 2.0
ログイン + API連携の両方 OIDC(OAuthの認可機能も含む)

迷ったら「ユーザーが誰かを確認する必要があるならOIDC、リソースへのアクセス権だけが必要ならOAuth」と覚えておけばOKです。

認証・セキュリティの理解を深める関連記事

まとめ:認証ならOIDC、認可ならOAuth

  • 認証 = 「あなたは誰?」認可 = 「あなたは何ができる?」。別の概念
  • OAuthは認可のフレームワーク。アクセストークンは「権限」を持つが「誰か」は分からない
  • OIDCはOAuthを拡張して認証を追加。IDトークンで「誰か」を安全に確認できる
  • OAuthだけでログインを実装するとトークン置換攻撃のリスクがある
  • 「Googleでログイン」はOIDC。「OAuth認証」という表現は技術的に不正確

「OAuth認証」と呼んでしまうこと自体は、開発者の間でも非常によくある混同です。ただ、この違いを理解していないと、認証の実装で本質的なセキュリティホールを作ってしまう可能性がある。認証が必要ならOIDC、認可だけならOAuth。この一行を覚えておくだけで、設計の判断がクリアになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次