要約
現代の認証・認可戦略: JWT, OAuth, OpenID Connect実践ガイド 2026
バックエンド開発に必須の認証・認可技術を深掘り。JWT、OAuth、OpenID Connectの基礎から実践的な実装までを解説します。
Keywords: JWT, OAuth, OpenID Connect
目次
1. はじめに: 現代のバックエンドにおける認証・認可の重要性
2. JWT (JSON Web Token) の基礎と実践
3. OAuth 2.0: 委任型認可の標準
4. OpenID Connect (OIDC): OAuth 2.0の上に構築された認証レイヤー
5. 認証・認可戦略の比較と選択
6. 実装における課題とセキュリティベストプラクティス
7. 実際のアプリケーションでの活用例
8. まとめと将来展望
9. よくある質問 (FAQ)
背景
はじめに: 現代のバックエンドにおける認証・認可の重要性
2026年現在、デジタルサービスの利用はかつてないほど多様化し、それに伴いバックエンドシステムが扱うデータは機密性を増しています。ユーザーが安心してサービスを利用するためには、適切な認証(Authentication)と認可(Authorization)の仕組みが不可欠です。
認証とは「あなたが何者であるかを確認するプロセス」であり、ユーザー名とパスワード、生体認証、多要素認証などがこれに該当します。一方、認可とは「認証されたユーザーが何ができるか、どのリソースにアクセスできるかを決定するプロセス」です。例えば、あるユーザーは自分のプロフィールを編集できますが、他のユーザーのプロフィールを編集することはできません。この二つの概念は、セキュアなアプリケーションを構築するための基盤となります。
現代のWebアプリケーションは、マイクロサービスアーキテクチャ、APIエコシステム、シングルページアプリケーション(SPA)、モバイルアプリケーションなど、複雑な構成を持つことが一般的です。このような分散環境では、従来のセッションベースの認証だけでは不十分であり、より柔軟でスケーラブルな認証・認可戦略が求められます。本記事では、その中心的な役割を担う技術であるJWT、OAuth、そしてOpenID Connectについて、その基礎から実践的な側面までを深く掘り下げて解説します。
コアコンテンツ
JWT (JSON Web Token) の基礎と実践
JWT (JSON Web Token) は、情報を安全に表現するためのコンパクトでURLセーフな手段です。主に、クライアントとサーバー間で情報をやり取りする際に、その情報が改ざんされていないこと、そして信頼できる送信元から送られたものであることを保証するために使用されます。特にRESTful APIやマイクロサービス環境での認証に広く採用されています。
JWTの構造
JWTは、ドット(.)で区切られた3つの部分から構成されます。
Header.Payload.Signature
- ヘッダー (Header): トークンのタイプ(JWT)と使用されている署名アルゴリズム(例: HMAC SHA256やRSA)が記述されます。これはBase64Urlエンコードされます。
- ペイロード (Payload): クレーム(claims)と呼ばれる情報を含みます。クレームには、ユーザーID、ロール、有効期限などのユーザーに関する情報や、トークンに関するメタデータが含まれます。これもBase64Urlエンコードされます。
- 署名 (Signature): ヘッダーとペイロードをBase64Urlエンコードしたものを結合し、秘密鍵(または秘密鍵と公開鍵のペア)とヘッダーで指定されたアルゴリズムを使用して暗号化することで生成されます。この署名によって、トークンが改ざんされていないことを検証できます。
JWTはステートレス認証を可能にします。これは、サーバーがセッション情報を保持する必要がなく、各リクエストに含まれるJWTを検証するだけでユーザーを認証できるため、サーバーのスケーラビリティが向上するという大きなメリットがあります。
JWTの生成と検証(Node.jsの例)
ここでは、Node.jsとjsonwebtokenライブラリを使ったJWTの生成と検証の基本的な流れを見てみましょう。
このコードは、ユーザーIDを含むJWTを生成し、その後、そのJWTを検証するプロセスを示しています。秘密鍵MY_SECRET_KEYは、本番環境では環境変数などから安全に取得する必要があります。
const jwt = require('jsonwebtoken');
// 秘密鍵 (本番環境では環境変数から取得)
const SECRET_KEY = 'MY_SECRET_KEY';
// 1. JWTの生成
const payload = {
userId: 'user123',
email: '[email protected]'
};
const token = jwt.sign(payload, SECRET_KEY, { expiresIn: '1h' }); // 1時間で期限切れ
console.log('生成されたJWT:', token);
// 2. JWTの検証
try {
const decoded = jwt.verify(token, SECRET_KEY);
console.log('検証結果 (デコードされたペイロード):', decoded);
} catch (error) {
console.error('JWT検証エラー:', error.message);
}
// 期限切れトークンのシミュレーション
// jwt.sign(payload, SECRET_KEY, { expiresIn: '1s' }, (err, expiredToken) => {
// setTimeout(() => {
// try {
// jwt.verify(expiredToken, SECRET_KEY);
// } catch (e) {
// console.error('期限切れトークンの検証エラー:', e.message); // TokenExpiredError
// }
// }, 2000); // 2秒後に検証
// });
この例では、jwt.sign()でトークンを生成し、jwt.verify()でその有効性を確認しています。expiresInオプションで有効期限を設定することは、セキュリティ上非常に重要です。
コアコンテンツ
OAuth 2.0: 委任型認可の標準
OAuth 2.0は、ユーザーのパスワードを共有することなく、あるサービス(クライアントアプリケーション)が別のサービス(リソースサーバー)上の保護されたリソースにアクセスするための認可を、ユーザーの代わりに取得するためのフレームワークです。これは「委任型認可」と呼ばれ、ユーザーが自分のデータへのアクセス権限を第三者のアプリケーションに安全に付与できる仕組みを提供します。
例えば、あなたが写真編集アプリにGoogleドライブ上の写真へのアクセスを許可する場合、写真編集アプリにGoogleアカウントのパスワードを教える必要はありません。OAuth 2.0は、この安全なアクセス許可のプロセスを標準化します。
OAuth 2.0の主要なロール
OAuth 2.0のフローには、以下の4つの主要なロールが登場します。
- リソースオーナー (Resource Owner): 保護されたリソースを所有するユーザー(例: Googleドライブの写真を所有するユーザー)。
- クライアント (Client): リソースオーナーの代わりに保護されたリソースにアクセスしたいアプリケーション(例: 写真編集アプリ)。
- 認可サーバー (Authorization Server): リソースオーナーを認証し、クライアントにアクセストークンを発行するサーバー。
- リソースサーバー (Resource Server): 保護されたリソースをホストするサーバー(例: GoogleドライブAPI)。
OAuth 2.0の認可フロー (グラントタイプ)
OAuth 2.0は、クライアントの種類やユースケースに応じて複数の「グラントタイプ(認可フロー)」を提供します。最も一般的で推奨されるのは「認可コードグラント」です。
- 認可コードグラント (Authorization Code Grant): Webサーバーアプリケーションに適しています。クライアントはユーザーを認可サーバーにリダイレクトし、認可コードを受け取ります。その後、クライアントはバックエンドでこの認可コードとクライアントシークレットを使用してアクセストークンとリフレッシュトークンを認可サーバーから安全に取得します。
- クライアントクレデンシャルグラント (Client Credentials Grant): ユーザーの関与なしに、クライアント自身がリソースサーバーにアクセスする場合(例: サービス間のAPI連携)に使用されます。
- インプリシットグラント (Implicit Grant): SPAなどで使用されましたが、セキュリティ上の懸念から現在は非推奨であり、PKCE (Proof Key for Code Exchange) を伴う認可コードグラントが推奨されます。
- リフレッシュトークン (Refresh Token): アクセストークンが期限切れになった際に、ユーザーの再認証なしに新しいアクセストークンを取得するために使用されます。長期間のアクセスを維持するために重要です。
ポイント
OAuth 2.0は、パスワードを共有せずにサードパーティアプリケーションにリソースへのアクセスを許可する「委任型認可」のフレームワークです。認可コードグラントは最も安全なフローとしてWebアプリケーションに推奨されます。

コアコンテンツ
OpenID Connect (OIDC): OAuth 2.0の上に構築された認証レイヤー
OpenID Connect (OIDC) は、OAuth 2.0プロトコルをベースにした認証レイヤーです。OAuth 2.0が認可のためのフレームワークであるのに対し、OIDCはユーザーのIDを検証し、そのIDに関する基本的なプロフィール情報をクライアントアプリケーションに提供することを目的としています。簡単に言えば、「誰であるか」を安全に確認するための仕組みです。
あなたがGoogleアカウントで他のサービスに「ログイン」する際に使われるのが、まさにこのOIDCの典型的な例です。ユーザーはGoogleに認証され、その認証情報がOIDCを通じてサードパーティサービスに安全に共有されます。
OIDCの主要なコンポーネント
- IDトークン (ID Token): JWT形式でエンコードされた認証情報です。ユーザーの認証が成功したことを証明し、ユーザーID、発行者、有効期限などの基本的なユーザープロフィール情報(クレーム)を含みます。クライアントアプリケーションは、このIDトークンの署名を検証することで、ユーザーが正しく認証されたことを確認できます。
- UserInfo Endpoint: より詳細なユーザープロフィール情報(名前、メールアドレス、住所など)を、アクセストークンを使って取得するためのAPIエンドポイントです。IDトークンに含まれる情報だけでは不十分な場合に利用されます。
OIDCの認証フロー (認可コードフローの拡張)
OIDCはOAuth 2.0の認可コードフローを拡張して認証を実現します。基本的な流れはOAuth 2.0の認可コードフローと似ていますが、以下の点が異なります。
- クライアントが認可リクエストを送信する際に、
scopeパラメータにopenidを含めます。 - 認可サーバーは、アクセストークンとともにIDトークンも発行します。
- クライアントは、IDトークンを検証し、その中のクレームからユーザーのID情報を取得します。
ポイント
OpenID ConnectはOAuth 2.0の認可機能の上に構築された認証プロトコルであり、IDトークンを通じてユーザーのIDを安全に検証し、シングルサインオン(SSO)の実現に不可欠です。

比較分析
認証・認可戦略の比較と選択
JWT、OAuth 2.0、OpenID Connectは、それぞれ異なる目的と役割を持つ技術であり、相互に補完し合います。どの技術を選択するかは、アプリケーションの要件、セキュリティモデル、スケーラビリティのニーズによって異なります。ここでは、これらの技術の主な違いと、どのような場合にどれを選択すべきかを比較します。
技術比較表
| 特徴 | JWT | OAuth 2.0 | OpenID Connect |
|---|---|---|---|
| 目的 | 情報の安全な伝送と署名付きトークンによるステートレス認証 | ユーザーのパスワードを共有せずに、第三者アプリにリソースへのアクセスを「認可」 | OAuth 2.0上でユーザーの「認証」とID情報の取得 |
| 役割 | トークン形式 | 認可フレームワーク | 認証プロトコル |
| 対象 | API認証、情報交換 | サードパーティ連携、APIアクセス管理 | シングルサインオン (SSO)、ユーザー認証 |
| 利用例 | 自社APIの認証、マイクロサービス間通信 | Google/Facebookログイン、SaaS連携 | Google/Facebookアカウントでの他サービスへのログイン |
| 単体での機能 | 認証(トークンによる識別) | 認可 | 認証、ID情報の取得 |
どの技術を選択すべきか?
- 自社APIの認証システムを構築する場合: ユーザー名とパスワードで認証後、JWTを発行し、以降のリクエストでJWTを検証する方式が一般的です。これはステートレスでスケーラブルなAPI認証に適しています。
- サードパーティサービスのリソースにアクセスしたい場合: 例えば、あなたのアプリケーションからユーザーのGoogleカレンダーにアクセスしたい場合、OAuth 2.0を利用してユーザーから認可を得る必要があります。
- ユーザーにソーシャルログイン(Google、Facebookなど)を提供したい場合: OpenID Connectを利用します。OIDCはOAuth 2.0をベースにしているため、同時に認可の仕組みも活用できます。
多くの場合、これらの技術は組み合わせて使用されます。例えば、OIDCでユーザーを認証し、その結果として発行されたアクセストークンがJWT形式である、といった形です。OAuth 2.0とOIDCは、ユーザーの「認証」と「認可」を外部のIDプロバイダーに委ねるためのプロトコルであり、JWTはそのプロトコル内で情報を安全に伝達するための「トークン形式」として利用されることが多いです。
ポイント
JWTはトークン形式として認証情報を格納し、OAuth 2.0は認可のフレームワーク、OIDCはその上に認証機能を追加します。これらは単独で使われることもありますが、現代の複雑なシステムでは連携して利用されることがほとんどです。
問題解決
実装における課題とセキュリティベストプラクティス
認証・認可システムの設計と実装は、セキュリティ上の多くの課題を伴います。これらの技術を正しく理解し、適切なセキュリティ対策を講じることが、システムを安全に保つ上で極めて重要です。
JWTにおける課題と解決策
問題 01
JWTの取り消し(Revocation)の難しさ
JWTはステートレスであるため、一度発行されると有効期限が切れるまでサーバー側で強制的に無効化することが困難です。もしトークンが漏洩した場合、そのトークンは有効期限まで悪用される可能性があります。
解決策 — 短い有効期限とリフレッシュトークン、またはブラックリストの利用
アクセストークンの有効期限を非常に短く(例: 5分〜15分)設定し、長期間のアクセスにはリフレッシュトークンを使用します。リフレッシュトークンは一度しか使えない(One-Time Use)ように設計し、データベースで管理することで、必要に応じて無効化できるようにします。また、緊急時には漏洩したJWTをブラックリストに登録し、以降のアクセスを拒否するメカニズムを導入することも検討できますが、これはステートレス性のメリットを一部損ないます。
コード解説
リフレッシュトークンをデータベースに保存し、再利用を防ぐための擬似コード。実際のシステムでは、このトークンは暗号化され、さらに有効期限やユーザーIDと紐付けて管理されます。
// データベースにリフレッシュトークンを保存する関数 (擬似コード)
async function storeRefreshToken(userId, refreshToken) {
// データベースにトークンを保存し、ユーザーIDと紐付ける
// 例: await db.collection('refreshTokens').insertOne({ userId, token: refreshToken, issuedAt: new Date() });
console.log(`ユーザー ${userId} のリフレッシュトークンを保存しました。`);
}
// リフレッシュトークンを使用して新しいアクセストークンを取得する関数 (擬似コード)
async function refreshAccessToken(refreshToken) {
// データベースでリフレッシュトークンを検索
// const storedToken = await db.collection('refreshTokens').findOne({ token: refreshToken });
if (!storedToken || storedToken.isUsed) { // isUsedフラグで一度利用済みをチェック
throw new Error('無効なリフレッシュトークンです。');
}
// トークンを一度利用済みとしてマーク (再利用防止)
// await db.collection('refreshTokens').updateOne({ token: refreshToken }, { $set: { isUsed: true } });
// 新しいアクセストークンを生成
const newAccessToken = jwt.sign({ userId: storedToken.userId }, SECRET_KEY, { expiresIn: '15m' });
// 新しいリフレッシュトークンも生成し、データベースを更新
const newRefreshToken = jwt.sign({ userId: storedToken.userId }, SECRET_KEY_REFRESH, { expiresIn: '7d' });
await storeRefreshToken(storedToken.userId, newRefreshToken);
return { accessToken: newAccessToken, refreshToken: newRefreshToken };
}
問題 02
JWTの安全な保存
クライアント側でJWTをどこに保存するかは重要なセキュリティ問題です。XSS攻撃などによってトークンが窃取されるリスクがあります。
解決策 — HttpOnly属性付きのセキュアなCookie
JWT(特にアクセストークン)をHttpOnly属性とSecure属性を付けたCookieに保存するのが最も安全な方法の一つです。HttpOnly属性によりJavaScriptからのアクセスが禁止され、XSS攻撃による窃取リスクが大幅に低減します。Secure属性はHTTPS接続時のみCookieが送信されることを保証します。
OAuth 2.0 / OpenID Connectにおける課題と解決策
問題 03
認可コードインジェクション攻撃
認可コードグラントフローにおいて、悪意のあるクライアントが認可コードを傍受し、正規のクライアントになりすましてアクセストークンを取得しようとする攻撃です。
解決策 — PKCE (Proof Key for Code Exchange) の利用
PKCEは、認可コードインジェクション攻撃を防ぐための拡張機能で、特にモバイルアプリやSPAのようなパブリッククライアントに推奨されます。クライアントは認可リクエスト時にcode_challengeを送信し、トークンリクエスト時に対応するcode_verifierを送信します。認可サーバーはこれらを検証し、正規のクライアントであることを確認します。
問題 04
CSRF (Cross-Site Request Forgery) 攻撃
OAuth/OIDCのフローにおいても、認可リクエストやリダイレクト時にCSRF攻撃を受ける可能性があります。
解決策 — stateパラメータの利用
OAuth 2.0のstateパラメータは、認可リクエスト時にクライアントが生成するランダムな文字列であり、認可サーバーからのリダイレクト時にそのまま返されます。クライアントは、この返されたstateパラメータが最初に送信したものと一致するか検証することで、CSRF攻撃を防ぐことができます。
ポイント
認証・認可システムのセキュリティは、単にプロトコルを実装するだけでなく、JWTの適切な管理(短い有効期限、HttpOnly Cookie)、OAuth/OIDCにおけるPKCEやstateパラメータの活用など、細部にわたるベストプラクティスを遵守することで初めて確保されます。

実践ガイド
実際のアプリケーションでの活用例
ここでは、これまでに学んだJWT、OAuth 2.0、OpenID Connectが、実際のWebアプリケーションでどのように活用されるか、具体的なシナリオを通じて解説します。
シナリオ1: SPA (Single Page Application) とバックエンドAPIの認証
多くのモダンなWebアプリケーションは、React, Vue, Angularなどのフレームワークで構築されたSPAと、RESTful APIを提供するバックエンドで構成されます。
認証フロー概要
1. ユーザーログイン — SPAがユーザー名とパスワードをバックエンドAPIのログインエンドポイントに送信。
2. JWT発行 — バックエンドがユーザーを認証し、アクセストークン(JWT)とリフレッシュトークンを発行。アクセストークンはHttpOnlyかつSecureなCookieに、リフレッシュトークンは同じくCookieに保存されることが推奨。
3. APIアクセス — SPAはAPIリクエスト時に自動的にCookieからアクセストークンを送信。バックエンドは各リクエストでJWTを検証し、認可を決定。
4. トークン更新 — アクセストークンが期限切れの場合、SPAはリフレッシュトークンを使って新しいアクセストークンをバックエンドから取得。
シナリオ2: 外部サービス連携 (Google APIなど)
あなたのアプリケーションが、ユーザーの許可を得てGoogleドライブのファイルリストを取得したい場合など。
認可フロー概要 (OAuth 2.0 認可コードグラント)
1. 認可リクエスト — あなたのアプリケーションがユーザーをGoogleの認可エンドポイントにリダイレクト。この際、必要なスコープ(例: https://www.googleapis.com/auth/drive.readonly)とstateパラメータを付与。
2. ユーザーの同意 — ユーザーがGoogleにログインし、あなたのアプリケーションへのアクセスを許可。
3. 認可コード取得 — Googleがユーザーをあなたのアプリケーションの指定したリダイレクトURIに、認可コードとstateパラメータを付けてリダイレクト。
4. アクセストークン交換 — あなたのバックエンドが、受け取った認可コードとクライアントシークレットをGoogleのトークンエンドポイントに送信し、アクセストークンとリフレッシュトークンを取得。この際、stateパラメータが一致することを検証。
5. リソースアクセス — 取得したアクセストークンを使って、GoogleドライブAPIにリクエストを送信し、ユーザーのファイルリストを取得。
シナリオ3: シングルサインオン (SSO) の実装
複数の関連サービスがあり、ユーザーが一度ログインすれば全てのサービスにアクセスできるようにしたい場合。
認証フロー概要 (OpenID Connect)
1. ログインリクエスト — ユーザーがサービスAにアクセスし、ログインボタンをクリック。サービスAはユーザーをIDプロバイダー(例: Okta, Auth0, または自社SSOサーバー)の認可エンドポイントにリダイレクト。スコープにはopenid profile emailなどを含める。
2. ユーザー認証 — ユーザーがIDプロバイダーで認証。既にログイン済みであれば、再認証は不要(SSOのメリット)。
3. IDトークンとアクセストークン取得 — IDプロバイダーがユーザーをサービスAのリダイレクトURIに認可コードでリダイレクト。サービスAのバックエンドはこのコードを使ってIDトークンとアクセストークンをIDプロバイダーから取得。IDトークンを検証し、ユーザーを認証。
4. サービスBへのアクセス — ユーザーがサービスBにアクセス。サービスBも同様にIDプロバイダーにリダイレクトするが、ユーザーは既にIDプロバイダーにログイン済みのため、即座に認可コードを受け取り、IDトークンとアクセストークンを取得できる。これにより、ユーザーはサービスBに再ログインすることなくアクセスできる。
5. ユーザー情報取得 — 必要に応じて、アクセストークンを使ってIDプロバイダーのUserInfoエンドポイントから詳細なユーザー情報を取得。
ポイント
実際のアプリケーションでは、JWTは内部API認証に、OAuth 2.0は外部サービスへの認可に、OpenID Connectは外部IDプロバイダーによる認証(SSOを含む)に、それぞれ最適な形で組み合わせて利用されます。

よくある質問 (FAQ)
Q. JWT、OAuth、OpenID Connectの最も重要な違いは何ですか?
JWTは情報を安全に伝達するための「トークン形式」であり、認証や認可の「メカニズム」を提供します。OAuthは第三者アプリケーションにリソースへのアクセスを許可する「認可フレームワーク」です。OpenID ConnectはOAuthの上に構築され、ユーザーの「認証」とID情報の取得を可能にする「認証プロトコル」です。
Q. JWTはどこに保存するのが最も安全ですか?
XSS攻撃のリスクを考慮すると、HttpOnly属性とSecure属性を付けたCookieに保存するのが最も安全な方法とされています。これにより、JavaScriptからのアクセスを防ぎ、HTTPS経由でのみ送信されるようになります。
Q. OAuth 2.0の「スコープ」とは何ですか?
スコープは、アプリケーションがリソースサーバー上のユーザーデータに対して要求するアクセス権限の範囲を定義するものです。例えば、「メールアドレスの読み取り」や「カレンダーイベントの作成」といった具体的な操作を指定し、ユーザーはこれらの権限を個別に許可または拒否できます。
Q. 2026年における認証・認可の最新トレンドは何ですか?
パスワードレス認証(例: FIDO2/WebAuthn、パスキー)、多要素認証(MFA)の普及、継続的認証(Continuous Authentication)、そして分散型ID(Decentralized Identity)などが注目されています。これらはユーザーエクスペリエンスとセキュリティの両方を向上させることを目指しています。
まとめ
まとめと将来展望
本記事では、現代のバックエンド開発に不可欠な認証・認可技術であるJWT、OAuth 2.0、OpenID Connectについて、その基本的な概念から実践的な応用、そしてセキュリティ上の課題と解決策までを幅広く解説しました。
- JWTは、情報をコンパクトかつ安全に伝達するためのトークン形式であり、ステートレスなAPI認証に強力なソリューションを提供します。
- OAuth 2.0は、ユーザーのパスワードを共有せずに、第三者アプリケーションにリソースへのアクセスを安全に委任するための認可フレームワークです。
- OpenID Connectは、OAuth 2.0の上に構築された認証レイヤーであり、ユーザーのID検証と基本的なプロフィール情報の取得を可能にし、シングルサインオンを実現します。
これらの技術は単独で利用されることもありますが、多くの場合、互いに補完し合いながら複雑な認証・認可フローを構築します。適切な技術選択と、紹介したようなセキュリティベストプラクティス(短い有効期限、HttpOnly Cookie、PKCE、stateパラメータなど)の徹底が、安全で信頼性の高いシステムを構築するための鍵となります。
将来展望
認証・認可の分野は常に進化しています。2026年以降も、パスワードレス認証技術(パスキーやFIDO2/WebAuthn)の普及、より高度な多要素認証の標準化、そしてゼロトラストセキュリティモデルへの移行が加速するでしょう。開発者としては、これらの新しい動向を常に把握し、セキュリティと利便性を両立させるための最適な戦略を追求し続ける必要があります。
Kwontekiでは、今後も最新の技術動向と実践的な情報を提供していきます。本記事が、皆さんのバックエンドセキュリティ設計の一助となれば幸いです。
ポイント