🆔
OAuthとOpenID Connectの違いを整理してみた
「OAuth認証」という言葉、よく聞きませんか?
でも実はそれ、正確には OAuthではなくOpenID Connect(OIDC)の話 かもしれません。
この記事では、以下を中心に整理していきます:
- OAuthとは何か?
- OAuth認証って本当に認証なの?
- OpenID Connectは何が違うのか?
- 実装上どんな点に注意すべきか?
💡 この記事は、実際にOAuth/OIDCを実装しながら学び直した際に読んだ
📘 OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本
を参考に、自分なりにインプットを整理したものです。
書籍もとても分かりやすいので、さらに深く知りたい方にはおすすめです!
✅ OAuthとは?
OAuthは**「認証」ではなく「認可」**のための仕組みです。
本来は「このアプリにこのユーザーの情報へアクセスさせていいですか?」をユーザーが許可する仕組み。
たとえば:
- 画像加工アプリがGoogle Photoの画像にアクセスしたい
- ユーザーが「このアプリに読み取りだけならOK」と許可する
- アプリはアクセストークンを使ってAPIにアクセス
この時、アプリが「ユーザーが誰か」を識別できるわけではないのがポイントです。
✅ OAuth認証とは?
OAuthを使ってユーザー情報(プロフィールAPIなど)にアクセスすれば、結果として「誰か」が分かることがあります。
しかしこれは副次的な効果であり、OAuth自体は「認証のための設計」ではありません。
問題点:
- 実装によっては他人になりすませるリスクがある(アクセストークンの入れ替えなど)
- ユーザーIDがどこまで保証されているかは不明
- 署名や検証が存在しない
✅ OpenID Connect(OIDC)とは?
OpenID ConnectはOAuth2.0を拡張して「認証」も可能にした仕様です。
OIDC = OAuth2.0 + IDトークン + UserInfoエンドポイント
主な追加要素は以下の2つ:
1. IDトークン(JWT形式)
- 発行:IDプロバイダー(例:Google、LINEなど)
- 利用者:クライアント(リライングパーティ)
- 内容:ユーザーID(sub)、発行者、期限、署名など
- 形式:JWT(JSON Web Token、通称「ジョット」)
2. UserInfoエンドポイント
- アクセストークンでアクセスできる
- ユーザーのプロフィール情報が返る(例:名前、メールアドレスなど)
- subクレームが必ず含まれる
✅ OAuthとOIDCのフロー比較
✅ IDトークンの構造をもう少し詳しく
IDトークンはJWT(JSON Web Token)形式で、次のような情報を含みます:
-
sub
:ユーザーを識別する一意のID -
name
:ユーザーの名前 -
email
:メールアドレス -
iss
:発行者(issuer) -
aud
:トークンの受け取り先(audience) -
iat
:発行時刻(issued at) -
exp
:有効期限(expiration)
TypeScriptでの実装例:
import { jwtDecode } from 'jwt-decode'
export interface DecodedJwt {
sub: string
identities?: {
userId: string
}[]
email: string
exp: number
name: string
}
// IDトークンからユーザー情報を抽出して保存
const decodedJwt = jwtDecode(idToken) as DecodedJwt
このようにして、クライアントは署名付きの安全なトークンからユーザー情報を正確に取得・確認することができます。
✅ なぜIDトークンは安全なのか?
- JWTに署名があるため改ざんできない
- 有効期限や発行者・受信者などが検証できる
- IDトークンとUserInfoレスポンスのsubを突き合わせれば入れ替え検出も可能
✅ 実装時の注意点
- IDトークンの署名検証を必ず行う
- nonceの利用でリプレイ攻撃対策を
- UserInfoのsubとIDトークンのsubを照合する
- アクセストークンだけで「認証したつもり」にならない
📘 もっと詳しく学ぶには?
📘 OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本
- OAuthとOIDCの違いが図解でわかる
- IDトークンやJWTの検証方法も解説
- シーケンス図付きでフローを学べる
Discussion