GDPR

GDPRコンプライアンス

「一般データ保護規則( General Data Protection Regulation:GDPR) 」は 欧州連合 (EU) 圏における個人データの保護 およびプライバシーに関する欧州発の法規制です。本法規制によると、 個人データを管理する企業は、 アクセス権、データポータビリティの権利、訂正権、削除権を尊重し、これらのリクエストに1か月以内に対応しなければなりません。 

モバイルアトリビューションにおいて、事前にどのユーザーが欧州経済領域の市民か否かはわからないため、全てのモバイルユーザーにGDPR対応が必要となりえます。

GDPRイニシアチブ

GDPRの遵守に向けて、データ主体からのリクエストに対処し管理するために、AppsFlyerは mParticle、 Amplitude、Braze の3社と連携してOpenGDPRプロトコルを構築しました。

OpenGDPRは統合されたオープンソース・フレームワークで、個人データの公平かつ透明性のある使用のために、テクノロジー企業間の連携をサポートします。データプライバシーに関するアクションを複数のシステム にて処理し、保管することができ、データプライバシー対策を取ることが容易になります。

GDPRイニシアチブに関しては こちらをご確認ください。

GDPR主体

データ主体(Data Subject) 個人データ取得の対象となるモバイルアプリのエンドユーザー。
データ管理者(Data Controller) 個人データの処理の目的と手段を決定する広告主。
データ処理者(Data Processor) データ管理者に代わって個人データの処理を行う、AppsFlyerと連携済みパートナー。

GDPRの法的要件

GDPRでは、データ主体の義務と権利について詳細に定められており、広告主はこれらを遵守しなければなりません。

権利

GDPRの定義

データ管理者へのAppsFlyerからのサポート

アクセス権

  1. リクエストがあった場合、データ主体はデータ管理者が個人データを処理する条件、理由や期間などを知る権利を有します。
  2. もしデータが第三者(AppsFlyerなど)に共有される場合、データ主体はその第三者を知る権利を有します。
  3. データ主体はどんな種類のデータが処理されているのか知る権利を有します。
  4. データ主体は、データに深刻な影響を生じ得るような自動処理が存在するかどうかを知る権利があります。
‘access’ リクエストを送信すると、データ管理者はデータ主体の処理された個人データのコピーを受信できます。 

データポータビリティの権利

データ主体は自分の個人データのすべてを、構造化され、一般的に使用され、機械によって読み取り可能な形式(CSVファイルなど)で受け取る権利を有します。

’portability’ リクエストを送信すると、データ管理者は、処理されたデータ主体の個人データのコピーを受信できます。

訂正権

データ主体は、自分の個人データが不正確であったり虚偽がある場合に訂正を要求できます。その場合、データ管理者は不備のある個人データを消去するか、訂正しなければなりません。

データ管理者が ‘rectification’ リクエストを送信すると、AppsFlyerはデータ主体の過去のデータを削除し、新しいデータに更新します。

削除権(忘れられる権利)

削除権により、データ管理者は個人データを1ヶ月以内に削除しなければなりません。

‘erasure’ リクエストを使用して、広告主は、収集されたデータ主体のデータを削除することができます。

GDPR_logo2.png

AppsFlyerのGDPRリクエストAPI

AppsFlyer では、GDPRリクエストAPIを通じて上記の要件をサポートします(2018年5月25日開始のため、それ以前のリクエストは処理されません)

  1. GDPRリクエスト - 上記のリクエストタイプ('access'、'portability'、'erasure'、'rectification')のいずれかを実行します。
  2. Status(ステータス)リクエスト - GDPRリクエストの現在のステータスを問い合わせます。
  3. Discovery(確認)リクエスト - サポートされるAPIのバージョンとデータフォーマットについて確認します。
  4. Cancellation(キャンセル)リクエスト - GDPRリクエストのステータスが pending(保留中)の場合、キャンセルします。

エンドユーザーがこれらのリクエストを送信できるようにGUIの変更を実装するかどうかは、データ管理者の責任となります。注:GDPRリクエストは1回につき1人のユーザーを対象とします。

1. GDPRリクエスト

GDPRリクエストフロー

GDPRリクエストフローは、すべてのリクエストタイプ('access'、'portability'、'erasure'、'rectification')で共通です。

  1. データ主体 (エンドユーザー)がリクエストを送信します。
  2. データ管理者 (広告主)がGDPRリクエストを作成し(次を参照)、AppsFlyerに送信します。
  3. データ処理者(AppsFlyer)はリクエストを受信し、リクエストが有効な場合は"201 OK"を返します。
  4. リクエストは48時間pending(保留中) のステータスでキューに入ります。その間はキャンセルができます。
  5. その後、リクエストのステータスがin_progress(処理中)に変わります。AppsFlyerは ‘status change’(ステータス変更)のポストバックを送信します。これ以降リクエストのキャンセルはできません。
  6. a) AppsFlyerは28日以内にリクエストを処理します。
    ‘erasure’ / 'rectification' リクエストの場合:エンドユーザーのデータは削除されます。
    ‘portability’ / ‘access’ リクエストの場合:AppsFlyerの管理画面にあるGDPRセクションか、リクエストAPIを使用してエンドユーザーのデータにアクセスできます。
    b) リクエストは completed(完了)のステータスに変わります。AppsFlyerは ‘status change’(ステータス変更)のポストバックを送信します。 

GDPRリクエストのフォーマット

GDPRリクエストはHTTP POST経由で次のエンドポイントに送信できます。 

https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=[api token]

リクエストには次のプロパティを指定します。 

プロパティ名 必須/オプション 説明
subject_request_id 必須 UUID バージョン4形式の文字列。データ管理者がデータ処理者へリクエストを送信する時 に生成する必要があります。
subject_request_type 必須 GDPRリクエストタイプを表す文字列値。 'access'、'portability'、'erasure'、'rectification' がサポートされています。
subject_identities 必須 Identityオブジェクトの配列 - type、value、format(デバイスIDのフォーマット)で構成されます(以下を参照)。 各リクエストにはデバイスIDを1つだけ指定できます。
submitted_time 必須 RFC 3339日時形式の文字列。データ主体が送信した元の リクエストの時間を表します。 タイムスタンプはすべてUTCで送信されることに注意してください。
property_id 必須 このリクエスト対象となるモバイルアプリを示す文字列。例:com.example(Androidの場合)、id123456789(iOSの場合)など
api_version オプション バージョン文字列。目的とするGDPRリクエストAPIのバージョンを表します。
status_callback_urls  オプション エンドポイント(URL)の配列。リクエストのステータスの変化に応じて送信されるstatusコールバックのURL。注: https形式のURLのみがサポートされています。

GDPRリクエストには、リクエストを処理するために使用される1つ以上のIdentityオブジェクトを含める必要があります。 

  1. identity_type - 必須  string value  Identityの種類を表す文字列の値です。AppsFlyerが対応しているIdentity Typeは、ios_advertising_idandroid_advertising_idfire_advertising_idmicrosoft_advertising_idです。 
  2. identity_value - 必須  string value  Identityを表す文字列の値です。
  3. identity_format - 必須  string value  Identityのエンコーディングを表す文字列の値です。現在AppsFlyerで対応しているIdentityの形式は raw のみです。    

GDPR Erasure(削除)リクエスト

HTTP POST 
https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token={api token] 
HTTP/1.1Host: example.processo.com
Accept: application/json
Content-Type: application/json
{  
   "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
   "subject_request_type":"erasure",
   "submitted_time":"2018-10-02T15:00:00Z",
   "subject_identities":[  
      {  
         "identity_type":"android_advertising_id",
         "identity_value":"a55684fd-j661-46df-9149-f7bfd652egge",
         "identity_format":"raw"
      }
   ],
   "api_version":"0.1",
   "property_id":"com.example",
   "status_callback_urls":[  
      "https://examplecontroller.com/opengdpr_callbacks"
   ]
}
 

 

GDPR Erasureリクエストの例

Java Python Node.js C#
/* 
using the okhttp package install from maven
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
 */

import okhttp3.*;
import java.io.IOException;

public class GdprSendRequest {
    public static void main(String[] args){

        OkHttpClient client = new OkHttpClient();
        RequestBody body = RequestBody.create(null, "" +
        "{\r\n\"subject_request_id\": \"<SUBJECT_ID>\"," +
        "\r\n\"subject_request_type\": \"erasure\"," +
        "\r\n\"submitted_time\": \"2018-11-02T15:00:00Z\"," +
        "\r\n\"subject_identities\": [\r\n" +
        "{\r\n\"identity_type\": \"android_advertising_id\"," +
        "\r\n\"identity_value\": \"<ADVERTISING_ID>\"," +
        "\r\n\"identity_format\": \"raw\"\r\n}" +
         "\r\n]," +
         "\r\n\"property_id\": \"com.example.application\"}");

        Request request = new Request.Builder()
        .url("https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=<API_TOKEN>")
        .post(body)
        .addHeader("Content-Type", "application/json")
         .addHeader("Accept", "application/json")
        .build();

        try {
            Response response = client.newCall(request).execute();
            System.out.println(response.code());
            System.out.println(response.body().string());
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

2. Status(ステータス)リクエスト

 subject_request_idを指定すると、送信済みの各GDPRリクエストのステータスを後で問い合わせることができます。次の4種類のステータスがサポートされています。

  1. pending(保留中) - 有効なリクエストが受信され、キューに保存されています。
  2. in_progress(処理中) - リクエストは現在処理中です。
  3. completed(完了) - リクエストは完了しています。
  4. canceled(キャンセル) - リクエストはキャンセルされました。

Statusリクエストのフォーマット

StatusリクエストはHTTP GET経由で次のエンドポイントに送信できます。

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Statusレスポンスの例

HTTP/1.1 200 OK
Content-Type: application/json
X-OpenGDPR-Processor Domain: example processor.com
X-OpenGDPR-Signature:
kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=
{
  "controller_id":"example_controller_id",
  "expected_completion_time":"2018-11-01T15:00:01Z",
  "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
  "request_status":"pending",
  "api_version":"0.1"
}

Statusポストバック

上記の GDPRリクエストフローのように、GDPRリクエストのステータスが pending(保留中)から in_progress(処理中)、completed(完了)の順に変化するとき、AppsFlyerは status_callback_urls プロパティで指定された、リクエスト中のエンドポイントにGDPRポストバックを送信します。

Statusポストバックの例:

POST /opengdpr_callbacks HTTP/1.1
Host: examplecontroller.com
Content-Type: application/json
X-OpenGDPR-Processor Domain: appsflyer.com
X-OpenGDPR-Signature: kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=

{
"controller_id":"example controller id at the processor",
"expected_completion_time":"2018-11-01T15:00:01Z",
"status_callback_url":"https://examplecontroller.com/opengdpr_callbacks",
"Subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
"Request_status":"pending"
}

3. Report(レポート)リクエスト

AccessリクエストやPortabilityリクエストが完了したら、次のエンドポイントにHTTP GET経由でレポートをダウンロードできます。

https://hq1.appsflyer.com/gdpr/download/[REQUEST_ID]?api_token=[TOKEN]

生成されたレポートは、完了から7日間利用可能です。

4. Discovery(確認)リクエスト

AppsFlyerでサポートされているフォーマットを確認するには、HTTP GET経由で次のエンドポイントにDiscoveryリクエストを送信します。

https://hq1.appsflyer.com/gdpr/discovery?api_token=[api token]

Discoveryレスポンスの例

HTTP/1.1 200 OK
Content-Type: application/json
{
  "api_version": "0.1",
  "supported_identities": [
    {
      "identity_type": "android_advertising_id",
      "identity_format": "raw"
    },
  ],
  "supported_subject_request_types": [
    "erasure", "access", "portability", "rectification"
  ],
  "processor_certificate": "https://exampleprocessor.com/cert.pem"
}

5. Cancellation(キャンセル)リクエスト

GDPRリクエストは subject_request_idに基づいてキャンセルできます。ただし、ステータスがpending (保留中)の場合のみです。 

キャンセルをリクエストするには、subject_request_id を指定してHTTP DELETEを送信します。

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Cancellationレスポンス

GDPRのCancellationリクエストを受信すると、AppsFlyerはステータスコード202のHTTPレスポンスをその他のパラメーターと一緒に返します。詳細については、GDPR 「Cancellation Response Properties」(Cancellationレスポンスのプロパティ)を参照してください。

Cancellationリクエストを実行後、AppsFlyerは cancelled (キャンセル済み)のステータスでポストバックを送信します。

6. GDPRリクエストのテストAPI

このAPIは、AppsFlyerのGDPRリクエストAPIをテストします。 

テストAPIの動作

テストAPIは次のように動作します。

1. GDPRリクエストが受け付けられると、リクエストはすぐに "Pending"(保留中)ステータスになります。テストのため、ステータスは30秒ごとに変わります。

GDPRリクエストにstatusポストバックのエンドポイントが指定されている場合、リクエストの直後に最初のポストバック(Pending)が送信され、続いて30秒間隔で2つのstatusポストバック(in_progress、completed)が送信されます。

GDPRリクエストのテストエンドポイント:

https://hq1.appsflyer.com/gdpr/stub?api_token=[api token]

Statusリクエストのテストエンドポイント:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

Discoveryリクエストのテストエンドポイント:

https://hq1.appsflyer.com/gdpr/stub/discovery?api_token=[api token]

Cancellationリクエストのテストエンドポイント:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

 注:

  • リクエストには、有効なAPIトークンが指定されている必要があります。
  • ”property_id” プロパティでは、アプリIDはアカウント所有者(広告主)のアプリである必要があります(APIトークンに基づく)。

リクエストのログ

送信済みのすべてのGDPRリクエストは、アカウント所有者のみがLogs(ログ)管理画面で閲覧できます。

完了したaccessおよびportabilityリクエストについては、この管理画面からレポートをダウンロードすることもできます。

Logs(ログ)管理画面へのアクセス:

1. メイン管理画面に移動し、ユーザー名をクリックします。

2.  Logs(ログ)をクリックすると、次のウィンドウが開きます。

GDPR_Table.png

 

この記事は役に立ちましたか?
2人中1人がこの記事が役に立ったと言っています