FAPI CIBA Profile - プロトコル仕様
概要
FAPI CIBA (Financial-grade API: Client Initiated Backchannel Authentication) Profile は、金融グレードのセキュリティを備えたバックチャネル認証を実現するためのプロファイルです。
idp-serverは OpenID FAPI CIBA Security Profile に完全準拠しており、以下の3つの仕様を組み合わせています:
- FAPI Part 1 (Baseline): 読み取り専用APIの基本セキュリティ
- FAPI Part 2 (Advanced): 書き込みAPIの高度なセキュリティ
- CIBA Core: バックチャネル認証フロー
ユースケース
FAPI CIBAは以下のような高セキュリティが要求されるシナリオで使用されます:
| ユースケース | 説明 | 具体例 |
|---|---|---|
| オープンバンキング | PSD2準拠の金融API | 口座情報参照、送金実行 |
| デバイス分離認証 | 操作端末と認証端末が異なる | ATM送金、コールセンター認証 |
| リモート承認 | 別デバイスでの認証承認 | スマホでのプッシュ通知承認 |
| 高額取引 | 金融取引の多要素認証 | 大口送金、証券取引 |
FAPI CIBA vs 標準CIBA
セキュリティ要件比較
| 項目 | 標準CIBA | FAPI CIBA |
|---|---|---|
| リクエストオブジェクト | 任意 | 必須(署名付き) |
| 署名アルゴリズム | RS256等も可 | PS256/ES256のみ |
| リクエスト有効期限 | 制限なし | 最大60分 |
| クライアント認証 | client_secret系も可 | private_key_jwt, mTLS のみ |
| binding_message | 任意 | authorization_details未使用時は必須 |
| トークン配信モード | push/poll/ping | poll/pingのみ(push禁止) |
| トークンバインディング | 任意 | Sender-constrained必須(mTLS) |
| aud claim | 任意 | 必須(Issuer URL含む) |
プロトコルフロー
1. バックチャネル認証リクエスト
POST /backchannel/authentications HTTP/1.1
Host: idp-server.example.com
Content-Type: application/x-www-form-urlencoded
request=eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InNlbGZfcmVxdWVzdF9rZXlfcHMyNTYifQ...
&client_id=fapi-ciba-client
リクエストオブジェクト(JWT)の内容:
{
"alg": "PS256",
"kid": "self_request_key_ps256"
}
.
{
"scope": "openid payment_initiation",
"binding_message": "TX-12345: €500 to ACME Corp",
"user_code": "123456",
"login_hint": "device:auth_device_id,idp:idp-server",
"authorization_details": [
{
"type": "payment_initiation",
"instructedAmount": {
"currency": "EUR",
"amount": "500.00"
},
"creditorName": "ACME Corp",
"creditorAccount": {
"iban": "DE02100100109307118603"
}
}
],
"client_id": "fapi-ciba-client",
"aud": "https://idp-server.example.com",
"iss": "fapi-ciba-client",
"exp": 1234567890,
"iat": 1234564290,
"nbf": 1234564290,
"jti": "unique-request-id"
}
レスポンス:
{
"auth_req_id": "ea2856d7-9aab-40c6-ae71-f8db93602eab",
"expires_in": 600,
"interval": 5
}
2. 認証デバイスでの承認
ユーザーはスマートフォン等の認証デバイスでプッシュ通知を受け取り、以下の情報を確認:
- binding_message: "TX-12345: €500 to ACME Corp"
- authorization_details: 支払い詳細(金額、送金先等)
生体認証(FIDO-UAF)またはパスワードで承認します。
3. トークンリクエスト(ポーリング)
POST /tokens HTTP/1.1
Host: idp-server.example.com
Content-Type: application/x-www-form-urlencoded
SSL-Client-Cert: <client-certificate>
grant_type=urn:openid:params:grant-type:ciba
&auth_req_id=ea2856d7-9aab-40c6-ae71-f8db93602eab
&client_id=fapi-ciba-client
レスポンス:
{
"access_token": "eyJhbGc...",
"id_token": "eyJhbGc...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "refresh..."
}
アクセストークン(JWT)の内容:
{
"iss": "https://idp-server.example.com",
"sub": "user-123",
"aud": "resource-server",
"exp": 1234567890,
"iat": 1234564290,
"scope": "openid payment_initiation",
"cnf": {
"x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2"
}
}
重要: cnf:x5t#S256 がクライアント証明書のサムプリントで、mTLSバインディングを実現します。
FAPI要件マッピング
要件の階層構造
FAPI CIBAは 3つの仕様を積み重ねた構造 になっています:
┌─────────────────────────────────────────┐
│ FAPI CIBA 5.2.2 │ ← CIBA固有の追加要件
│ - binding_message要件 │
│ - Push mode禁止 │
│ - Signed request object必須 │
├─────────────────────────────────────────┤
│ FAPI Part 2 (Advanced) 5.2.2 │ ← Part 1の一部を上書き
│ - Client authentication制限(上書き) │
│ - Sender-constrained tokens必須 │
│ - Request object lifetime制限 │
├─────────────────────────────── ──────────┤
│ FAPI Part 1 (Baseline) 5.2.2 │ ← 基本セキュリティ要件
│ - Confidential client必須 │
│ - 鍵サイズ・エントロピー要件 │
│ - トークン推測不可能性 │
├─────────────────────────────────────────┤
│ 基本OIDC/OAuth 2.0 │ ← 標準プロトコル
└─────────────────────────────────────────┘
FAPI CIBA準拠 = すべての層の要件を満たす