OIDC / OAuth 2.0
実践

クライアントタイプ

OAuth 2.0 では、クライアント(アプリケーション)を2つのタイプに分類します。 この分類は、セキュリティの考え方やフローの選択に大きく影響します。

なぜ分類するのか?

クライアントタイプの分類は、 「クライアントシークレット(秘密鍵)を安全に保管できるかどうか」 で決まります。秘密鍵を安全に保管できないアプリケーションには、 異なるセキュリティ対策が必要です。

機密クライアント (Confidential Client)

サーバーサイドで動作し、クライアントシークレットを安全に保管できるアプリケーションです。

特徴
-

シークレットを安全に保管: サーバー側の環境変数やシークレットマネージャーに保存。 ユーザーのブラウザからはアクセスできない。

-

トークン交換がサーバー間で行われる: 認可コードからトークンへの交換は、バックエンドサーバーから直接認可サーバーに通信する。

-

リフレッシュトークンを安全に利用できる: 長期間有効なリフレッシュトークンもサーバー側で管理。

具体例

サーバーNext.js / Rails / Django のサーバーサイドアプリ
サーバーバックエンド API サーバー
サーバーバッチ処理 / デーモンプロセス

パブリッククライアント (Public Client)

ユーザーのデバイス上で動作し、クライアントシークレットを安全に保管できないアプリケーションです。 ソースコードやネットワーク通信がユーザーに見える環境で動作します。

特徴
-

シークレットを持てない: JavaScript のソースコードやモバイルアプリのバイナリは解析可能。 埋め込んだシークレットは秘密にならない。

-

PKCE が必須: シークレットの代わりに PKCE (Proof Key for Code Exchange) を使って、認可コードの横取りを防ぐ。

-

トークンの扱いに注意が必要: ブラウザの localStorage や sessionStorage に保存するトークンは、XSS攻撃で窃取されるリスクがある。

具体例

ブラウザReact / Vue / Angular の SPA
モバイルiOS / Android のネイティブアプリ
デスクトップElectron アプリ / CLI ツール

セキュリティの違い

 機密クライアントパブリッククライアント
シークレット安全に保管可能保管不可
PKCE推奨必須
リフレッシュトークン安全に利用可能ローテーション必須
トークン保管場所サーバーのメモリ/DBブラウザ/デバイス
推奨フロー認可コード + シークレット認可コード + PKCE

フロー選択への影響

# どのフローを選ぶべきか?

サーバーサイドアプリ(機密)

→ 認可コードフロー + クライアントシークレット

→ 最も安全。バックチャネルでトークン交換。

SPA・モバイルアプリ(パブリック)

→ 認可コードフロー + PKCE

→ シークレット不要。コード横取り攻撃を防止。

非推奨: インプリシットフロー

→ セキュリティ上の問題が多く、現在は推奨されない。

→ 代わりに認可コード + PKCE を使うべき。

まとめ

1.

クライアントタイプの分類はシークレットを安全に保管できるかどうかで決まる

2.

パブリッククライアントではPKCE が必須(機密クライアントでも推奨)

3.

どちらのタイプでも、現在は認可コードフローが推奨される

← 前へ

次のステップ

フロー一覧

次へ →