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. 앱에 앱 체크 추가
- Swift Package Manager가 프로젝트의 종속성을 해결할 때까지 기다립니다.
-
DatabaseExample (iOS)
앱 타겟의 General 탭을 엽니다. 그런 다음 프레임워크, 라이브러리 및 포함된 콘텐츠 섹션에서 + 버튼을 클릭합니다. -
FirebaseAppCheck
추가하려면 선택하세요.
4. 앱 체크 제공자 팩토리 생성 및 설치
-
Shared
파일 그룹에서AppCheck
라는 새 그룹을 추가합니다. - 이 그룹 내에서 별도의 파일(예
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 } }
- 다음으로
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 프로젝트를 만들어야 합니다.
- Firebase 콘솔 에서 프로젝트 추가를 선택합니다.
- 프로젝트 이름을
App Check Codelab
- 계속을 클릭하세요.
- 이 프로젝트에 대해 Google Analytics를 비활성화한 다음 프로젝트 생성을 클릭합니다.
실시간 데이터베이스 인스턴스 생성
이제 Firebase 콘솔의 실시간 데이터베이스 섹션으로 이동합니다.
- 데이터베이스 생성 워크플로를 시작하려면 데이터베이스 생성 버튼을 클릭하세요.
- 데이터베이스의 기본 위치(
us-central1
)를 변경하지 않고 그대로 두고 다음 을 클릭합니다. - 잠금 모드가 선택되었는지 확인하고 활성화 버튼을 클릭하여 데이터베이스에 대한 보안 규칙을 활성화합니다.
- 실시간 데이터베이스 브라우저의 규칙 탭으로 이동하여 기본 규칙을 다음으로 바꿉니다.
{ "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" } } } } } }
- 업데이트된 보안 규칙을 활성화하려면 게시 버튼을 클릭하세요.
Firebase에 연결할 iOS 앱 준비
실제 장치에서 샘플 앱을 실행하려면 Xcode가 필요한 프로비저닝 프로필을 관리할 수 있도록 개발 팀에 프로젝트를 추가해야 합니다. 개발자 계정에 샘플 앱을 추가하려면 다음 단계를 따르세요.
- Xcode의 프로젝트 탐색기에서
DatabaseExample
프로젝트를 선택합니다. -
DatabaseExample (iOS)
대상을 선택하고 서명 및 기능 탭을 엽니다. - "DatabaseExample(iOS)에 서명하려면 개발팀이 필요합니다."라는 오류 메시지가 표시됩니다.
- 번들 식별자를 고유 식별자로 업데이트합니다. 이를 달성하는 가장 쉬운 방법은 웹사이트의 역방향 도메인 이름(예:
com.acme.samples.firebase.quickstart.DatabaseExample
)을 사용하는 것입니다(이 ID를 사용하지 말고 대신 고유한 ID를 선택하십시오). - 개발팀을 선택하세요.
- Xcode가 "프로비저닝 프로필: Xcode 관리 프로필"과 이 레이블 옆에 작은 정보 아이콘을 표시하면 모든 것이 제대로 진행되었음을 알 수 있습니다. 이 아이콘을 클릭하면 프로비저닝 프로필에 대한 자세한 내용이 표시됩니다.
iOS 앱 연결
앱 연결에 대한 자세한 설명은 iOS 프로젝트에 Firebase 추가 에 대한 문서를 확인하세요. 시작하려면 Firebase 콘솔에서 다음 주요 단계를 따르세요.
- 새 프로젝트의 프로젝트 개요 화면에서 + 앱 추가 버튼을 클릭한 다음 iOS+ 아이콘을 클릭하여 Firebase 프로젝트에 새 iOS 앱을 추가합니다.
- 앱의 번들 ID를 입력합니다(
com.acme.samples.firebase.quickstart.DatabaseExample
과 같이 이전 섹션에서 정의한 ID 사용 - 고유 식별자 여야 함을 명심하세요). - 앱 등록 을 클릭합니다.
- Firebase는 앱에 필요한 모든 Firebase 메타데이터가 포함된
GoogleService-Info.plist
파일을 생성합니다. - GoogleService-Info.plist 다운로드를 클릭하여 파일을 다운로드하세요.
- Xcode에서 프로젝트에 이미
GoogleService-Info.plist
라는 파일이 포함되어 있는 것을 볼 수 있습니다. 먼저 이 파일을 삭제하세요. 다음 단계에서 이 파일을 자신의 Firebase 프로젝트용 파일로 대체합니다. - 이전 단계에서 다운로드한
GoogleService-Info.plist
파일을 Xcode 프로젝트의 루트 폴더에 복사하고DatabaseExample (iOS)
대상에 추가하여 이름이GoogleService-Info.plist
인지 확인하세요. - 등록 흐름의 나머지 단계를 클릭하세요. 샘플 프로젝트가 이미 올바르게 설정되었으므로 코드를 변경할 필요가 없습니다.
Firebase 인증 구성
휴! 지금까지 꽤 많은 설정이 진행되었지만 꽉 잡으세요! Firebase를 처음 사용하는 경우 곧 익숙해질 워크플로의 필수 부분을 살펴보셨을 것입니다.
이제 이 앱에 대해 Firebase 인증을 구성하겠습니다.
인증 이메일/비밀번호 로그인 공급자 활성화
- 계속해서 Firebase 콘솔 에서 콘솔의 인증 섹션을 엽니다.
- 시작하기를 클릭하여 프로젝트에 Firebase 인증을 설정하세요.
- 로그인 방법 탭을 선택합니다.
- 기본 공급자 섹션에서 이메일/비밀번호를 선택합니다.
- 이메일/비밀번호를 활성화하고 저장을 클릭합니다.
테스트 사용자 추가
- 인증 섹션의 사용자 탭을 엽니다.
- 사용자 추가 를 클릭합니다.
- 테스트 사용자의 이메일과 비밀번호를 지정한 다음 사용자 추가 를 클릭합니다.
앱을 사용해 보세요
Xcode로 돌아가서 iOS 시뮬레이터에서 애플리케이션을 실행하십시오. 방금 생성한 테스트 사용자의 이메일과 비밀번호로 로그인합니다. 로그인한 후 게시물을 작성하고, 기존 게시물에 댓글을 게시하고, 게시물에 별표를 표시하거나 별표를 취소하세요.
6. App Attest 증명 공급자 구성
이 단계에서는 Firebase 콘솔에서 App Attest 제공자를 사용하도록 앱 체크를 구성합니다.
- Firebase 콘솔에서 콘솔의 앱 체크 섹션으로 이동합니다.
- 시작하기 를 클릭합니다.
- 앱 탭에서 앱을 클릭하여 세부정보를 펼칩니다.
- App Attest를 클릭하여 App Attest를 구성한 다음 Apple 개발자 계정의 팀 ID를 입력하세요(Apple 개발자 포털의 멤버십 섹션에서 찾을 수 있음).
- 저장 을 클릭합니다.
이를 통해 새 앱에 연결되고 앱 체크가 활성화된 작동 중인 Firebase 프로젝트가 생겼습니다.
이제 특정 증명 서비스를 구성할 준비가 되었습니다! 이 워크플로에 대한 자세한 내용은 iOS에서 App Attest로 앱 체크 활성화를 참조하세요.
7. 애플리케이션에 대한 App Attest 구성
이제 Firebase 앱 체크 SDK를 직접 사용해 보고 일부 클라이언트 코드를 구현할 차례입니다.
먼저 SDK가 Apple의 App Attest API를 사용하여 앱에서 보낸 요청이 앱의 적법한 인스턴스에서 오는지 확인할 수 있도록 Xcode 프로젝트를 구성해야 합니다.
- Xcode 프로젝트에서 앱 대상에 대한 App Attest 기능을 추가합니다.
- 앱 대상 설정에서 서명 및 기능 탭을 엽니다.
- " + " 버튼을 클릭하세요
- 대화 상자에서 App Attest 기능을 찾아 선택합니다.
- 이전 단계를 수행한 후 Xcode 프로젝트의 루트 폴더에
DatabaseExample (iOS).entitlements
파일이 나타납니다. -
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 시뮬레이터에서 디버그 비밀을 얻으세요
-
AppCheckDebugProviderFactory
(위의 옵션 2)를 설치하기로 선택한 경우 앱 시작 인수에-FIRDebugEnabled
추가하여 앱에 대한 디버그 로깅을 활성화해야 합니다. - 시뮬레이터에서 앱 실행
- Xcode 콘솔에서 디버그 비밀을 찾으세요. 콘솔 필터를 사용하면 더 빨리 찾을 수 있습니다.
참고: 디버그 비밀은 처음 앱을 시작할 때 시뮬레이터에 대해 생성되고 사용자 기본값에 저장됩니다. 앱을 제거하거나 시뮬레이터를 재설정하거나 다른 시뮬레이터를 사용하면 새로운 디버그 비밀이 생성됩니다. 새로운 디버그 비밀을 등록했는지 확인하세요.
디버그 비밀 등록
- Firevbase 콘솔로 돌아가 앱 체크 섹션으로 이동합니다.
- 앱 탭에서 앱을 클릭하여 세부정보를 펼칩니다.
- 오버플로 메뉴에서 디버그 토큰 관리를 선택합니다.
- Xcode 콘솔에서 복사한 비밀을 추가한 다음 저장을 클릭합니다.
이러한 단계를 수행하면 앱 체크가 적용된 경우에도 시뮬레이터에서 앱을 사용할 수 있습니다.
참고: 디버그 공급자는 디버그 비밀 유출을 방지하도록 특별히 설계되었습니다. 현재 접근 방식을 사용하면 소스 코드에 디버그 비밀을 저장할 필요가 없습니다.
이 흐름에 대한 자세한 내용은 설명서에서 확인할 수 있습니다. iOS에서 디버그 공급자와 함께 앱 체크 사용을 참조하세요.
9. Firebase 실시간 데이터베이스에 대한 앱 체크 적용 활성화
현재 우리 앱은 실제 장치에 대해 AppAttestProvider
반환하는 AppCheckProviderFactory
를 선언합니다. 실제 기기에서 실행될 때 앱은 증명을 수행하고 결과를 Firebase 백엔드로 보냅니다. 그러나 Firebase 백엔드는 여전히 모든 기기, iOS 시뮬레이터, 스크립트 등의 요청을 허용합니다. 이 모드는 앱 체크 없이 이전 버전의 앱을 사용하는 사용자가 아직 있고 액세스를 강제하고 싶지 않을 때 유용합니다. 아직 확인 중입니다.
이제 합법적인 기기에서만 Firebase 앱에 액세스할 수 있도록 앱 체크 시행을 활성화해야 합니다. 앱 체크 통합이 없는 이전 앱 버전은 Firebase 프로젝트에 적용을 활성화하면 작동이 중지됩니다.
- Firebase 콘솔의 앱 체크 섹션에서 실시간 데이터베이스를 클릭하여 세부정보를 확장합니다.
- 시행 을 클릭합니다.
- 확인 대화 상자의 정보를 읽은 다음 적용 을 클릭합니다.
이 단계를 완료하면 합법적인 앱만 데이터베이스에 액세스할 수 있습니다. 다른 모든 앱은 차단됩니다.
불법적인 앱으로 실시간 데이터베이스에 접속해 보세요
앱 체크 시행이 실제로 실행되는 모습을 보려면 다음 단계를 따르세요.
-
DatabaseExampleApp
에 있는 앱 진입점의init
메서드에서 앱 체크 등록 코드를 주석 처리하여 앱 체크 등록을 해제합니다. - 장치 > 모든 콘텐츠 및 설정 지우기를 선택하여 시뮬레이터를 재설정하십시오. 이렇게 하면 시뮬레이터가 지워지고 장치 토큰이 무효화됩니다.
- 시뮬레이터에서 앱을 다시 실행하세요.
- 이제 다음 오류 메시지가 표시됩니다:
[FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server. Will not attempt reconnect. Reason: Invalid appcheck token.
앱 체크를 다시 활성화하려면 다음을 수행하세요.
-
DatabaseExampleApp
에서 앱 체크 등록 코드의 주석 처리를 제거하세요. - 앱을 다시 시작하세요.
- Xcode 콘솔에서 새로운 앱 체크 토큰을 기록해 두세요.
- Firebase 콘솔에서 앱의 앱 체크 설정에 디버그 토큰을 등록하세요.
- 앱을 다시 실행하세요.
- 더 이상 오류 메시지가 표시되지 않으며 앱에 새 게시물과 댓글을 추가할 수 있어야 합니다.
10. 축하합니다!
이제 다음 방법을 알게 되었습니다.
- 기존 프로젝트에 앱 체크 추가
- 앱의 프로덕션 버전에 대한 App Attest 증명 공급자 구성
- 시뮬레이터에서 앱을 테스트하도록 디버그 증명 제공자를 구성합니다.
- Firebase 프로젝트에 앱 체크를 시행해야 하는 시기를 알아보려면 앱 버전 출시를 관찰하세요.
- 앱 체크 시행 활성화
다음 단계
Firebase 원격 구성을 사용하여 Firebase 앱 체크를 점진적으로 출시 Codelab에서 원격 구성을 사용하여 사용자에게 앱 체크를 점진적으로 출시 하는 방법을 알아보세요.
다음은 도움이 될 수 있는 기타 리소스입니다.
이 Codelab에 설명된 설정은 대부분의 경우에 작동하지만 필요한 경우 앱 체크를 사용하면 더 많은 유연성을 얻을 수 있습니다. 자세한 내용은 다음 링크를 확인하세요.