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

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

앱 체크를 사용해야 하는 이유

App Check은 iOS용 Navigation SDK의 두 가지 영역(기본 탐색 기능 및 중단 보고)을 보호합니다.

앱 체크는 악성 또는 승인되지 않은 소스의 기본 Navigation SDK for iOS 요청을 차단하는 데 도움이 됩니다. 이렇게 하면 결제 사기 및 할당량 소진으로부터 프로젝트를 보호하여 직접적인 이점을 얻을 수 있습니다.

중단 신고

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

보고에 App Check가 중요한 이유:

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

App Check가 나에게 적합한가요?

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

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

구현 단계 개요

대략적으로 앱을 앱 체크와 통합하려면 다음 단계를 따르세요.

  1. 앱에 Firebase를 추가합니다.
  2. 앱 체크 라이브러리를 추가하고 앱 체크를 초기화합니다.
  3. 토큰 제공업체를 추가합니다. 이 단계에서는 선택한 증명 프로바이더를 호출하여 기기 또는 앱의 무결성을 확인합니다.
  4. Navigation 및 App Check 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의 Membership(멤버십) 탭에 있는 팀 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를 사용하는 경우 AppCheckProviderFactory 구현을 만들고 FirebaseApp.configure()를 호출하기 전에 등록하세요.

      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단계: 탐색 및 App Check 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. 적용이 사용 설정되면 앱 체크에서 유효한 앱 체크 토큰이 없는 모든 트래픽을 거부합니다.