FAPI(Financial-grade API)
FAPIとは
FAPI(Financial-grade API) は、金融取引など高セキュリティが要求される環境でOAuth 2.0/OpenID Connectを安全に利用するための仕様です。
目的:
- 標準のOAuth 2.0/OIDCよりも厳格なセキュリティ要件を定義
- オープンバンキング(PSD2、Open Banking UK)等で要求される金融グレードのセキュリティを実現
主な特徴:
- 署名付きリクエスト・レスポンスの強制によるデータ改竄防止
- mTLS(Mutual TLS)によるトークンバインディングによるアクセストークン盗難の防御
idp-serverのFAPI対応
対応状況
| プロファイル | 選択基準(用途) | idp-server対応 | 実装モジュール |
|---|---|---|---|
| FAPI 1.0 Baseline | 読み取り専用API 残高照会、取引履歴参照等 | ✅ 対応済み | idp-server-core-extension-fapi |
| FAPI 1.0 Advance | 書き込みAPI 送金実行、口座設定変更、決済実行等 | ✅ 対応済み | idp-server-core-extension-fapi |
| FAPI CIBA | デバイス分離認証 ATM送金認証、窓口本人確認、コールセンター認証等 | ✅ 対応済み | idp-server-core-extension-fapi-ciba |
選択の原則: 参照だけならBaseline、書き込みがあればAdvance、デバイスが分離しているならCIBA
プロファイル適用条件
idp-serverは、リクエストされたスコープに基づいてFAPIプロファイルを自動判定します。
判定ロジック(優先順位順):
- FAPI Advance: テナント設定の
fapiAdvanceScopesに一致するスコープが含まれる場合 - FAPI Baseline: テナント設定の
fapiBaselineScopesに一致するスコープが含まれる場合 - OIDC: スコープに
openidが含まれる場合 - OAuth 2.0: それ以外
設定例(テナント設定):
{
"extension": {
"fapi_baseline_scopes": ["read", "account"],
"fapi_advance_scopes": ["write", "transfers", "payment_initiation"]
}
}
3つのプロファイルの特徴
FAPI Baseline Profile
用途: 読み取り専用API(残高照会、取引履歴参照等)
主要要件:
- 署名付きリクエストオブジェクト(PS256/ES256)
- PKCE必須
- private_key_jwt または mTLS クライアント認証
FAPI Advance Profile
用途: 書き込みAPI(送金実行、口座設定変更等)
Baselineに追加される要件:
- PAR(Pushed Authorization Requests)必須
- JARM(JWT Secured Authorization Response)必須
- Sender-constrained アクセストークン必須(mTLS binding)
- Authorization Details サポート
FAPI CIBA Profile
用途: バックチャネル認証(デバイス分離認証)
CIBA固有の要件:
- リクエストオブジェクト有効期限: 最大60分
- binding_message: authorization_detailsがない場合は必須
- Pushモード禁止(pollまたはpingのみ)
- Sender-constrained アクセストークン必須
- aud claim必須(Issuer URL)
詳細ガイド: FAPI CIBA Profile - プロトコル仕様
mTLS(Mutual TLS)によるトークンバインディング
トークンバインディングとは
トークンバインディングは、アクセストークンを特定のクライアントに紐付けるセキュリティ機構です。
通常のBearer Tokenの問題点:
- アクセストークンは「持っている者が使える」Bearer形式
- トークンが盗まれると、攻撃者が自由に使用できる
- ネットワーク盗聴、マルウェア、フィッシングで盗難リスク
トークンバインディングによる解決:
- アクセストークンをクライアント証明書に紐付ける
- トークンだけ盗んでも、証明書がなければ使用不可
- 金融取引など高セキュリティ環境で必須の仕組み
Sender-constrained Access Tokensの仕組み
mTLSによるトークンバインディングは、証明書のサムプリント(指紋) をアクセストークンに埋め込むことで実現します。
証明書サムプリント(cnf:x5t#S256):
1. クライアント証明書のSHA-256ハッシュを計算
2. Base64エンコードしてサムプリントを生成
3. アクセストークン(JWT)の cnf クレームに格納
{
"iss": "https://idp.example.com",
"sub": "user123",
"cnf": {
"x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" ← 証明書サムプリント
}
}