

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# アプリケーションにおける脅威保護のためのデータ収集
<a name="user-pool-settings-viewing-threat-protection-app"></a>

Amazon Cognito [アダプティブ認証](cognito-user-pool-settings-adaptive-authentication.md)は、ユーザーのサインイン試行のコンテキスト詳細からアカウント乗っ取りを試みた場合のリスクレベルを評価します。Amazon Cognito の脅威保護がリスクをより正確に評価できるように、アプリケーションは API リクエストに*コンテキストデータ*を追加する必要があります。コンテキストデータは、ユーザーがユーザープールにどのように接続したかに関するコンテキスト情報を提供する、IP アドレス、ブラウザエージェント、デバイス情報、リクエストヘッダーなどの情報です。

このコンテキストを Amazon Cognito に送信するアプリケーションの主な責任は、ユーザープールへの認証リクエストの `EncodedData` パラメータです。このデータをリクエストに追加するには、この情報を自動的に生成する SDK を使用して Amazon Cognito を実装することも、このデータを収集する JavaScript、iOS、または Android 用のモジュールを実装することもできます。Amazon Cognito に直接リクエストを行う*クライアント専用*アプリケーションは AWS Amplify SDKs を実装する必要があります。中間サーバーまたは API コンポーネントを持つ*クライアントサーバー*アプリケーションは、別の SDK モジュールを実装する必要があります。

次のシナリオでは、認証フロントエンドが、追加の設定なしでユーザーコンテキストのデータ収集を管理します。
+ マネージドログインは、コンテキストデータを自動的に収集して脅威保護に送信します。
+ すべての AWS Amplify ライブラリには、認証方法に組み込まれたコンテキストデータ収集があります。

## Amplify を使用したクライアント専用アプリケーションでのユーザーコンテキストデータの送信
<a name="user-pool-settings-viewing-threat-protection-app-amplify"></a>

![\[Amplify アプリケーションでの脅威保護のためのデータ収集の概要。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/user-pools-asf-amplify-data-collection.png)


Amplify SDK は、Amazon Cognito で直接認証するモバイルクライアントをサポートします。この種類のクライアントは、Amazon Cognito パブリック API オペレーションに直接 API リクエストを行います。Amplify クライアントは、デフォルトで脅威保護のためのコンテキストデータを自動的に収集します。

JavaScript を使用した Amplify アプリケーションは例外です。ユーザーコンテキストデータを収集する [JavaScript モジュール](#user-pool-settings-viewing-threat-protection-app-additional-resources-js)を追加する必要があります。

通常、この設定のアプリケーションは、[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) や [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) などの認証されていない API オペレーションを使用します。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) オブジェクトは、これらのオペレーションのリスクをより正確に評価するのに役立ちます。Amplify SDK は、デバイスとセッション情報を `UserContextData` の `EncodedData` パラメータに追加します。

## クライアントサーバーアプリケーションでのコンテキストデータの収集
<a name="user-pool-settings-viewing-threat-protection-app-server-side"></a>

一部のアプリケーションには、ユーザー認証データを収集するフロントエンド層と、Amazon Cognito に認証リクエストを送信するアプリケーションバックエンド層があります。これは、マイクロサービスベースのウェブサーバーとアプリケーションの一般的なアーキテクチャです。これらのアプリケーションでは、パブリックコンテキストデータ収集ライブラリをインポートする必要があります。

![\[JavaScript での脅威保護のコンテキストデータを使用したサーバー側の認証の概要。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/user-pools-asf-non-amplify-data-collection.png)


通常、この設定のアプリケーションサーバーは、[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) や [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) などの認証された API オペレーションを使用します。[ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) オブジェクトは、Amazon Cognito がこれらのオペレーションのリスクをより正確に評価するのに役立ちます。`ContextData` のコンテンツは、フロントエンドがサーバーに渡したエンコードされたデータと、ユーザーによる HTTP リクエストからサーバーへの追加の詳細です。HTTP ヘッダーや IP アドレスなど、これらの追加のコンテキストの詳細により、アプリケーションサーバーにユーザーの環境の特性が提供されます。

また、アプリケーションサーバーは、[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) や [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) などの認証されていない API オペレーションでサインインする場合もあります。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-UserContextData) オブジェクトは、これらのオペレーションにおける脅威保護のセキュリティリスク分析に役立ちます。利用可能なパブリックコンテキストデータ収集ライブラリ内のオペレーションは、認証リクエストの `EncodedData` パラメータにセキュリティ情報を追加します。さらに、追加のコンテキストデータを受け入れるようにユーザープールを設定し、ユーザーのソース IP を `UserContextData` の `IpAddress` パラメータに追加します。

**クライアントサーバーアプリケーションにコンテキストデータを追加するには**

1. フロントエンドアプリケーションで、[iOS、Android、または JavaScript モジュール](#user-pool-settings-viewing-threat-protection-app-additional-resources)を使用してクライアントからエンコードされたコンテキストデータを収集します。

1. エンコードされたデータと認証リクエストの詳細をアプリケーションサーバーに渡します。

1. アプリケーションサーバーで、HTTP リクエストから、ユーザーの IP アドレス、関連する HTTP ヘッダー、リクエストされたサーバー名、リクエストされたパスを抽出します。これらの値を Amazon Cognito への API リクエストの [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) パラメータに入力します。

1. SDK モジュールが収集したエンコードされたデバイスデータを使用して、API リクエストの `ContextData` の `EncodedData` パラメータを入力します。このコンテキストデータを認証リクエストに追加します。

## クライアントサーバーアプリケーション用のコンテキストデータライブラリ
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources"></a>

### JavaScript
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-js"></a>

`amazon-cognito-advanced-security-data.min.js` モジュールは、アプリケーションサーバーに渡すことができる `EncodedData` を収集します。

`amazon-cognito-advanced-security-data.min.js` モジュールを JavaScript 設定に追加します。を、、`us-east-1`、`us-east-2`、、`eu-west-2`、または `us-west-2` `eu-west-1` AWS リージョン のリストから `<region>`に置き換えます`eu-central-1`。

```
<script src="https://amazon-cognito-assets.<region>.amazoncognito.com/amazon-cognito-advanced-security-data.min.js"></script>
```

`EncodedData` パラメータで使用できる `encodedContextData` オブジェクトを生成するには、JavaScript アプリケーションソースに以下を追加します。

```
var encodedContextData = AmazonCognitoAdvancedSecurityData.getData(_username, _userpoolId, _userPoolClientId);
```

### iOS/Swift
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-ios"></a>

コンテキストデータを生成するには、iOS アプリケーションは、[Mobile SDK for iOS](https://github.com/aws-amplify/aws-sdk-ios/tree/main) モジュール [AWSCognitoIdentityProviderASF](https://github.com/aws-amplify/aws-sdk-ios/tree/main/AWSCognitoIdentityProviderASF) を統合できます。

脅威保護のためにエンコードされたコンテキストデータを収集するには、次のスニペットをアプリケーションに追加します。

```
import AWSCognitoIdentityProviderASF

let deviceId = getDeviceId()
let encodedContextData = AWSCognitoIdentityProviderASF.userContextData(
                            userPoolId, 
                            username: username, 
                            deviceId: deviceId, 
                            userPoolClientId: userPoolClientId)
                                
/**
 * Reuse DeviceId from keychain or generate one for the first time.
 */
func getDeviceId() -> String {
    let deviceIdKey = getKeyChainKey(namespace: userPoolId, key: "AWSCognitoAuthAsfDeviceId")
    
   if let existingDeviceId = self.keychain.string(forKey: deviceIdKey) {
        return existingDeviceId
    }

    let newDeviceId = UUID().uuidString
    self.keychain.setString(newDeviceId, forKey: deviceIdKey)
    return newDeviceId
}

/**
 * Get a namespaced keychain key given a namespace and key
 */    
func getKeyChainKey(namespace: String, key: String) -> String {
    return "\(namespace).\(key)"
}
```

### Android
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-android"></a>

コンテキストデータを生成するには、Android アプリケーションは、[Mobile SDK for Android](https://github.com/aws-amplify/aws-sdk-android/tree/main) モジュール [aws-android-sdk-cognitoidentityprovider-asf](https://github.com/aws-amplify/aws-sdk-android/tree/main/aws-android-sdk-cognitoidentityprovider-asf) を統合できます。

脅威保護のためにエンコードされたコンテキストデータを収集するには、次のスニペットをアプリケーションに追加します。

```
UserContextDataProvider provider = UserContextDataProvider.getInstance();
// context here is android application context.
String encodedContextData = provider.getEncodedContextData(context, username, userPoolId, userPoolClientId);
```