ベストプラクティス
年齢確認のベストプラクティス
確認失敗の処理
アクセス年齢確認を実装する場合、開発者は確認結果のfailureReasonフィールドをチェックして、失敗を適切に処理する必要があります:
- 不正活動の検出: 確認が失敗し、
failureReasonがfraudulent-activity-detectedの場合、そのユーザーに対して追加の確認試行を許可しないでください。 - その他の失敗理由: 他のすべての失敗理由(
age-criteria-not-metやmax-attempts-exceededなど)については、悪用を防ぎながら正当な再試行を許可するためにレート制限を実装します。24時間あたり最大3回の確認試行を許可してください。これにより、ユーザーが確認システムを繰り返し回避しようとすることを防ぎながら、正当なユーザーに合理的な再試行の機会を提供します
セキュリティの推奨事項
サーバー専用のAPI呼び出し
重要
すべてのウィジェットURL生成エンドポイントは、サーバーからのみ呼び出す必要があり、クライアント側のコードから直接呼び出さないでください。
k-ID APIキーは保護する必要がある秘密の認証情報です:
- APIキーを安全に保存するためにシークレットマネージャーを使用する
- APIキーを公開しない - フロントエンドJavaScript、モバイルアプリコード、またはクライアント向けコードに含めない
- APIキーをクライアントデバイスまたはクライアント側ストレージに保存しない
ターゲットオリジン設定
CDKは、Compliance Studioでターゲットオリジンを設定する機能を提供し、どのドメインがウィジェットを埋め込めるかを制御します。この設定は、Content Security Policyのframe-ancestorsディレクティブを制御します。オプションのセキュリティ対策として、リスク許容度を評価し、セキュリティ要件に基づいてターゲットオリジン制限を実装するかどうかを決定することを推奨します。
設定オプション:
- 特定のドメイン: 本番環境用に正確なドメインを設定(たとえば、
https://yourgame.com) - ワイルドカードサブドメイン: サブドメインにワイルドカードパターンを使用(たとえば、
https://*.yourgame.com) - 無制限: 無制限の埋め込みのために空のままにするか
*に設定(本番環境では推奨されません)
セキュリティ上のメリット: ターゲットオリジンは、攻撃者が悪意のあるサイトの透明なiframeに確認フローを埋め込み、他のコンテンツをオーバーレイしてユーザーが誤って確認要素をクリックするようにだますことを防ぎます。
重要
実装に関する注意事項:
- 各環境(テスト/ライブ)に対して個別のターゲットオリジンを設定する
- 本番環境に移行する前に、すべての本番エンドポイントでターゲットオリジンが適切に設定されていることを確認してください。
- ワイルドカードを使用しない限り、各サブドメインには独自のエントリが必要です
情報
ターゲットオリジン設定に関係なく、特定のk-IDページのみがiframeに埋め込むことができます(確認ページ、ウィジェット、VPCフロー)。他のすべてのk-IDページ(家族管理、アカウント設定)は、常にiframe埋め込みからブロックされます。
iframe権限
iframeのallow属性に必要な権限を常に含めてください:
<iframe
src="WIDGET_URL"
allow="camera;payment;publickey-credentials-get;publickey-credentials-create"
width="100%"
height="600"
></iframe>
権限の内訳:
camera- 顔年齢推定に必要payment- クレジットカード確認に必要publickey-credentials-create- AgeKey作成に必要publickey-credentials-get- AgeKey確認に必要
オリジンの検証
受信メッセージのオリジンを常に検証してください:
window.addEventListener('message', (event) => {
// 環境に基づいてオリジンを検証
const validOrigins = [
'https://family.k-id.com', // ライブ環境
'https://family.test.k-id.com' // テスト環境
];
if (!validOrigins.includes(event.origin)) {
return; // 許可されていないオリジンからのメッセージを無視
}
// イベントを処理
handleWidgetEvent(event.data);
});