FAPI 1.0 Baseline Profile
FAPI 1.0 Baseline Profile は、金融 API 向けの OAuth 2.0 / OIDC セキュリティプロファイルの基本レベルです。
目次
第1部: 概要編
FAPI とは?
FAPI(Financial-grade API)は、OpenID Foundation が策定した金融グレードのセキュリティプロファイルです。
FAPI の目的:
- 金融機関の API を安全に公開
- オープンバンキング、PSD2 への対応
- 高度なセキュリティ要件の標準化
FAPI 1.0 の構成:
┌─────────────────────────────────────┐
│ FAPI 1.0 Advanced │ ← より高いセキュリティ
├─────────────────────────────────────┤
│ FAPI 1.0 Baseline │ ← 基本レベル
├─────────────────────────────────────┤
│ OAuth 2.0 / OpenID Connect │
└─────────────────────────────────────┘
なぜ FAPI が必要なのか?
背景と歴史
2015年頃、欧州でPSD2(決済サービス指令第2版)が制定され、銀行にサードパーティへのAPI公開が義務付けられました。しかし、標準的なOAuth 2.0 / OpenID Connectでは、金融業界の厳しいセキュリティ要件を満たすには不十分でした。
| 課題 | 標準 OAuth 2.0 | FAPI の解決策 |
|---|---|---|
| 認可コードインターセプション | 脆弱 | PKCE 必須 |
| クライアント認証の弱さ | client_secret(静的) | private_key_jwt / mTLS 推奨 |
| ID Token の署名アルゴリズム | RS256 許可 | PS256 / ES256 推奨 |
| redirect_uri の曖昧な検証 | 部分一致許可の実装あり | 完全一致必須 |
| CSRF 対策 | state 推奨 | state 必須 |
FAPI 1.0 は 2017年から策定が始まり、2021年に Final 仕様として承認されました。現在、世界中のオープンバンキング規制 (PSD2、Open Banking UK、CDR等)でFAPIが採用されています。
脅威モデル
FAPI Baseline が対処する主な脅威:
-
認可コードインターセプション攻撃
- 攻撃者がネットワーク上で認可コードを傍受
- 対策: PKCE(Proof Key for Code Exchange)を必須化
-
CSRF(Cross-Site Request Forgery)
- 攻撃者が被害者のブラウザを使って不正なリクエストを実行
- 対策: state パラメータを必須化
-
ID Token リプレイ攻撃
- 攻撃者が古い ID Token を再利用
- 対策: nonce クレームの検証を必須化
-
クライアント認証情報の漏洩
- client_secret がネットワーク上で漏洩
- 対策: private_key_jwt または mTLS を推奨
-
redirect_uri の操作
- 攻撃者が似た URL にリダイレクトさせる
- 対策: redirect_uri の完全一致検証を必須化
Baseline vs Advanced
| 項目 | Baseline | Advanced |
|---|---|---|
| リスクレベル | 中程度 | 高 |
| 用途 | 読み取り専用 API(残高照会、取引履歴) | 書き込み/決済 API(送金、決済) |
| クライアント認証 | 機密クライアント推奨 | private_key_jwt/mTLS 必須 |
| レスポンス保護 | なし | JARM または PAR+FAPI |
| ID トークン署名 | PS256/ES256 推奨 | PS256/ES256 必須 |
| PKCE | 推奨 | 必須 |
| Request Object | 任意 | 必須 |
| Sender-Constrained Tokens | 任意 | 必須(mTLS) |
実際のユースケース
ユースケース1: 残高照会アプリ(Baseline 適用)
シナリオ:
- ユーザーが家計簿アプリを使用
- アプリが銀行 API で口座残高を取得(読み取り専用)
- リスクレベル: 中程度(情報漏洩のリスク)
Baseline が適している理由:
- 読み取り専用のため、金銭的損失のリスクが低い
- PKCE で認可コードインターセプションを防止
- private_key_jwt で強固なクライアント認証
- PS256 で改ざんを防止