Apple 플랫폼용 Firebase 앱 체크

1. 소개

Firebase 앱 체크는 요청이 합법적인 앱과 기기에서 오는지 확인하여 청구 사기, 피싱 등의 악용으로부터 백엔드 리소스를 보호하는 데 도움이 됩니다. Firebase 서비스 및 자체 백엔드 서비스와 함께 작동하여 리소스를 안전하게 유지합니다.

Firebase 문서에서 Firebase 앱 체크 에 대해 자세히 알아볼 수 있습니다.

앱 체크는 플랫폼별 서비스를 사용하여 앱 및/또는 기기의 무결성을 확인합니다. 이러한 서비스를 증명 제공자 라고 합니다. 그러한 공급자 중 하나가 Apple의 App Attest 서비스입니다. App Check는 이를 사용하여 Apple 앱 및 기기의 신뢰성을 확인할 수 있습니다.

무엇을 구축할 것인가

이 Codelab에서는 프로젝트의 실시간 데이터베이스가 불법 앱 및 기기에서 액세스되지 않도록 보호하기 위해 기존 샘플 애플리케이션에 앱 체크를 추가하고 시행합니다.

무엇을 배울 것인가

  • 기존 앱에 Firebase 앱 체크를 추가하는 방법
  • 다양한 Firebase 앱 체크 증명 제공자를 설치하는 방법
  • 앱에 대해 App Attest를 구성하는 방법
  • 앱 개발 중에 시뮬레이터에서 앱을 테스트하기 위해 디버그 증명 공급자를 구성하는 방법입니다.

필요한 것

  • Xcode 13.3.1 이상
  • 새로운 앱 식별자를 생성할 수 있는 Apple 개발자 계정
  • App Attest를 지원하는 iOS/iPadOS 디바이스( App Attest API 가용성 에 대해 알아보기)

2. 시작 프로젝트 받기

iOS용 Firebase 빠른 시작 저장소에는 다양한 Firebase 제품을 보여주는 샘플 앱이 포함되어 있습니다. 이 Codelab의 기반으로 SwiftUI용 Firebase 데이터베이스 빠른 시작 앱을 사용합니다.

명령줄에서 iOS용 Firebase 빠른 시작 저장소를 복제합니다.

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

Xcode에서 실시간 데이터베이스 SwiftUI 빠른 시작 앱 프로젝트를 엽니다.

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. 앱에 앱 체크 추가

  1. Swift Package Manager가 프로젝트의 종속성을 해결할 때까지 기다립니다.
  2. DatabaseExample (iOS) 앱 타겟의 General 탭을 엽니다. 그런 다음 프레임워크, 라이브러리 및 포함된 콘텐츠 섹션에서 + 버튼을 클릭합니다.
  3. FirebaseAppCheck 추가하려면 선택하세요.

4. 앱 체크 제공자 팩토리 생성 및 설치

  1. Shared 파일 그룹에서 AppCheck 라는 새 그룹을 추가합니다.
  2. 이 그룹 내에서 별도의 파일(예 MyAppCheckProviderFactory.swift )에 팩토리 클래스를 생성하고 이를 DatabaseExample (iOS) 대상에 추가해야 합니다:
    import Firebase
    
    class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
      func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
        #if targetEnvironment(simulator)
          // App Attest is not available on simulators.
          // Use a debug provider.
          return AppCheckDebugProvider(app: app)
        #else
          // Use App Attest provider on real devices.
          return AppAttestProvider(app: app)
        #endif
      }
    }
    
  3. 다음으로 DatabaseExampleApp.swift 에서 FirebaseAppCheck 가져와서 MyAppCheckProviderFactory 클래스의 인스턴스를 앱 체크 공급자 팩토리로 설정해야 합니다.
    import SwiftUI
    import FirebaseCore
    import FirebaseAppCheck
    
    @main
    struct DatabaseExampleApp: App {
      init() {
        // Set an instance of MyAppCheckProviderFactory as an App Check
        // provider factory before configuring Firebase.
        AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
        FirebaseApp.configure()
      }
      ...
    }
    

5. Firebase 프로젝트 생성 및 구성

iOS 프로젝트에서 앱 체크를 사용하려면 Firebase 콘솔에서 다음 단계를 따라야 합니다.

  • Firebase 프로젝트를 설정합니다.
  • Firebase 프로젝트에 iOS 앱을 추가합니다.
  • Firebase 인증을 구성합니다.
  • 보호할 실시간 데이터베이스 인스턴스를 초기화합니다.
  • 앱 체크를 구성합니다.

프로젝트 만들기

먼저 Firebase 프로젝트를 만들어야 합니다.

  1. Firebase 콘솔 에서 프로젝트 추가를 선택합니다.
  2. 프로젝트 이름을 App Check Codelab
  3. 계속을 클릭하세요.
  4. 이 프로젝트에 대해 Google Analytics를 비활성화한 다음 프로젝트 생성을 클릭합니다.

실시간 데이터베이스 인스턴스 생성

이제 Firebase 콘솔의 실시간 데이터베이스 섹션으로 이동합니다.

  1. 데이터베이스 생성 워크플로를 시작하려면 데이터베이스 생성 버튼을 클릭하세요.
  2. 데이터베이스의 기본 위치( us-central1 )를 변경하지 않고 그대로 두고 다음 을 클릭합니다.
  3. 잠금 모드가 선택되었는지 확인하고 활성화 버튼을 클릭하여 데이터베이스에 대한 보안 규칙을 활성화합니다.
  4. 실시간 데이터베이스 브라우저의 규칙 탭으로 이동하여 기본 규칙을 다음으로 바꿉니다.
    {
        "rules": {
            // User profiles are only readable/writable by the user who owns it
            "users": {
                "$UID": {
                    ".read": "auth.uid == $UID",
                    ".write": "auth.uid == $UID"
                }
            },
            // Posts can be read by anyone but only written by logged-in users.
            "posts": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    // UID must match logged in user and is fixed once set
                    "uid": {
                        ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                    },
                    // User can only update own stars
                    "stars": {
                        "$UID": {
                            ".validate": "auth.uid == $UID"
                        }
                    }
                }
            },
            // User posts can be read by anyone but only written by the user that owns it,
            // and with a matching UID
            "user-posts": {
                ".read": true,
                "$UID": {
                    "$POSTID": {
                        ".write": "auth.uid == $UID",
                        ".validate": "data.exists() || newData.child('uid').val() == auth.uid"
                    }
                }
            },
            // Comments can be read by anyone but only written by a logged in user
            "post-comments": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    "$COMMENTID": {
                        // UID must match logged in user and is fixed once set
                        "uid": {
                            ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                        }
                    }
                }
            }
        }
    }
    
  5. 업데이트된 보안 규칙을 활성화하려면 게시 버튼을 클릭하세요.

Firebase에 연결할 iOS 앱 준비

실제 장치에서 샘플 앱을 실행하려면 Xcode가 필요한 프로비저닝 프로필을 관리할 수 있도록 개발 팀에 프로젝트를 추가해야 합니다. 개발자 계정에 샘플 앱을 추가하려면 다음 단계를 따르세요.

  1. Xcode의 프로젝트 탐색기에서 DatabaseExample 프로젝트를 선택합니다.
  2. DatabaseExample (iOS) 대상을 선택하고 서명 및 기능 탭을 엽니다.
  3. "DatabaseExample(iOS)에 서명하려면 개발팀이 필요합니다."라는 오류 메시지가 표시됩니다.
  4. 번들 식별자를 고유 식별자로 업데이트합니다. 이를 달성하는 가장 쉬운 방법은 웹사이트의 역방향 도메인 이름(예: com.acme.samples.firebase.quickstart.DatabaseExample )을 사용하는 것입니다(이 ID를 사용하지 말고 대신 고유한 ID를 선택하십시오).
  5. 개발팀을 선택하세요.
  6. Xcode가 "프로비저닝 프로필: Xcode 관리 프로필"과 이 레이블 옆에 작은 정보 아이콘을 표시하면 모든 것이 제대로 진행되었음을 알 수 있습니다. 이 아이콘을 클릭하면 프로비저닝 프로필에 대한 자세한 내용이 표시됩니다.

iOS 앱 연결

앱 연결에 대한 자세한 설명은 iOS 프로젝트에 Firebase 추가 에 대한 문서를 확인하세요. 시작하려면 Firebase 콘솔에서 다음 주요 단계를 따르세요.

  1. 새 프로젝트의 프로젝트 개요 화면에서 + 앱 추가 버튼을 클릭한 다음 iOS+ 아이콘을 클릭하여 Firebase 프로젝트에 새 iOS 앱을 추가합니다.
  2. 앱의 번들 ID를 입력합니다( com.acme.samples.firebase.quickstart.DatabaseExample 과 같이 이전 섹션에서 정의한 ID 사용 - 고유 식별자 여야 함을 명심하세요).
  3. 앱 등록 을 클릭합니다.
  4. Firebase는 앱에 필요한 모든 Firebase 메타데이터가 포함된 GoogleService-Info.plist 파일을 생성합니다.
  5. GoogleService-Info.plist 다운로드를 클릭하여 파일을 다운로드하세요.
  6. Xcode에서 프로젝트에 이미 GoogleService-Info.plist 라는 파일이 포함되어 있는 것을 볼 수 있습니다. 먼저 이 파일을 삭제하세요. 다음 단계에서 이 파일을 자신의 Firebase 프로젝트용 파일로 대체합니다.
  7. 이전 단계에서 다운로드한 GoogleService-Info.plist 파일을 Xcode 프로젝트의 루트 폴더에 복사하고 DatabaseExample (iOS) 대상에 추가하여 이름이 GoogleService-Info.plist 인지 확인하세요.
  8. 등록 흐름의 나머지 단계를 클릭하세요. 샘플 프로젝트가 이미 올바르게 설정되었으므로 코드를 변경할 필요가 없습니다.

Firebase 인증 구성

휴! 지금까지 꽤 많은 설정이 진행되었지만 꽉 잡으세요! Firebase를 처음 사용하는 경우 곧 익숙해질 워크플로의 필수 부분을 살펴보셨을 것입니다.

이제 이 앱에 대해 Firebase 인증을 구성하겠습니다.

인증 이메일/비밀번호 로그인 공급자 활성화

  1. 계속해서 Firebase 콘솔 에서 콘솔의 인증 섹션을 엽니다.
  2. 시작하기를 클릭하여 프로젝트에 Firebase 인증을 설정하세요.
  3. 로그인 방법 탭을 선택합니다.
  4. 기본 공급자 섹션에서 이메일/비밀번호를 선택합니다.
  5. 이메일/비밀번호를 활성화하고 저장을 클릭합니다.

테스트 사용자 추가

  1. 인증 섹션의 사용자 탭을 엽니다.
  2. 사용자 추가 를 클릭합니다.
  3. 테스트 사용자의 이메일과 비밀번호를 지정한 다음 사용자 추가 를 클릭합니다.

앱을 사용해 보세요

Xcode로 돌아가서 iOS 시뮬레이터에서 애플리케이션을 실행하십시오. 방금 생성한 테스트 사용자의 이메일과 비밀번호로 로그인합니다. 로그인한 후 게시물을 작성하고, 기존 게시물에 댓글을 게시하고, 게시물에 별표를 표시하거나 별표를 취소하세요.

6. App Attest 증명 공급자 구성

이 단계에서는 Firebase 콘솔에서 App Attest 제공자를 사용하도록 앱 체크를 구성합니다.

  1. Firebase 콘솔에서 콘솔의 앱 체크 섹션으로 이동합니다.
  2. 시작하기 를 클릭합니다.
  3. 탭에서 앱을 클릭하여 세부정보를 펼칩니다.
  4. App Attest를 클릭하여 App Attest를 구성한 다음 Apple 개발자 계정의 팀 ID를 입력하세요(Apple 개발자 포털의 멤버십 섹션에서 찾을 수 있음). 1645f7a369b678c2.png
  5. 저장 을 클릭합니다.

이를 통해 새 앱에 연결되고 앱 체크가 활성화된 작동 중인 Firebase 프로젝트가 생겼습니다.

이제 특정 증명 서비스를 구성할 준비가 되었습니다! 이 워크플로에 대한 자세한 내용은 iOS에서 App Attest로 앱 체크 활성화를 참조하세요.

7. 애플리케이션에 대한 App Attest 구성

이제 Firebase 앱 체크 SDK를 직접 사용해 보고 일부 클라이언트 코드를 구현할 차례입니다.

먼저 SDK가 Apple의 App Attest API를 사용하여 앱에서 보낸 요청이 앱의 적법한 인스턴스에서 오는지 확인할 수 있도록 Xcode 프로젝트를 구성해야 합니다.

  1. Xcode 프로젝트에서 앱 대상에 대한 App Attest 기능을 추가합니다.
  2. 앱 대상 설정에서 서명 및 기능 탭을 엽니다.
  3. " + " 버튼을 클릭하세요
  4. 대화 상자에서 App Attest 기능을 찾아 선택합니다. ae84cd988a5fab31.png
  5. 이전 단계를 수행한 후 Xcode 프로젝트의 루트 폴더에 DatabaseExample (iOS).entitlements 파일이 나타납니다.
  6. DatabaseExample (iOS).entitlements 파일에서 App Attest Environment 키 값을 production.

이러한 단계를 완료하고 실제 iOS 기기(iPhone/iPad)에서 앱을 실행하면 앱에서 계속 실시간 데이터베이스에 액세스할 수 있습니다. 이후 단계에서는 불법 앱 및 기기에서 전송되는 요청을 차단하는 앱 체크를 시행 하게 됩니다.

이 워크플로에 대해 자세히 알아보려면 iOS에서 App Attest로 앱 체크 활성화를 참조하세요.

8. iOS 시뮬레이터용 디버그 증명 공급자 구성

Firebase 앱 체크 디버그 제공자를 사용하면 개발 프로세스 중에 iOS 시뮬레이터를 포함하여 신뢰할 수 없는 환경에서 Firebase 앱 체크 시행을 통해 애플리케이션을 테스트할 수 있습니다. 다음으로 디버그 공급자를 함께 구성해야 합니다.

앱에 Firebase 디버그 공급자 설치

옵션 1: 공장에서 디버그 공급자의 인스턴스를 조건부로 생성

이 작업은 대부분 앱 체크 제공자 팩토리를 만들 때 수행했습니다. 이 단계에서는 디버그 제공자가 생성한 로컬 디버그 비밀번호의 로깅을 추가하므로 디버깅 목적으로 Firebase 콘솔에 이 앱 인스턴스를 등록할 수 있습니다.

다음 코드로 MyAppCheckProviderFactory.swift 업데이트하세요:

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
    // App Attest is not available on simulators.
    // Use a debug provider.
    let provider = AppCheckDebugProvider(app: app)

    // Print only locally generated token to avoid a valid token leak on CI.
    print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

    return provider
#else
    // Use App Attest provider on real devices.
    return AppAttestProvider(app: app)
#endif
  }
}

이 접근 방식을 사용하면 환경에 따라 앱 체크를 더 유연하게 구성할 수 있습니다. 예를 들어 App Attest를 사용할 수 없는 OS 버전에서는 DeviceCheck 와 같은 다른 증명 공급자나 사용자 지정 증명 공급자를 사용할 수 있습니다. 아래 예를 참조하세요.

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use App Attest provider on real devices.
        return AppAttestProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

옵션 2: AppCheckDebugProviderFactory 설치

더 간단한 경우에는 Firebase 애플리케이션 인스턴스를 구성하기 전에 AppCheckDebugProviderFactory 일시적으로 또는 조건부로 설치할 수 있습니다.

init() {
#if targetEnvironment(simulator)
  let providerFactory = AppCheckDebugProviderFactory()
#else
  let providerFactory = MyAppCheckProviderFactory()
#endif

  AppCheck.setAppCheckProviderFactory(providerFactory)

  FirebaseApp.configure()
}

이렇게 하면 자체 앱 체크 공급자 팩토리를 생성할 때 몇 줄의 코드가 절약됩니다.

Firebase 콘솔에 디버그 비밀번호를 등록하세요.

iOS 시뮬레이터에서 디버그 비밀을 얻으세요

  1. AppCheckDebugProviderFactory (위의 옵션 2)를 설치하기로 선택한 경우 앱 시작 인수에 -FIRDebugEnabled 추가하여 앱에 대한 디버그 로깅을 활성화해야 합니다. f1c6b477a373e144.png
  2. 시뮬레이터에서 앱 실행
  3. Xcode 콘솔에서 디버그 비밀을 찾으세요. 콘솔 필터를 사용하면 더 빨리 찾을 수 있습니다. d4c65af93e369c55.png

참고: 디버그 비밀은 처음 앱을 시작할 때 시뮬레이터에 대해 생성되고 사용자 기본값에 저장됩니다. 앱을 제거하거나 시뮬레이터를 재설정하거나 다른 시뮬레이터를 사용하면 새로운 디버그 비밀이 생성됩니다. 새로운 디버그 비밀을 등록했는지 확인하세요.

디버그 비밀 등록

  1. Firevbase 콘솔로 돌아가 앱 체크 섹션으로 이동합니다.
  2. 탭에서 앱을 클릭하여 세부정보를 펼칩니다.
  3. 오버플로 메뉴에서 디버그 토큰 관리를 선택합니다. d77c8ff768a00b4b.png
  4. Xcode 콘솔에서 복사한 비밀을 추가한 다음 저장을 클릭합니다. f845c97b86f694d0.png

이러한 단계를 수행하면 앱 체크가 적용된 경우에도 시뮬레이터에서 앱을 사용할 수 있습니다.

참고: 디버그 공급자는 디버그 비밀 유출을 방지하도록 특별히 설계되었습니다. 현재 접근 방식을 사용하면 소스 코드에 디버그 비밀을 저장할 필요가 없습니다.

이 흐름에 대한 자세한 내용은 설명서에서 확인할 수 있습니다. iOS에서 디버그 공급자와 함께 앱 체크 사용을 참조하세요.

9. Firebase 실시간 데이터베이스에 대한 앱 체크 적용 활성화

현재 우리 앱은 실제 장치에 대해 AppAttestProvider 반환하는 AppCheckProviderFactory 를 선언합니다. 실제 기기에서 실행될 때 앱은 증명을 수행하고 결과를 Firebase 백엔드로 보냅니다. 그러나 Firebase 백엔드는 여전히 모든 기기, iOS 시뮬레이터, 스크립트 등의 요청을 허용합니다. 이 모드는 앱 체크 없이 이전 버전의 앱을 사용하는 사용자가 아직 있고 액세스를 강제하고 싶지 않을 때 유용합니다. 아직 확인 중입니다.

이제 합법적인 기기에서만 Firebase 앱에 액세스할 수 있도록 앱 체크 시행을 활성화해야 합니다. 앱 체크 통합이 없는 이전 앱 버전은 Firebase 프로젝트에 적용을 활성화하면 작동이 중지됩니다.

  1. Firebase 콘솔의 앱 체크 섹션에서 실시간 데이터베이스를 클릭하여 세부정보를 확장합니다.
  2. 시행 을 클릭합니다.

64e6a81fa979b635.png

  1. 확인 대화 상자의 정보를 읽은 다음 적용 을 클릭합니다.

이 단계를 완료하면 합법적인 앱만 데이터베이스에 액세스할 수 있습니다. 다른 모든 앱은 차단됩니다.

불법적인 앱으로 실시간 데이터베이스에 접속해 보세요

앱 체크 시행이 실제로 실행되는 모습을 보려면 다음 단계를 따르세요.

  1. DatabaseExampleApp 에 있는 앱 진입점의 init 메서드에서 앱 체크 등록 코드를 주석 처리하여 앱 체크 등록을 해제합니다.
  2. 장치 > 모든 콘텐츠 및 설정 지우기를 선택하여 시뮬레이터를 재설정하십시오. 이렇게 하면 시뮬레이터가 지워지고 장치 토큰이 무효화됩니다.
  3. 시뮬레이터에서 앱을 다시 실행하세요.
  4. 이제 다음 오류 메시지가 표시됩니다:
    [FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server.  Will not attempt reconnect. Reason: Invalid appcheck token.
    

앱 체크를 다시 활성화하려면 다음을 수행하세요.

  1. DatabaseExampleApp 에서 앱 체크 등록 코드의 주석 처리를 제거하세요.
  2. 앱을 다시 시작하세요.
  3. Xcode 콘솔에서 새로운 앱 체크 토큰을 기록해 두세요.
  4. Firebase 콘솔에서 앱의 앱 체크 설정에 디버그 토큰을 등록하세요.
  5. 앱을 다시 실행하세요.
  6. 더 이상 오류 메시지가 표시되지 않으며 앱에 새 게시물과 댓글을 추가할 수 있어야 합니다.

10. 축하합니다!

9785d32f18b995d2.gif

이제 다음 방법을 알게 되었습니다.

  • 기존 프로젝트에 앱 체크 추가
  • 앱의 프로덕션 버전에 대한 App Attest 증명 공급자 구성
  • 시뮬레이터에서 앱을 테스트하도록 디버그 증명 제공자를 구성합니다.
  • Firebase 프로젝트에 앱 체크를 시행해야 하는 시기를 알아보려면 앱 버전 출시를 관찰하세요.
  • 앱 체크 시행 활성화

다음 단계

Firebase 원격 구성을 사용하여 Firebase 앱 체크를 점진적으로 출시 Codelab에서 원격 구성을 사용하여 사용자에게 앱 체크를 점진적으로 출시 하는 방법을 알아보세요.

다음은 도움이 될 수 있는 기타 리소스입니다.

이 Codelab에 설명된 설정은 대부분의 경우에 작동하지만 필요한 경우 앱 체크를 사용하면 더 많은 유연성을 얻을 수 있습니다. 자세한 내용은 다음 링크를 확인하세요.