GTAF는 DPA와 통신할 때 사용자 키를 사용하여 구독자를 식별합니다. 사용자의 MSISDN에 액세스할 수 있는 애플리케이션은 이를 user_key로 사용할 수 있습니다. 반면 MSISDN에 액세스할 수 없는 애플리케이션은 사용자의 MSISDN을 검색하지 않고 이동통신사 요금제 식별자 (CPID)를 설정해야 합니다. 다음에서는 CPID를 설정하는 메커니즘을 설명합니다.
CPID 통화 흐름
그림 2: CPID를 설정하는 호출 흐름
- UE의 Google 애플리케이션은 Google 내부 API를 사용하여 GTAF에서 CPID 엔드포인트의 URL을 가져옵니다. 운영자는 클라이언트의 공개 IP 주소와 활성 SIM 카드의 MCC+MNC를 사용하여 식별됩니다. MVNO의 경우 Google은 SPN 및 GID1을 사용하여 MVNO를 확인합니다.
- 클라이언트는 CPID 엔드포인트에 HTTP GET 요청을 실행합니다. 운영자는 HTTPS를 통해 요청을 전송하는 것을 지원할 수 있습니다(MAY).
- 운영자는 딥 패킷 검사 기능을 사용하여 요청을 식별하고 사용자의 전화번호를 HTTP 헤더로 요청에 삽입할 수 있습니다(MAY).
- CPID 엔드포인트는 요청을 수신하고 CPID를 구성하며 UE가 이 CPID를 사용할 수 있는 기간을 나타내는 수명 (TTL)과 함께 CPID를 UE에 반환합니다.
운영자는 원하는 경우 CPID 엔드포인트 URL에서 도메인 이름 대신 IP 주소를 사용할 수도 있습니다(MAY). IP 주소는 비공개 주소 공간에 있을 수 있지만, 운영자 네트워크 내의 Google 클라이언트가 연결할 수 있어야 합니다(MAY).
운영자는 온보딩 프로세스의 일환으로 Google에 다음 정보를 제공해야 합니다(SHALL).
- 애플리케이션이 CPID를 획득하기 위해 연락할 CPID_URL입니다. CPID_URL은 하나가 필수이지만 운영자는 가용성을 높이기 위해 여러 URL을 제공할 수 있습니다.
- 운영자가 소유한 IP 접두사 목록과 운영자가 제공된 CPID_URL에 매핑하려는 모바일 국가 코드(MCC) 및 모바일 네트워크 코드(MNC)입니다. 운영자가 SPN 또는 GID1을 사용하여 네트워크에서 MVNO를 구분하는 경우 운영자는 이 정보도 제공해야 합니다(SHALL). 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로 인코딩됩니다. 또한 CPID가 URL에 사용되는 경우 Base64에 사용되는 특수문자(/+=)를 처리하기 위해 URL로 인코딩해야 합니다(MUST). 특히 GTAF가 DPA를 호출하거나 DPA가 모바일 데이터 요금제 공유 API를 호출하는 경우 CPID는 URL로 인코딩되어야 합니다(MUST).
특정 운영자의 상황에 따라 CPID 엔드포인트를 구현하는 것이 쉽지 않을 수 있습니다. 자주 발생하는 특정 문제는 CPID 엔드포인트에서 MSISDN에 액세스하는 것입니다. 운영자 온보딩을 통해 얻은 교훈을 공유해 드립니다. 문제가 발생하면 언제든지 문의해 주세요.
CPID 스토리지
위에 설명된 메커니즘을 사용하여 생성된 CPID는 데이터베이스에 저장하지 않아도 됩니다. DPA에 대한 전화를 처리하는 데 필요한 정보는 CPID에서 파생될 수 있습니다.
- DPA가 요금제 상태 또는 혜택에 관해 GTAF로부터 호출을 수신하면 CPID를 복호화하고 MSISDN을 추출하여 MSISDN을 파생시킬 수 있습니다.
- CPID의 만료 시간은 CPID를 복호화한 후 만료 타임스탬프를 추출하여 파생시킬 수 있습니다.
가용성 및 용량 요구사항
클라이언트가 CPID를 가져올 수 없는 경우 모바일 데이터 요금제 API의 정보에 액세스할 수 없습니다. 따라서 운영자는 CPID 엔드포인트의 가용성을 보장하기 위해 필요한 조치를 취해야 합니다(SHALL). 이러한 조치에는 CPID 엔드포인트 및 DPI 기능의 여러 인스턴스를 보유하고 두 기능 모두에 물리적, 사이트, 네트워크 중복을 보유하며 시스템 리소스와 용량이 적절한지 확인하는 것이 포함됩니다. 또한 헤더를 삽입하는 DPI 기능뿐만 아니라 CPID 엔드포인트도 CPID를 요청하는 모든 Google 클라이언트의 부하를 처리할 수 있는 충분한 용량을 갖춰야 합니다. CPID 엔드포인트는 ttlSeconds
필드에서 더 큰 값을 사용하여 CPID 생성 빈도를 줄일 수 있습니다.
오류 케이스
오류가 발생하면 CPID 엔드포인트는 ErrorResponse 인스턴스를 포함해야 하는 응답 본문과 함께 HTTP 오류를 반환해야 합니다(MUST). 좋은 오류 메시지에는 오류의 원인을 디버깅하는 데 도움이 되는 정보가 포함됩니다. 예를 들어 CPID가 만료된 경우 CPID 생성 및 만료 시간을 포함하면 CPID 엔드포인트가 설계된 대로 작동하는지 확인하는 데 도움이 됩니다.
{
"errorMessage": "<error message>",
"cause": "USER_ROAMING"
}
CPID 엔드포인트는 시나리오에 따라 다음을 반환해야 합니다(MUST).
- CPID 요청이 운영자 네트워크에 속하지 않는 사용자(예: 다른 운영자에 속하지만 이 CPID 엔드포인트에서 제공하는 네트워크에서 로밍하는 사용자) 또는 Google과 데이터 요금제 정보를 공유하지 않기로 선택한 사용자에 대해 수신되는 경우 CPID 엔드포인트는 USER_ROAMING, USER_OPT_OUT 또는 INELIGIBLE_FOR_SERVICE를 원인으로 하여 HTTP 상태 코드 403을 반환해야 합니다(MUST).
- 잘못된 전화번호로 CPID 요청이 수신되면 CPID 엔드포인트는 INVALID_NUMBER 오류 원인과 함께 HTTP 400을 반환해야 합니다(MUST).
- CPID 엔드포인트에 대한 요청이 다른 방식으로 잘못된 경우 CPID 엔드포인트는 ERROR_CAUSE_UNSPECIFIED를 원인으로 사용하여 HTTP 400을 반환해야 합니다(MUST).
- 다른 오류 원인의 경우 호환되는 HTTP 오류 코드를 사용할 수 있습니다. 특히 HTTP 500은 CPID 엔드포인트의 내부 장애에 적합한 오류 원인입니다.