モダン認証認可 OAuth OIDC 仕組みと基本
はじめに
Webサービス開発やモダンなアプリケーション連携において、ユーザーの認証(誰であるかを確認すること)と認可(何ができる権限を持つかを確認すること)は、セキュリティの根幹をなす重要な要素です。SIerでの開発経験がある方の中には、従来のシステムにおける認証認可の仕組みに慣れている方もいらっしゃるかもしれません。しかし、事業会社で展開されるようなマイクロサービスやAPI連携が主流となる環境では、より柔軟かつセキュアな認証・認可の技術が求められます。
特に、OAuth 2.0とOpenID Connect(OIDC)は、現代のWebサービスにおいてデファクトスタンダードとも言える技術です。これらの技術は、ユーザーの同意に基づいて安全に情報連携を行う仕組みを提供します。この記事では、OAuth 2.0とOpenID Connectの基本的な仕組みと、なぜこれらがモダンな開発において重要視されるのかについて解説します。
認証と認可の違い
まず、認証と認可の概念を明確にしておきます。
- 認証 (Authentication): あるユーザーが「誰であるか」を確認するプロセスです。例えば、ユーザー名とパスワードによるログインは認証にあたります。
- 認可 (Authorization): 認証されたユーザーが、特定の「リソース(データや機能など)」に対して「何ができるか」という権限を付与・確認するプロセスです。例えば、特定のユーザーが特定のファイルを読み取ることや、特定のAPIを実行することを許可するかどうかを判断することです。
OAuth 2.0は主に「認可」のためのフレームワークであり、OpenID ConnectはOAuth 2.0を拡張して「認証」の機能を提供するものです。この関係性を理解することが、両者の仕組みを把握する上で重要になります。
OAuth 2.0の仕組み:安全な認可のフレームワーク
OAuth 2.0は、ユーザーが自分のデータやリソースへのアクセス権限を、自身のIDやパスワードを共有することなく、別のアプリケーションに安全に委任するための「認可フレームワーク」です。
登場人物は主に以下の4者です。
- Resource Owner (リソースオーナー): 自身のデータやリソースの所有者であり、アクセスを許可するエンドユーザーです。
- Client (クライアント): リソースオーナーの代わりに、保護されたリソースにアクセスしたいアプリケーションです。これはWebアプリケーション、モバイルアプリ、デスクトップアプリなどです。
- Authorization Server (認可サーバー): クライアントからのアクセス要求を受け付け、リソースオーナーの同意を得た上で、アクセス権限を委譲する「アクセストークン」を発行するサーバーです。
- Resource Server (リソースサーバー): 保護されたリソースをホストしており、クライアントからのアクセストークン付きのリクエストを受け、トークンが有効であればリソースへのアクセスを許可するサーバーです。
OAuth 2.0の代表的な認可フローの一つに「Authorization Code Grant」があります。このフローは、Webサーバー型のアプリケーションで広く用いられます。
- クライアントは、リソースオーナーを認可サーバーへリダイレクトします。このとき、クライアントID、リダイレクトURI、要求する権限の範囲(Scope)などを伝えます。
- リソースオーナーは認可サーバーで認証を行い(ここで認証が登場します)、クライアントに自身の情報へのアクセスを許可するかどうか同意します。
- リソースオーナーが同意すると、認可サーバーはリソースオーナーをクライアントのリダイレクトURIへリダイレクトします。このとき、一時的な「認可コード (Authorization Code)」が付与されます。
- クライアントは、受け取った認可コードと自身のクライアントシークレットを使って、認可サーバーの「トークンエンドポイント」に直接リクエストを送ります。
- 認可サーバーは受け取った認可コードとクライアントシークレットを検証し、正当であれば「アクセストークン (Access Token)」を発行します。場合によっては「リフレッシュトークン (Refresh Token)」も発行されます。
- クライアントは、取得したアクセストークンをResource Serverへのリクエストに含めることで、保護されたリソースにアクセスします。
- Resource Serverは、受け取ったアクセストークンを検証し、有効であればリソースへのアクセスを許可します。
重要なのは、リソースオーナーはクライアントに自身の認証情報(ID/パスワード)を直接渡す必要がない点です。これにより、セキュリティリスクを低減しつつ、安全な連携を実現しています。
OpenID Connectの仕組み:認証レイヤーとしての役割
OpenID Connectは、OAuth 2.0フレームワークの上に構築されたシンプルで相互運用可能な認証レイヤーです。つまり、OAuth 2.0をベースにしながら、認証の機能を提供します。
OIDCの主な目的は、クライアントがユーザーのアイデンティティ(誰であるか)を、認可サーバー(ここではOpenID Providerと呼ばれます)によって検証し、そのアイデンティティに関する基本的なプロファイル情報(ユーザー名、メールアドレスなど)を取得できるようにすることです。
OIDCの中心となる要素は「IDトークン (ID Token)」です。これはJSON Web Token (JWT) 形式で表現されることが一般的です。
OAuth 2.0のフローにOIDCが加わると、以下のようになります(Authorization Code Flowの場合)。
- クライアントは、OAuth 2.0と同様にリソースオーナーを認可サーバー(OpenID Provider)へリダイレクトしますが、要求するScopeに
openid
を含めます。openid
スコープはOIDC認証を要求することを示します。 - リソースオーナーはOpenID Providerで認証を行います。
- リソースオーナーが同意すると、OpenID ProviderはクライアントのリダイレクトURIへ認可コードを付けてリダイレクトします(OAuth 2.0と同じ)。
- クライアントは認可コードを使ってOpenID Providerのトークンエンドポイントにリクエストを送ります(OAuth 2.0と同じ)。
- OpenID Providerはアクセストークンに加えて、IDトークンを発行します。
- クライアントはIDトークンを受け取り、ユーザーのアイデンティティ情報を検証できます。IDトークンには、ユーザーを一意に識別するための
sub
(Subject)クレームや、認証が行われた時刻などの情報が含まれています。 - 必要に応じて、クライアントはアクセストークンを使用して、OpenID Providerの「UserInfo Endpoint」からユーザーに関する追加のプロファイル情報を取得することも可能です。
OIDCは、主にシングルサインオン(SSO)の実装や、異なるサービス間でのユーザー情報の連携に広く利用されています。OAuth 2.0が「アクセス権限の委譲」に特化しているのに対し、OIDCは「ユーザーの認証とアイデンティティ情報の取得」に特化している、と理解できます。
モダンな開発における重要性
OAuth 2.0とOpenID Connectが現代の事業会社で重要視される理由はいくつかあります。
- マイクロサービス・APIエコシステム: 多くのサービスがAPIを介して連携するアーキテクチャにおいて、各サービスが個別に認証認可を持つのは非効率的かつ管理が複雑になります。OAuth/OIDCを用いることで、中央集権的な認可サーバー/OpenID Providerで認証・認可を管理し、サービス間の安全な連携を実現できます。
- セキュリティの向上: ID/パスワードの共有を避け、アクセストークンという期限付きの使い捨て可能な資格情報を用いることで、情報漏洩のリスクを低減できます。
- 開発効率: 認証・認可の複雑な実装を自前で行う必要がなくなり、既存のライブラリやサービス(Auth0, Okta, AWS Cognitoなど)を活用して迅速に開発を進めることができます。
- スケーラビリティ: 認証・認可機能を独立したサービスとして構築・運用することで、システムの全体的なスケーラビリティを高めることが可能です。
これらの技術は、SIerでの開発ではあまり扱う機会がなかったかもしれませんが、事業会社でのWeb開発やクラウドネイティブな開発においては必須の知識となります。自身のキャリアアップや転職を目指す上で、OAuth/OIDCの仕組みを理解し、実践的なスキルを身につけることは非常に有益です。
まとめ
この記事では、認証と認可の基本的な違いを確認し、モダンなWebサービス開発において広く用いられるOAuth 2.0とOpenID Connectの仕組みについて解説しました。
- OAuth 2.0は「認可」のためのフレームワークであり、リソースへのアクセス権限を安全に委譲します。
- OpenID ConnectはOAuth 2.0の上に構築された「認証」レイヤーであり、ユーザーのアイデンティティ情報の取得を容易にします。
これらの技術を理解することは、モダンなアプリケーション設計やAPI連携の基礎を学ぶ上で不可欠です。特に、SIerから事業会社への転職を目指す方にとっては、自身の技術スタックをアップデートし、モダン開発への対応力を示す上で非常に有効な学習テーマと言えます。
もし、これらの技術についてさらに深く学びたい、自身のプロジェクトにどう適用すればよいか具体的なアドバイスが欲しい、といった課題をお持ちであれば、関連分野に詳しいメンターを探してみることも有効な選択肢の一つとなるでしょう。体系的な知識の習得から実践的な疑問の解消まで、メンタリングは技術力向上の一助となります。