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) 타겟을 선택하고 서명 및 기능 탭을 엽니다.
  3. 'Signing for DatabaseExample (iOS) needed a development team'이라는 오류 메시지가 표시됩니다.
  4. 번들 식별자를 고유 식별자로 업데이트합니다. 가장 쉬운 방법은 웹사이트의 리버스 도메인 이름 (예: com.acme.samples.firebase.quickstart.DatabaseExample)을 사용하는 것입니다. 이 ID를 사용하지 말고 고유한 고유 ID를 선택하세요.
  5. 개발팀을 선택합니다.
  6. Xcode에서 'Provisioning Profile: Xcode Managed Profile(프로비저닝 프로필: Xcode 관리 프로필)'과 이 라벨 옆에 작은 정보 아이콘이 표시되면 잘 된 것입니다. 이 아이콘을 클릭하면 프로비저닝 프로필에 대한 자세한 내용이 표시됩니다.

iOS 앱 연결

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

  1. 새 프로젝트의 프로젝트 개요 화면에서 + 앱 추가 버튼을 클릭한 다음 iOS+ 아이콘을 클릭하여 새 iOS 앱을 Firebase 프로젝트에 추가합니다.
  2. 앱의 번들 ID를 입력합니다(이전 섹션에서 정의한 ID(예: com.acme.samples.firebase.quickstart.DatabaseExample) 사용 - 고유 식별자여야 함).
  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에서 콘솔의 인증 섹션을 엽니다.
  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를 입력합니다. 팀 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. 이전 단계를 실행하면 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 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) 설치를 선택한 경우 앱 실행 인수에 -FIRDebugEnabled를 추가하여 앱의 디버그 로깅을 사용 설정해야 합니다. f1c6b477a373e144.png
  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에 설명된 설정은 대부분의 경우에 작동하지만 필요한 경우 앱 체크를 사용하면 더 유연하게 작업할 수 있습니다. 자세한 내용은 다음 링크를 확인하세요.