Apple 플랫폼용 Firebase 앱 체크

1. 소개

Firebase 앱 체크는 합법적인 앱과 기기에서 요청이 들어오도록 하여 결제 사기 및 피싱과 같은 악용으로부터 백엔드 리소스를 보호합니다. Firebase 서비스 및 자체 백엔드 서비스와 모두 호환되므로 리소스를 안전하게 보호할 수 있습니다.

Firebase 문서에서 Firebase 앱 체크에 대해 자세히 알아보세요.

앱 체크는 플랫폼별 서비스를 사용하여 앱 또는 기기의 무결성을 확인합니다. 이러한 서비스를 증명 제공업체라고 합니다. 이러한 제공업체 중 하나로 Apple의 App Attest 서비스가 있으며, 앱 체크는 이 서비스를 사용하여 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 Console에서 다음 단계를 따라야 합니다.

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

프로젝트 만들기

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

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

실시간 데이터베이스 인스턴스 만들기

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

  1. 데이터베이스 만들기 버튼을 클릭하여 데이터베이스 만들기 워크플로를 시작합니다.
  2. 데이터베이스의 기본 위치 (us-central1)를 변경하지 않고 Next를 클릭합니다.
  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) 대상을 선택하고 Signing & Capabilities(서명 및 기능) 탭을 엽니다.
  3. 'DatabaseExample (iOS)에 서명하려면 개발팀이 필요합니다'라는 오류 메시지가 표시됩니다.
  4. 번들 식별자를 고유 식별자로 업데이트합니다. 가장 쉬운 방법은 웹사이트의 리버스 도메인 이름 (예: com.acme.samples.firebase.quickstart.DatabaseExample)을 사용하는 것입니다. 이 ID를 사용하지 마세요. 대신 자체 고유 ID를 선택하세요.
  5. 개발팀을 선택합니다.
  6. Xcode에 '프로비저닝 프로필: Xcode 관리 프로필'과 이 라벨 옆에 작은 정보 아이콘이 표시되면 모든 것이 잘 진행되었음을 알 수 있습니다. 이 아이콘을 클릭하면 프로비저닝 프로필에 대한 세부정보가 표시됩니다.

iOS 앱 연결

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

  1. 새 프로젝트의 프로젝트 개요 화면에서 + 앱 추가 버튼을 클릭한 다음 iOS+ 아이콘을 클릭하여 새 iOS 앱을 Firebase 프로젝트에 추가합니다.
  2. 앱의 번들 ID를 입력합니다(이전 섹션에서 정의한 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 Console에서 Console의 인증 섹션을 엽니다.
  2. 시작하기를 클릭하여 프로젝트에 Firebase 인증을 설정합니다.
  3. 로그인 방법 탭을 선택합니다.
  4. 기본 제공업체 섹션에서 이메일/비밀번호를 선택합니다.
  5. 이메일/비밀번호를 사용 설정하고 저장을 클릭합니다.

테스트 사용자 추가

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

앱 사용해 보기

Xcode로 돌아가서 iOS 시뮬레이터에서 애플리케이션을 실행합니다. 방금 만든 테스트 사용자의 이메일과 비밀번호로 로그인합니다. 로그인하면 게시물을 작성하고, 기존 게시물에 댓글을 달고, 게시물에 별표를 추가하거나 삭제할 수 있습니다.

6. App Attest 증명 제공업체 구성

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

  1. Firebase Console에서 Console의 앱 체크 섹션으로 이동합니다.
  2. 시작하기를 클릭합니다.
  3. 탭에서 앱을 클릭하여 세부정보를 펼칩니다.
  4. App Attest를 클릭하여 App Attest를 구성한 다음 Apple 개발자 계정의 팀 ID를 입력합니다(Apple 개발자 포털의 Membership(멤버십) 섹션에서 확인 가능). 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. 이전 단계를 실행하면 DatabaseExample (iOS).entitlements 파일이 Xcode 프로젝트의 루트 폴더에 표시됩니다.
  6. DatabaseExample (iOS).entitlements 파일에서 App Attest Environment 키 값을 production.로 변경합니다.

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

이 워크플로에 대한 자세한 내용은 iOS에서 App Attest로 앱 체크 사용 설정을 참고하세요.

8. iOS 시뮬레이터의 디버그 증명 제공업체 구성

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

앱에 Firebase 디버그 제공자 설치

옵션 1: 팩토리에서 조건부로 디버그 제공자 인스턴스 만들기

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

다음 코드를 사용하여 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
  }
}

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

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 Console에 디버그 보안 비밀 등록

iOS 시뮬레이터에서 디버그 비밀번호 가져오기

  1. AppCheckDebugProviderFactory (위의 옵션 2) 설치를 선택한 경우 앱 실행 인수 f1c6b477a373e144.png-FIRDebugEnabled를 추가하여 앱의 디버그 로깅을 사용 설정해야 합니다.
  2. 시뮬레이터에서 앱 실행
  3. Xcode 콘솔에서 디버그 비밀번호를 찾습니다. 콘솔 필터(d4c65af93e369c55.png)를 사용하면 더 빠르게 찾을 수 있습니다.

참고: 디버그 비밀번호는 처음 앱을 실행할 때 시뮬레이터에 생성되고 사용자 기본값에 저장됩니다. 앱을 삭제하거나 시뮬레이터를 재설정하거나 다른 시뮬레이터를 사용하면 새로운 디버그 비밀번호가 생성됩니다. 새 디버그 보안 비밀을 등록해야 합니다.

디버그 비밀번호 등록

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

이 단계를 완료하면 앱 체크를 시행해도 시뮬레이터에서 앱을 사용할 수 있습니다.

참고: 디버그 제공자는 디버그 보안 비밀 유출을 방지하는 데 도움이 되도록 특별히 설계되었습니다. 현재의 접근 방식에서는 디버그 비밀번호를 소스 코드에 저장할 필요가 없습니다.

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

9. Firebase 실시간 데이터베이스에 앱 체크 적용 사용 설정

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

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

  1. Firebase Console의 앱 체크 섹션에서 실시간 데이터베이스를 클릭하여 세부정보를 펼칩니다.
  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 Console에서 앱의 앱 체크 설정에 디버그 토큰을 등록합니다.
  5. 앱을 다시 실행합니다.
  6. 이제 더 이상 오류 메시지가 표시되지 않으며 앱에서 새 게시물과 댓글을 추가할 수 있습니다.

10. 수고하셨습니다.

9785d32f18b995d2.gif

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

  • 기존 프로젝트에 앱 체크 추가
  • 앱의 프로덕션 버전에 App Attest 증명 제공자 구성
  • 시뮬레이터에서 앱을 테스트하도록 디버그 증명 제공자 구성
  • 앱 버전 출시를 관찰하여 Firebase 프로젝트에 앱 체크를 적용해야 하는 경우를 확인합니다.
  • 앱 체크 적용 사용 설정

다음 단계

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

도움이 될 만한 기타 리소스입니다.

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