セキュリティ

ユーザー認証の実装パターンと選定基準

2025-11-03
18分

ユーザー認証の実装パターンと選定基準

認証方式の選択ミスにより、弊社ではセキュリティインシデント発生、システム全体の作り直しで2,400万円のコスト発生したケースがありました。

JWT、セッション、OAuth。それぞれの特性を理解し、システムに最適な認証方式を選ぶことが重要です。

認証方式の比較

方式特徴メリットデメリット推奨ケース
セッション
Cookie
サーバーで
状態管理
• 即座に無効化可能
• サーバー側で制御
• サーバー負荷
• スケール困難
従来型Webアプリ
管理画面
JWT
(トークン)
クライアントで
状態管理
• ステートレス
• スケーラブル
• 無効化困難
• サイズ大きい
SPA、モバイルアプリ
マイクロサービス
OAuth 2.0外部サービス
連携
• パスワード不要
• 標準プロトコル
• 実装複雑
• 外部依存
ソーシャルログイン
API連携

JWT実装の実践

Access Token + Refresh Token パターン

設計:

  • Access Token: 短命(15分)、API呼び出しに使用
  • Refresh Token: 長命(7日)、Access Token再発行に使用
  • • Refresh Token はサーバーでも管理(無効化可能に)

実装例:

// ログイン
POST /api/auth/login
{
  "email": "[email protected]",
  "password": "password123"
}

Response:
{
  "access_token": "eyJhbGciOiJ...",  // 15分有効
  "refresh_token": "dGhpcyBpc...",   // 7日有効
  "expires_in": 900
}

// Access Token が期限切れになったら
POST /api/auth/refresh
Authorization: Bearer dGhpcyBpc...

Response:
{
  "access_token": "eyJhbGciOiJ...",  // 新しいトークン
  "expires_in": 900
}

やってはいけないこと:

  • • Access Token の有効期限を長くする(1日以上など)→ 盗まれた時のリスク大
  • • JWT に機密情報を含める(パスワード、クレジットカード番号など)
  • • サーバー側の署名検証を省略する → 改ざんされる

OAuth 2.0 の実装(Google ログイン例)

// 1. ログインボタンクリック
<a href="https://accounts.google.com/o/oauth2/auth?
  client_id=YOUR_CLIENT_ID&
  redirect_uri=https://yourapp.com/auth/callback&
  response_type=code&
  scope=email profile">
  Googleでログイン
</a>

// 2. コールバックでコード取得
GET /auth/callback?code=AUTHORIZATION_CODE

// 3. アクセストークンと交換
POST https://oauth2.googleapis.com/token
{
  "code": "AUTHORIZATION_CODE",
  "client_id": "YOUR_CLIENT_ID",
  "client_secret": "YOUR_CLIENT_SECRET",
  "redirect_uri": "https://yourapp.com/auth/callback",
  "grant_type": "authorization_code"
}

// 4. ユーザー情報取得
GET https://www.googleapis.com/oauth2/v2/userinfo
Authorization: Bearer ACCESS_TOKEN

// 5. 自アプリのセッション作成

まとめ

認証方式はシステムの特性に合わせて慎重に選定する必要があります。セッション、JWT、OAuth、それぞれに適したユースケースがあり、間違った選択はセキュリティリスクとコスト増大につながります。

弊社では、適切な認証設計により、セキュリティインシデントをゼロに抑え、ユーザー体験も向上させています。

この記事をシェア:

おすすめの記事

株式会社Apple Seed - システム開発・AI開発