Google Play 서비스에서 제공하는 라이브러리인 SafetyNet Safe Browsing API는 URL이 Google에 의해 알려진 위협으로 표시되었는지 확인하는 서비스를 제공합니다.
앱은 이 API를 사용하여 Google이 특정 URL을 알려진 위협으로 분류했는지 여부를 확인할 수 있습니다. 내부적으로 SafetyNet은 Google이 개발한 세이프 브라우징 네트워크 프로토콜 v4용 클라이언트를 구현합니다. 클라이언트 코드와 v4 네트워크 프로토콜은 모두 사용자의 개인 정보 보호를 유지하고 배터리 및 대역폭 소모를 최소한으로 유지하도록 설계되었습니다. 이 API를 사용하면 리소스에 가장 최적화된 방법으로 그리고 네트워크 프로토콜을 구현하지 않고 Google의 세이프 브라우징 서비스를 Android에서 최대한 활용할 수 있습니다.
이 문서에서는 SafetyNet Safe Browsing Lookup API를 사용하여 URL에 알려진 위협이 있는지 확인하는 방법을 설명합니다.
서비스 약관
Safe Browsing API를 사용하면 서비스 약관을 준수할 것에 동의하는 것으로 간주됩니다. Safe Browsing API에 액세스하기 전에 모든 관련 약관 및 정책을 자세히 읽고 숙지하시기 바랍니다.
Android API 키 요청 및 등록하기
Safe Browsing API를 사용하기 전에 Android API 키를 만들고 등록하세요. 구체적인 단계는 세이프 브라우징 시작하기 페이지를 참고하세요.
SafetyNet API 종속 항목 추가
Safe Browsing API를 사용하기 전에 프로젝트에 SafetyNet API를 추가합니다. Android 스튜디오를 사용한다면 이 종속 항목을 앱 수준 Gradle 파일에 추가하세요. 자세한 내용은 SafetyNet을 사용하여 보안 위협으로부터 보호를 참고하세요.
API 초기화하기
Safe Browsing API를 사용하려면 initSafeBrowsing()
을 호출한 후 완료되도록 대기하여 API를 초기화해야 합니다. 다음 코드 스니펫을 예로 확인하세요.
Kotlin
Tasks.await(SafetyNet.getClient(this).initSafeBrowsing())
Java
Tasks.await(SafetyNet.getClient(this).initSafeBrowsing());
URL 확인 요청하기
앱은 URL 확인을 사용하여 URL이 알려진 위협을 가하는지 여부를 파악할 수 있습니다. 일부 위협 유형은 특정 앱과 관련이 없을 수 있습니다. API를 사용하면 개발자의 요구사항에 따라 중요한 위협 유형을 선택할 수 있습니다. 알려진 위협 유형을 여러 개 지정할 수 있습니다.
URL 확인 요청 보내기
API는 사용된 스키마에 구속되지 않으므로, 스키마를 사용하거나 사용하지 않고 URL을 전달할 수 있습니다. 예를 들어 다음 URL과
Kotlin
var url = "https://www.google.com"
Java
String url = "https://www.google.com";
다음 URL은
Kotlin
var url = "www.google.com"
Java
String url = "www.google.com";
모두 유효합니다.
다음 코드는 URL 확인 요청을 보내는 방법을 보여줍니다.
Kotlin
SafetyNet.getClient(this).lookupUri( url, SAFE_BROWSING_API_KEY, SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION, SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING ) .addOnSuccessListener(this) { sbResponse -> // Indicates communication with the service was successful. // Identify any detected threats. if (sbResponse.detectedThreats.isEmpty()) { // No threats found. } else { // Threats found! } } .addOnFailureListener(this) { e: Exception -> if (e is ApiException) { // An error with the Google Play Services API contains some // additional details. Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}") // Note: If the status code, s.statusCode, // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED, // you need to call initSafeBrowsing(). It means either you // haven't called initSafeBrowsing() before or that it needs // to be called again due to an internal error. } else { // A different, unknown type of error occurred. Log.d(TAG, "Error: ${e.message}") } }
Java
SafetyNet.getClient(this).lookupUri(url, SAFE_BROWSING_API_KEY, SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION, SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING) .addOnSuccessListener(this, new OnSuccessListener<SafetyNetApi.SafeBrowsingResponse>() { @Override public void onSuccess(SafetyNetApi.SafeBrowsingResponse sbResponse) { // Indicates communication with the service was successful. // Identify any detected threats. if (sbResponse.getDetectedThreats().isEmpty()) { // No threats found. } else { // Threats found! } } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // An error occurred while communicating with the service. if (e instanceof ApiException) { // An error with the Google Play Services API contains some // additional details. ApiException apiException = (ApiException) e; Log.d(TAG, "Error: " + CommonStatusCodes .getStatusCodeString(apiException.getStatusCode())); // Note: If the status code, apiException.getStatusCode(), // is SafetyNetStatusCode.SAFE_BROWSING_API_NOT_INITIALIZED, // you need to call initSafeBrowsing(). It means either you // haven't called initSafeBrowsing() before or that it needs // to be called again due to an internal error. } else { // A different, unknown type of error occurred. Log.d(TAG, "Error: " + e.getMessage()); } } });
URL 확인 응답 읽기
반환된 SafetyNetApi.SafeBrowsingResponse
객체를 사용하여 getDetectedThreats()
메서드를 호출합니다. 이 메서드는 SafeBrowsingThreat
객체의 목록을 반환합니다. 반환된 목록이 비어 있다면 API가 알려진 위협을 감지하지 않은 것입니다.
목록이 비어 있지 않으면 목록의 각 요소에서 getThreatType()
을 호출하여 API가 감지한 알려진 위협을 확인합니다.
권장되는 경고 언어를 보려면 Safe Browsing API 개발자 가이드를 참고하세요.
관심 있는 위협 유형 지정하기
다음과 같이 SafeBrowsingThreat
클래스의 상수에는 현재 지원되는 위협 유형이 포함됩니다.
위협 유형 | 정의 |
---|---|
TYPE_POTENTIALLY_HARMFUL_APPLICATION |
이 위협 유형은 잠재적으로 위험한 애플리케이션이 포함된 것으로 신고된 페이지의 URL을 식별합니다. |
TYPE_SOCIAL_ENGINEERING |
이 위협 유형은 소셜 엔지니어링 위협이 포함된 것으로 신고된 페이지의 URL을 식별합니다. |
API를 사용할 때는 위협 유형 상수를 인수로 추가합니다. 위협 유형 상수는 앱에 필요한 개수만큼 추가할 수 있지만 지원 중단된 것으로 표시되지 않은 상수만 사용할 수 있습니다.
세이프 브라우징 세션 종료하기
앱이 Safe Browsing API를 오랜 기간 사용하지 않아도 되면 앱 내에서 필요한 모든 URL을 확인한 다음 shutdownSafeBrowsing()
메서드를 사용하여 세이프 브라우징 세션을 종료하세요.
Kotlin
SafetyNet.getClient(this).shutdownSafeBrowsing()
Java
SafetyNet.getClient(this).shutdownSafeBrowsing();
활동의 onPause()
메서드에서 shutdownSafeBrowsing()
을 호출하고 활동의 onResume()
메서드에서 initSafeBrowsing()
을 호출하는 것이 좋습니다. 그러나 lookupUri()
를 호출하기 전에 initSafeBrowsing()
실행이 완료되었는지 확인해야 합니다.
세션을 항상 최신 상태로 유지하면 앱에서 내부 오류가 발생할 가능성을 줄일 수 있습니다.
SafetyNet Safe Browsing API에서 수집하는 데이터
SafetyNet Safe Browsing API는 Android에서 세이프 브라우징 서비스와 통신할 때 다음 데이터를 자동으로 수집합니다.
데이터 | 설명 |
---|---|
앱 활동 | 악성 URL 감지를 위해 로컬 해시 접두사 일치 후 URL의 해시 접두사를 수집합니다. |
Google은 최대한 투명하게 공개하는 것을 목표로 하지만, 앱의 사용자 데이터 수집, 공유 및 보안 관행과 관련하여 Google Play의 데이터 보안 섹션 양식에 응답하는 방법을 결정할 책임은 전적으로 개발자에게 있습니다.