앱 체크를 사용하여 iOS용 Navigation SDK 보호

Firebase 앱 체크는 정당한 앱 이외의 소스에서 발생하는 트래픽을 차단하여 앱에서 Google Maps Platform으로의 호출을 보호합니다. 이를 위해 앱 체크는 App Attest와 같은 증명 프로바이더에게 앱 또는 기기의 신뢰성 평가를 요청합니다. 앱을 앱 체크와 통합하면 악의적이고 승인되지 않은 요청으로부터 보호할 수 있으며, 이는 승인되지 않은 청구로부터 결제를 보호합니다. 또한 앱 체크는 차량 앱 생태계에서 실시간 중단 보고를 크게 개선하여 앱을 사용하는 모든 운전자에게 도움이 됩니다. 자세한 내용은 중단 보고를 참고하세요.

앱 체크를 사용하는 이유

앱 체크는 iOS용 Navigation SDK의 두 가지 고유한 영역인 기본 탐색 기능과 중단 보고를 보호합니다.

앱 체크는 악의적이거나 승인되지 않은 소스의 기본 iOS용 Navigation SDK 요청을 차단하는 데 도움이 됩니다. 이는 결제 사기 및 할당량 소진으로부터 프로젝트를 보호하여 직접적인 이점을 제공합니다.

중단 보고

앱이 실시간 중단 보고 및 투표 기능을 지원하는 경우 앱 체크를 사용하는 것이 좋습니다. 앱 체크를 사용 설정하면 모든 실시간 피드백을 고려하여 운전자에게 가장 정확한 경로가 제공됩니다.

보고에 앱 체크가 중요한 이유:

  • 폐쇄에 대한 높은 신뢰도 기준: 도로 폐쇄와 같이 경로에 영향을 미치는 이벤트는 모든 운전자의 경로 지정 동작을 크게 변경할 수 있습니다. 지도를 잠재적인 반달리즘, 스팸 또는 부정확한 보고로부터 보호하기 위해 도로 폐쇄 중단에 대한 Google의 조정 인프라는 강력한 기기 및 앱 무결성 신호에 의존합니다.
  • 앱 체크에서 보고서를 검증하는 방법: iOS용 Navigation SDK에서 전송된 사용자 보고서 및 투표에는 Google의 백엔드에서 의견의 적법성을 검증하는 데 사용되는 앱 체크 토큰이 포함되어 있어 신뢰 수준을 높이고 라이브 지도 영향에 대해 평가할 수 있습니다.
  • 앱 체크를 생략할 때의 영향: 유효한 앱 체크 토큰 없이 제출된 보고서는 신뢰도가 낮은 모델에서 평가되며 자동 신호로만 처리될 수 있습니다. 즉, 사용자는 계속 보고하고 투표할 수 있지만 보고서가 지도에 표시되거나 다른 운전자의 경로에 영향을 미칠 가능성이 낮으며 추가 검증이 필요합니다.

앱 체크가 나에게 적합한가요?

대부분의 경우 앱 체크가 권장되지만 다음 시나리오에서는 앱 체크가 필요하지 않거나 지원되지 않습니다.

  • 비공개 또는 실험용 앱: 앱에 공개적으로 액세스할 수 없는 경우 앱 체크가 필요하지 않습니다.
  • 보안 침해된 기기: 권장되는 증명 제공자는 루팅 또는 탈옥된 휴대전화와 같은 신뢰할 수 없는 기기에서 iOS용 Navigation SDK가 실행되지 않도록 합니다. 이러한 기기를 지원하려면 맞춤 증명 프로바이더를 배포하세요.

구현 단계 개요

대략적으로 다음 단계에 따라 앱을 앱 체크와 통합합니다.

  1. 앱에 Firebase를 추가합니다.
  2. 앱 체크 라이브러리를 추가하고 앱 체크를 초기화합니다.
  3. 토큰 제공자를 추가합니다. 이 단계에서는 선택한 증명 프로바이더를 호출하여 기기 또는 앱의 무결성을 확인합니다.
  4. Navigation 및 앱 체크 API를 초기화합니다.
  5. 디버깅을 사용 설정합니다. 이는 개발 또는 지속적 통합 (CI) 환경에서 유용합니다.
  6. 적용을 사용 설정하기 전에 앱 요청을 모니터링합니다. 이렇게 하면 사용자를 방해하지 않고 앱 체크를 원활하게 적용할 수 있습니다.

앱 체크 통합을 계획할 때 고려사항

  • 증명 제공자 할당량: Google에서 권장하는 증명 제공자인 DeviceCheck 또는 App Attest에는 Apple에서 설정한 할당량 및 제한이 적용됩니다.
  • 시작 지연 시간: 앱 체크 토큰이 기기에 캐시되므로 대부분의 경우 사용자는 일반적인 사용 중에 지연 시간을 경험하지 않습니다. 시스템은 원활한 성능을 유지하기 위해 만료되기 전에 백그라운드에서 앱 체크 토큰을 자동으로 새로고침합니다. 그러나 유효한 앱 체크 토큰이 없으면 앱 사용자는 시작 시 약간의 지연 시간을 경험하게 됩니다. 예를 들어 이 지연 시간은 캐시된 토큰이 만료되거나 누락된 경우 콜드 스타트 중에 발생합니다.
  • 토큰 TTL: TTL (수명)은 앱 체크 토큰을 새로고침해야 하기 전에 유효한 기간을 결정합니다. Firebase Console에서 이 기간을 30분에서 7일로 구성할 수 있습니다. 1시간의 기간이 안전한 기준선으로 권장되지만 SDK는 TTL 기간의 약 절반에서 백그라운드 새로고침을 자동으로 시도합니다. 단계별 콘솔 안내는 Firebase 앱 체크 문서를 참고하세요.

앱을 앱 체크와 통합

기본 요건 및 요구사항

  • iOS용 Navigation SDK 버전 11.0 이상이 설치된 앱
  • 앱의 번들 ID
  • Apple Developer Console의 멤버십 탭에 있는 팀 ID
  • DeviceCheck를 사용하려는 경우 비공개 키 파일키 ID
  • Google Cloud 콘솔에서 앱의 소유자여야 합니다.
  • Google Cloud 콘솔의 앱 프로젝트 ID

1단계: 앱에 Firebase 추가

Firebase 개발자 문서의 안내에 따라 앱에 Firebase를 추가합니다. 수정되지 않은 GoogleService-Info.plist 파일을 프로젝트의 루트 수준에 추가합니다.

AppDelegate 파일에서 다음 모듈을 가져옵니다.

Swift

import FirebaseCore
import FirebaseAppCheck
import GoogleNavigation

Objective-C

@import FirebaseCore;
@import FirebaseAppCheck;
@import GoogleNavigation;

2단계: 앱 체크 라이브러리 추가 및 앱 체크 초기화

Firebase는 각 기본 증명 제공자에 대한 안내를 제공합니다. 이 안내에서는 Firebase 프로젝트를 설정하고 앱에 앱 체크 라이브러리를 추가하는 방법을 보여줍니다. 제공된 코드 샘플에 따라 앱 체크를 초기화합니다.

  1. Firebase 안내에 따라 앱 체크 라이브러리를 추가합니다.
  2. AppDelegate에서 앱 체크를 초기화합니다.
    • App Attest를 사용하는 경우 FirebaseApp.configure()를 호출하기 전에 AppCheckProviderFactory 구현을 만들고 등록합니다.

      Swift

      class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
          func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
              return AppAttestProvider(app: app)
          }
      }
      // In application(_:didFinishLaunchingWithOptions:)
      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()

      Objective-C

      #import <FirebaseCore/FirebaseCore.h>
      #import <FirebaseAppCheck/FirebaseAppCheck.h>
      
      @interface YourAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
      @end
      
      @implementation YourAppCheckProviderFactory
      - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
          return [[FIRAppAttestProvider alloc] initWithApp:app];
      }
      @end
      
      // In application:didFinishLaunchingWithOptions:
      YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
      [FIRApp configure];
    • 대신 DeviceCheck를 사용하는 경우 다음을 사용하여 팩토리를 설정합니다.

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      FIRDeviceCheckProviderFactory *providerFactory = [[FIRDeviceCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];

3단계: 토큰 제공자 추가

앱의 루트 수준에서 AppCheckTokenProvider라는 파일 (또는 Objective-C를 사용하는 경우 AppCheckTokenProvider.hAppCheckTokenProvider.m라는 두 개의 파일)을 만듭니다.

이 클래스는 GMSAppCheckTokenProvider 프로토콜을 준수하고 fetchAppCheckTokenWithCompletion 메서드를 구현해야 합니다.

Swift

import Foundation
import FirebaseAppCheck
import GoogleNavigation

class AppCheckTokenProvider: NSObject, GMSAppCheckTokenProvider {
    func fetchAppCheckToken(completion: @escaping (String?, Error?) -> Void) {
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let error = error {
                print("App Check Error: \(error)")
                completion(nil, error)
                return
            }
            guard let token = token else {
                completion(nil, NSError(domain: "AppCheck", code: -1, userInfo: [NSLocalizedDescriptionKey: "Token is nil"]))
                return
            }
            print("App Check Token: \(token.token)")
            completion(token.token, nil)
        }
    }
}

Objective-C

// AppCheckTokenProvider.h
#import <Foundation/Foundation.h>
#import <GoogleNavigation/GoogleNavigation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppCheckTokenProvider : NSObject <GMSAppCheckTokenProvider>
@end

NS_ASSUME_NONNULL_END
// AppCheckTokenProvider.m
#import "AppCheckTokenProvider.h"
#import <FirebaseAppCheck/FirebaseAppCheck.h>

@implementation AppCheckTokenProvider
- (void)fetchAppCheckTokenWithCompletion:(void (^)(NSString * _Nullable token, NSError * _Nullable error))completion {
    [[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                     completion:^(FIRAppCheckToken * _Nullable token, NSError * _Nullable error) {
        if (token) {
            completion(token.token, nil);
        } else {
            completion(nil, error);
        }
    }];
}
@end

4단계: Navigation 및 앱 체크 API 초기화

GMSServices를 사용하여 iOS용 Navigation SDK를 초기화하고 공유 불투명 서비스 핸들을 GMSServices로 캐스팅하여 토큰 제공자 인스턴스를 등록합니다.

Swift

// In application(_:didFinishLaunchingWithOptions:)
GMSServices.provideAPIKey("YOUR_API_KEY")

// Register your App Check token provider before initializing Navigation SDK for iOS
if let services = GMSServices.sharedServices() as? GMSServices {
    services.appCheckTokenProvider = AppCheckTokenProvider()
}

Objective-C

// In application:didFinishLaunchingWithOptions:
[GMSServices provideAPIKey:@"YOUR_API_KEY"];

// Register your App Check token provider before initializing Navigation SDK for iOS
((GMSServices *)[GMSServices sharedServices]).appCheckTokenProvider = [[AppCheckTokenProvider alloc] init];

5단계: 디버깅 사용 설정 (선택사항)

iOS용 Navigation SDK에 앱 체크가 적용되면 이러한 환경은 유효한 기기로 간주되지 않으므로 iOS용 Navigation SDK에 종속된 앱의 기능이 시뮬레이터 또는 지속적 통합 (CI) 환경에서 실행되지 않습니다. 개발 및 테스트 중에 이러한 환경에서 앱을 실행하려면 프로덕션 증명 제공자 대신 앱 체크 디버그 제공자를 사용하는 앱의 디버그 빌드를 만들어야 합니다.

  1. AppDelegate에서 디버그 제공자 팩토리를 구성합니다.

    Swift

    #if targetEnvironment(simulator)
    let providerFactory = AppCheckDebugProviderFactory()
    #else
    let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)

    Objective-C

    #if TARGET_OS_SIMULATOR
    id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init];
    #else
    id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init];
    #endif
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
  2. Xcode 프로젝트에서 로깅을 사용 설정하고 앱을 실행한 후 콘솔 로그에서 로컬 디버그 토큰을 찾습니다.
  3. 이 디버그 토큰을 복사하여 Firebase Console에 추가합니다. 자세한 내용은 Firebase 앱 체크 디버그 제공자 문서를 참고하세요.

6단계: 앱 요청 모니터링 및 적용 결정

적용을 사용 설정하기 전에 앱 요청을 모니터링하여 정당한 사용자를 방해하지 않도록 하세요.

  1. Firebase Console의 앱 체크 측정항목 화면을 방문하여 인증된 트래픽과 인증되지 않은 트래픽의 비율을 확인합니다.
  2. 대부분의 트래픽이 인증되고 정당한 사용자가 앱 체크 구현이 포함된 앱 버전으로 업데이트되었는지 확인한 후 적용을 사용 설정합니다.
  3. 적용이 사용 설정되면 앱 체크는 유효한 앱 체크 토큰이 없는 모든 트래픽을 거부합니다.