Open5

【認証系/Auth】アプリの認証機能について

ピン留めされたアイテム
まさぴょん🐱まさぴょん🐱

アプリの認証機能について調査 & チートシート📝

https://atmarkit.itmedia.co.jp/ait/articles/2504/25/news047.html

https://architecting.hateblo.jp/entry/2020/03/27/033758

https://qiita.com/MaSi1031/items/1b1a3258f119a5d43045

https://www.zenrin-datacom.net/solution/blog/api-authentication

アプリの認証機能についてチートシート📝

以下は、さまざまな認証方式を簡潔に比較したチートシート例です。

認証方式/フレームワーク 主な特徴 利用例 メリット デメリット
Basic認証 ユーザー名・パスワードをHTTPヘッダにベタ送信 簡易的なAPI認証 実装が簡単、標準HTTPで利用可能 パスワードが平文で送信されやすく安全性が低い、複雑な権限管理が困難
OAuth 2.0 アクセストークンを用いてリソースアクセスを管理、第三者アプリとの安全な権限委譲 GoogleやGitHubへのログイン、外部API利用 権限委譲が可能で外部サービス連携に強い、パスワード共有が不要 実装が複雑、アクセストークン管理が必要
OpenID Connect(OIDC) OAuth 2.0をベースに、ユーザーIDを安全に取得するための拡張 Webサービスやモバイルアプリのログイン統合 標準化されたユーザー情報取得、SSO実現が容易 設定やフローがやや複雑、プロバイダー依存度が高い
SAML (Security Assertion Markup Language) XMLベースでSSOを実現する標準、主にエンタープライズ領域で利用 企業内Webアプリ間シングルサインオン セキュアで確立された標準、異なるドメイン間でのSSOが容易 XMLベースでやや複雑、実装が重い
JWT (JSON Web Token) JSON形式でユーザー情報や認証状態をペイロードとして持つトークン モバイルアプリの軽量認証 軽量でAPIサーバー間通信が容易、セッションレス トークン失効管理が難しい、長期有効トークンは危険性増大
SSO(Single Sign-On) 一度のログインで複数サービスにアクセス可能 G Suite、Microsoft 365など複数アプリ間共有認証 パスワード疲労の軽減 セキュリティ上、1アカウントが侵害されると全サービスへ影響
APIキー 固定のキー文字列でアクセス制御 簡易的なAPI認証、内部システム間通信 実装が単純、迅速な開発が可能 キー流出時に不正利用が容易、キー管理が課題

上記表を参考に、アプリの要件や利用シーンに合わせて最適な認証方式を選択してください。

ピン留めされたアイテム
まさぴょん🐱まさぴょん🐱

【Auth/認証系】API 認証をどう設計・実装するかについて📝

API認証機能の実装方法

API認証の実装方法にはいくつかのアプローチがあります。一般的な方法は、APIキー、Basic認証、Bearerトークン(JWT)、OAuth2、OpenID Connect、ミュータルTLSの利用です。それぞれの認証方法には異なる目的と利便性があります。秘密情報の安全な保存、トークンのハッシュ化、回転、無効化、役割ベースアクセス制御やスコープ、CORSの考慮も重要です。Fast

API認証メカニズムと実装の概要

一般的な認証方法には、APIキー、HTTP Basic、Bearerトークン(JWTやオペークトークン)、OAuth2、mTLS、署名付きURL、Webhook秘密検証などがあります。認証戦略は、クライアントタイプ(内部利用、外部利用)やセキュリティ規制に基づき選択します。実装には、アイデンティティストア、トークンの発行と管理、HTTPS/TLSでの通信保護、エンドポイントの保護などが含まれます。具体的な実装例として、FastAPIやNode環境でのOAuth2やPassport.jsの利用が挙げられます。

思考時間: 30 秒

以下では 「API 認証をどう設計・実装するか」 を目的別に整理し、FastAPI や Node(Hono/Express)での実装例、そして OWASP 最新ガイドラインに基づくベストプラクティスまでまとめます。


1. まず整理すべき4つの観点

観点 具体的に決めること
主体 (Who) 第三者アプリ?自社 SPA?サーバ間バッチ?
方式 (How) API キー / Basic / Bearer(JWT) / OAuth2 / mTLS など
有効期間 (When) 使い捨ての短命トークンか、長期 API キーか
権限範囲 (What) スコープ / RBAC / ABAC / テナント分離方法

2. 代表的な認証方式比較

方式 主なユースケース ステートレス トークン失効の難しさ 実装ライブラリ例
API キー (HMAC でも可) 内部連携・Webhook 検証 FastAPI: Header() / Node: Hono c.req.header()
HTTP Basic 単純な PoC、VPN 内限定 Same as above
Bearer (JWT) SPA ↔ API、モバイルアプリ 高 (要ブラックリスト or 短寿命) FastAPI OAuth2PasswordBearer, PyJWT / Node jsonwebtoken
OAuth2 Client Credentials サーバ間 (Machine-to-Machine) FastAPI Authlib / Node simple-oauth2
OAuth2 Authorization Code + PKCE 外部サードパーティ連携 Same as above
OpenID Connect 「ログインして誰かを識別」 Same as above
Mutual TLS 金融・社内ゼロトラスト Web サーバ設定+CA 運用

3. Bearer(JWT)トークン実装ステップ(FastAPI 例)

from datetime import timedelta, datetime
from jose import jwt, JWTError
from passlib.context import CryptContext
from fastapi import Depends, Header, HTTPException, status

SECRET_KEY = "<<<強力なランダム文字列>>>"
ALGORITHM = "HS256"
ACCESS_LIFETIME = timedelta(minutes=30)

pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")

def create_access_token(sub: str) -> str:
    exp = datetime.utcnow() + ACCESS_LIFETIME
    to_encode = {"sub": sub, "exp": exp}
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        return payload["sub"]
    except JWTError:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
  • /auth/token でパスワードを受け取り、create_access_token() を返す
  • 守りたいエンドポイントで Depends(get_current_user) を挟むだけで認証完了
    FastAPI デフォルトのドキュメント UI でも「Authorize」ボタンが自動表示されます (FastAPI, FastAPI)

4. API キーを 1 つのエンドポイントだけに付ける(Node / Hono 例)

import { Hono } from 'hono';

const API_KEY = process.env.FASTAPI_MCP_API_KEY ?? 'secret-fast-api-mcp-token';

const app = new Hono();

// 認証付き
app.get('/protected', (c) => {
  const key = c.req.header('x-api-key');
  if (key !== API_KEY) return c.json({ error: 'Unauthorized' }, 401);
  return c.text('OK!');
});

// 認証不要
app.get('/public', (c) => c.text('Hello, World!'));

export default app;
  • 環境変数にキーを置く
  • 付与したいルートのみヘッダチェック
    (FastAPI でも同様に Depends() で切り替え可能)

5. 実装後に必ず押さえる OWASP API Top 10 (2023) の “Broken Authentication” 対策

  1. 常時 HTTPS(TLS1.2+)
  2. トークンの短寿命化 + Refresh トークン方式
  3. 強力なパスワードハッシュ (bcrypt, argon2)
  4. 多要素認証 (MFA) を UI がある場合は有効化
  5. レート制限・ブルートフォース検知
  6. ログと監査証跡を残す(成功/失敗・トークン失効)
  7. キー/シークレットのローテーション手順を用意
  8. 自動化テストで「認証なしで呼べるエンドポイント」を検知
  9. RBAC/スコープ で最小権限原則を徹底
  10. 外部 SaaS/IAM 連携なら自前実装を最小化して脆弱性を減らす

(詳細は OWASP API Security Top 10 2023 の API2:2023 を参照) (OWASP)


6. 迷ったときの選定ガイド

要件 推奨方式
モバイル・SPA ログイン OAuth2 + JWT(Authorization Code + PKCE)
サーバ間バッチ OAuth2 Client Credentials or mTLS
社内マイクロサービス mTLS + 認可ヘッダ(SPIFFE/SPIRE など)
小規模・社内ツール 単一 API キー or Basic
公開 API / 他社連携 OAuth2 / OpenID Connect(外部 IdP 連携)

まとめ

  1. 認証方式は「誰が・どう使うか」で決める
  2. 実装はライブラリに任せ、脆弱な独自実装は避ける
  3. OWASP API Top 10 を常にチェックし、短寿命トークン+最小権限で運用する

この流れを押さえれば、FastAPI や Hono でも数十行で安全な認証を導入できます。さらに詳しく知りたいフロー(PKCE、mTLS 設定、スコープ設計など)があれば、ぜひ追加で聞いてください。

まさぴょん🐱まさぴょん🐱

アプリの認証機能に関するチートシート by Felo

アプリの認証機能に関連する主要な技術(SSO、OAuthなど)を整理します📝
このテーブルでは、それぞれの技術の概要、利点、使用例を示しています。

技術 概要 利点 使用例
SSO (Single Sign-On) ユーザーが一度のログインで複数のアプリケーションにアクセスできる仕組み。 UX(ユーザー体験)の向上、パスワード管理の簡素化、セキュリティの向上。 Googleアカウントを使用してYouTubeやGmailにログイン。
OAuth 2.0 サードパーティのアプリケーションがユーザーのリソースにアクセスするための認可フレームワーク。 ユーザーのパスワードを共有せずに安全にリソースにアクセスできる。 FacebookやGoogleのアカウントで他のサービスにログイン。
OpenID Connect OAuth 2.0の上に構築された認証レイヤーで、ユーザーのアイデンティティを確認するために使用。 シンプルなユーザー認証、セキュリティの向上、ユーザー情報の取得が容易。 Googleアカウントを使用したログイン。
SAML (Security Assertion Markup Language) エンタープライズ環境でのシングルサインオンを実現するためのXMLベースの標準。 組織内の複数のアプリケーション間でのシームレスな認証。 企業のイントラネットでのアプリケーションアクセス。
JWT (JSON Web Token) ユーザーの認証情報を安全に伝達するためのコンパクトなURLセーフなトークン。 ステートレスな認証、スケーラビリティの向上、クロスドメインでの使用が可能。 APIへのアクセス制御やユーザー認証。

説明

  • SSOは、ユーザーが一度のログインで複数のサービスにアクセスできるため、パスワードの管理が簡素化されます。UX(ユーザー体験)も高く、特に企業環境での利用が一般的です。

  • OAuth 2.0は、ユーザーが自分のパスワードを他のアプリケーションと共有することなく、特定のリソースへのアクセスを許可するためのプロトコルです。これにより、セキュリティが向上します。

  • OpenID Connectは、OAuth 2.0を基にした認証プロトコルで、ユーザーのアイデンティティを確認するために使用されます。これにより、ユーザーは複数のサービスで同じアカウントを使用できます。

  • SAMLは、特に企業のシングルサインオンに利用される技術で、XMLを使用して認証情報を交換します。これにより、異なるアプリケーション間での認証がシームレスに行えます。

  • JWTは、ユーザーの認証情報を安全に伝達するためのトークン形式で、特にAPIの認証に広く使用されています。ステートレスな認証を可能にし、スケーラビリティを向上させます。

このテーブルと説明を参考に、アプリの認証機能についての理解を深めてください。