Apple 플랫폼용 Firebase 앱 확인

1. 소개

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

Firebase 문서에서 Firebase App Check 에 대해 자세히 알아볼 수 있습니다.

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

무엇을 만들 것인가

이 코드랩에서는 프로젝트의 실시간 데이터베이스가 불법적인 앱 및 장치에 의해 액세스되는 것을 방지할 수 있도록 기존 샘플 애플리케이션에 App Check를 추가하고 시행합니다.

배울 내용

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

필요한 것

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

2. 스타터 프로젝트 받기

iOS용 Firebase 빠른 시작 저장소 에는 다양한 Firebase 제품을 시연하는 샘플 앱이 포함되어 있습니다. 이 코드랩의 기반으로 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 패키지 관리자가 프로젝트의 종속성을 해결할 때까지 기다립니다.
  2. DatabaseExample (iOS) 앱 대상의 일반 탭을 엽니다. 그런 다음 프레임워크, 라이브러리 및 포함된 콘텐츠 섹션에서 + 버튼을 클릭합니다.
  3. FirebaseAppCheck 를 추가하려면 선택하세요.

4. App Check 제공자 팩토리 생성 및 설치

  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 클래스의 인스턴스를 App Check 공급자 팩토리로 설정해야 합니다.
    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 프로젝트에서 App Check를 사용하려면 Firebase 콘솔에서 다음 단계를 따라야 합니다.

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

프로젝트 만들기

먼저 Firebase 프로젝트를 생성해야 합니다.

  1. Firebase 콘솔 에서 프로젝트 추가 를 선택합니다.
  2. 프로젝트 이름을 App Check Codelab 지정
  3. 계속을 클릭합니다.
  4. 이 프로젝트에 대해 Google 애널리틱스를 비활성화한 다음 프로젝트 만들기를 클릭합니다.

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

이제 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. 앱 증명 증명 공급자 구성

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

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

이를 통해 새 앱에 연결된 작동 중인 Firebase 프로젝트가 있고 App Check가 활성화됩니다.

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

7. 애플리케이션에 대한 앱 증명 구성

이제 Firebase App Check SDK를 손에 넣고 일부 클라이언트 코드를 구현할 차례입니다.

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

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

이 단계를 완료하고 실제 iOS 기기(iPhone/iPad)에서 앱을 실행하면 앱은 여전히 ​​실시간 데이터베이스에 액세스할 수 있습니다. 이후 단계에서 앱 검사를 시행 하여 불법 앱 및 장치에서 전송되는 요청을 차단합니다.

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

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

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

앱에 Firebase 디버그 공급자 설치

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

App Check 제공자 팩토리를 생성할 때 대부분의 작업을 수행했습니다. 이 단계에서는 디버그 제공자가 생성한 로컬 디버그 비밀의 로깅을 추가하여 디버깅 목적으로 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 Check를 구성하는 데 더 많은 유연성을 제공합니다. 예를 들어, 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()
}

이렇게 하면 고유한 App Check 공급자 팩토리를 생성할 때 몇 줄의 코드를 절약할 수 있습니다.

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 실시간 데이터베이스에 대한 앱 검사 시행 활성화

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

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

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

64e6a81fa979b635.png

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

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

불법 앱으로 실시간 데이터베이스 접속 시도

App Check 시행을 보려면 다음 단계를 따르세요.

  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 에서 App Check 등록 코드의 주석 처리를 제거합니다.
  2. 앱을 다시 시작합니다.
  3. Xcode의 콘솔에서 새로운 App Check 토큰을 기록해 둡니다.
  4. Firebase 콘솔에서 앱의 App Check 설정에 디버그 토큰을 등록합니다.
  5. 앱을 다시 실행합니다.
  6. 더 이상 오류 메시지가 표시되지 않으며 앱에서 새 게시물과 댓글을 추가할 수 있어야 합니다.

10. 축하합니다!

9785d32f18b995d2.gif

이제 다음을 수행하는 방법을 알게 되었습니다.

  • 기존 프로젝트에 App Check 추가
  • 앱의 프로덕션 버전에 대한 앱 증명 증명 공급자 구성
  • 시뮬레이터에서 앱을 테스트하도록 디버그 증명 공급자 구성
  • 앱 버전 출시를 관찰하여 Firebase 프로젝트에 앱 확인을 시행해야 하는 시기를 알아보세요.
  • 앱 검사 시행 활성화

다음 단계

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

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

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