CPID 설정

GTAF는 DPA와 통신할 때 사용자 키를 사용하여 구독자를 식별합니다. 사용자의 MSISDN에 액세스할 수 있는 애플리케이션은 이 키를 user_key로 사용할 수 있습니다. 반면에 MSISDN에 액세스할 수 없는 애플리케이션은 사용자의 MSISDN을 탐색하지 않고 이동통신사 요금제 식별자(CPID)를 설정해야 합니다. 다음 섹션에서는 CPID를 설정하는 메커니즘을 설명합니다.

CPID 통화 흐름

그림 2: CPID를 설정하기 위한 호출 흐름

  1. UE의 Google 애플리케이션은 Google 내부 API를 사용하여 GTAF에서 CPID 엔드포인트의 URL을 검색합니다. 클라이언트의 공개 IP 주소와 활성 SIM 카드의 MCC+MNC를 사용하여 연산자가 식별됩니다. MVNO의 경우 Google은 SPNGID1을 사용하여 MVNO를 결정합니다.
  2. 클라이언트는 CPID 엔드포인트에 HTTP GET 요청을 보냅니다. 연산자는 HTTPS를 통한 요청 전송을 지원할 수 있습니다(MAY).
  3. 운영자는 Deep Packet Inspection 함수를 사용하여 요청을 식별하고 사용자의 전화번호를 요청에 HTTP 헤더로 삽입할 수 있습니다(MAY).
  4. CPID 엔드포인트가 요청을 수신하고 CPID를 구성한 다음 UE를 통해 이 CPID를 사용할 수 있는 기간을 나타내는 TTL (수명)을 UE에 반환합니다.

원한다면 CPID 엔드포인트 URL에 도메인 이름 대신 IP 주소를 사용할 수도 있습니다(MAY). IP 주소는 비공개 주소 공간에 있을 수 있지만 운영자 네트워크 내부의 Google 클라이언트가 연결할 수 있어야 합니다.

연산자는 온보딩 프로세스의 일부로 Google에 다음 정보를 제공해야 합니다(MUST).

  1. 애플리케이션이 CPID를 획득하기 위해 연결할 CPID_URL입니다. CPID_URL 하나가 필수이지만 연산자가 가용성을 높이기 위해 여러 URL을 제공할 수 있습니다.
  2. 이동통신사가 소유한 IP 프리픽스 목록과 제공된 CPID_URL에 연산자가 매핑하려는 모바일 국가 코드(MCC) 및 모바일 네트워크 코드(MNC) 연산자가 SPN 또는 GID1을 사용하여 네트워크에서 MVNO를 구별하는 경우 연산자도 이 정보를 제공해야 합니다. Google은 그림 2의 1단계와 같이 이 정보를 사용하여 클라이언트를 해당하는 CPID 엔드포인트에 일치시킵니다.

요청의 형식은 다음과 같습니다. GET CPID_URL 기존의 이유로 CPID 엔드포인트는 다음과 같은 요청을 지원할 수 있어야 합니다.

GET CPID_URL?app={app_id}

CPID 엔드포인트는 CPID를 생성할 때 {app_id} URL 매개변수를 무시할 수 있습니다. 하지만 매개변수가 포함된 요청을 처리할 수 있어야 합니다(MUST).

CPID 엔드포인트에 대한 요청에 Accept-Language 헤더를 포함할 수 있습니다(MAY). DPA에서 모바일 데이터 요금제 공유 API를 사용하여 전송하는 업데이트에 헤더가 포함되면 사람이 읽을 수 있는 문자열이 CPID 요청에 제공된 설정을 사용해야 합니다(MUST).

클라이언트가 GET CPID_URL 요청을 실행할 때마다 새 CPID를 수신해야 합니다(MUST). CPID 생성에 성공하면 CPID 엔드포인트에서 200 OK 응답을 반환해야 합니다(MUST). 응답 본문에는 CPIDResponse의 인스턴스가 포함되어야 합니다(MUST).

{
    "cpid": "<CPID_string>",
    "ttlSeconds": 2592000
}

이후 다른 CPID를 요청한 경우에도 반환된 CPID는 ttlSeconds 동안 유효해야 합니다(MUST). 최상의 사용자 환경을 위해 TTL 값은 30일에서 14일 이상으로 설정하는 것이 좋습니다. GTAF는 이후의 DPA 호출에서 RFC2396에 따라 CPID를 인코딩합니다.

CPID 생성

CPID 엔드포인트가 CPID를 생성할 때 권장하는 방법은 다음과 같습니다.

CPID_string = Base64(AES(MSISDN + TimeStamp + language, secret))

CPID 엔드포인트는 MSISDN, Accept-Language 헤더의 클라이언트가 전송한 언어, 고해상도 타임스탬프를 연결하고 secret 키를 사용하여 AES를 통해 암호화합니다. 타임스탬프는 CPID가 만료되는 시간과 일치해야 합니다(SHOULD). 암호화된 출력은 Base64로 인코딩됩니다. 또한 URL에 CPID가 사용되는 경우 Base64에 사용되는 특수문자(/+=)를 처리하기 위해 URL로 인코딩되어야 합니다(MUST). 특히 GTAF가 DPA를 호출하거나 DPA가 모바일 데이터 요금제 공유 API를 호출하는 경우 CPID는 URL로 인코딩되어야 합니다(MUST).

특정 운영자의 상황에 따라 CPID 엔드포인트를 구현하는 것이 그리 간단하지 않을 수도 있습니다. 자주 발생하는 문제 중 하나는 CPID 엔드포인트에서 MSISDN에 액세스하는 것입니다. Google은 온보딩 교육 운영자에게 배운 내용을 공유합니다. 문제가 발생하면 문의해 주세요.

CPID 저장소

위에 설명된 메커니즘을 사용하여 생성된 CPID는 데이터베이스에 저장할 필요가 없습니다. DPA 호출 처리와 관련된 정보는 CPID에서 가져올 수 있습니다.

  1. DPA가 요금제 상태 또는 혜택에 관한 GTAF 호출을 수신하면 CPID를 복호화하고 MSISDN을 추출하여 MSISDN을 가져올 수 있습니다.
  2. CPID의 만료 시간은 CPID를 복호화한 후 만료 타임스탬프를 추가하여 도출할 수 있습니다.

가용성 및 용량 요구사항

클라이언트가 CPID를 검색할 수 없으면 Mobile Data Plan API에서 어떠한 정보에도 액세스할 수 없습니다. 따라서 연산자는 CPID 엔드포인트의 가용성을 보장하는 데 필요한 조치를 취해야 합니다. 이러한 조치에는 CPID 엔드포인트와 DPI 함수의 인스턴스 여러 개를 포함하고 두 함수의 물리적, 사이트, 네트워크 중복성을 갖추고 시스템 리소스와 용량이 적절한지 확인하는 것이 포함됩니다. 또한 CPID 엔드포인트와 헤더를 삽입하는 DPI 함수는 CPID를 요청하는 모든 Google 클라이언트의 로드를 처리할 수 있어야 합니다. CPID 엔드포인트는 ttlSeconds 필드에 더 큰 값을 사용하여 CPID를 생성하는 빈도를 줄일 수 있습니다.

오류 사례

오류가 발생하면 CPID 엔드포인트는 ErrorResponse의 인스턴스를 포함해야 하는 응답 본문과 함께 HTTP 오류를 반환해야 합니다(MUST). 좋은 오류 메시지에는 오류의 원인을 디버깅하는 데 도움이 되는 정보가 포함됩니다. 예를 들어 CPID가 만료된 경우 CPID 생성 및 만료 시간을 포함하여 CPID 엔드포인트가 설계대로 작동하는지 확인할 수 있습니다.

{
    "errorMessage": "<error message>",
    "cause": "USER_ROAMING"
}

CPID 엔드포인트는 시나리오에 따라 다음을 반환해야 합니다(MUST).

  1. 운영자 네트워크에 속하지 않은 사용자(예: 이 CPID 엔드포인트에서 제공하는 네트워크를 로밍 중인 사용자) 또는 Google과 데이터 요금제 정보를 공유하도록 선택하지 않은 CPID 요청이 수신된 경우, CPID 엔드포인트는 USER_ROAMING, USER_OPT_OUT 또는 INELIGBLE을 통해 HTTP 상태 코드 403을 반환해야 합니다(MUST).
  2. 잘못된 전화번호가 포함된 CPID 요청이 수신되면 CPID 엔드포인트가 INVALID_NUMBER 오류 원인과 함께 HTTP 400을 반환해야 합니다(MUST).
  3. CPID 엔드포인트에 대한 요청의 형식이 잘못 지정되면 CPID 엔드포인트가 ERROR_CAUSE_UNSPECIFIED를 원인으로 HTTP 400을 반환해야 합니다(MUST).
  4. 기타 오류의 경우 호환되는 HTTP 오류 코드를 사용할 수 있습니다. 특히 HTTP 500은 CPID 엔드포인트에서 발생하는 모든 내부 장애에 적합한 오류 원인입니다.