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. 앱에 앱 체크 추가
- Swift 패키지 관리자가 프로젝트의 종속성을 해결할 때까지 기다립니다.
-
DatabaseExample (iOS)
앱 대상의 일반 탭을 엽니다. 그런 다음 프레임워크, 라이브러리 및 포함된 콘텐츠 섹션에서 + 버튼을 클릭합니다. -
FirebaseAppCheck
를 추가하려면 선택하세요.
4. App Check 제공자 팩토리 생성 및 설치
-
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
클래스의 인스턴스를 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 프로젝트를 생성해야 합니다.
- Firebase 콘솔 에서 프로젝트 추가 를 선택합니다.
- 프로젝트 이름을
App Check Codelab
지정 - 계속을 클릭합니다.
- 이 프로젝트에 대해 Google 애널리틱스를 비활성화한 다음 프로젝트 만들기를 클릭합니다.
실시간 데이터베이스 인스턴스 생성
이제 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. 앱 증명 증명 공급자 구성
이 단계에서는 Firebase 콘솔에서 App Attest 공급자를 사용하도록 App Check를 구성합니다.
- Firebase 콘솔에서 콘솔의 앱 검사 섹션으로 이동합니다.
- 시작하기 를 클릭합니다.
- 앱 탭에서 앱을 클릭하여 세부 정보를 확장합니다.
- App Attest를 클릭하여 App Attest 를 구성한 다음 Apple 개발자 계정의 팀 ID를 입력합니다(Apple 개발자 포털의 멤버십 섹션에서 찾을 수 있음).
- 저장 을 클릭합니다.
이를 통해 새 앱에 연결된 작동 중인 Firebase 프로젝트가 있고 App Check가 활성화됩니다.
이제 특정 증명 서비스를 구성할 준비가 되었습니다! 이 워크플로에 대한 자세한 내용은 iOS에서 App Attest로 앱 확인 활성화 를 참조하십시오.
7. 애플리케이션에 대한 앱 증명 구성
이제 Firebase App Check SDK를 손에 넣고 일부 클라이언트 코드를 구현할 차례입니다.
먼저 SDK가 Apple의 App Attest API를 사용하여 앱에서 보낸 요청이 앱의 합법적인 인스턴스에서 오는지 확인할 수 있도록 Xcode 프로젝트를 구성해야 합니다.
- Xcode 프로젝트에서 앱 대상에 대한 App Attest 기능을 추가합니다.
- 앱 대상 설정에서 서명 및 기능 탭을 엽니다.
- " + " 버튼을 클릭하십시오
- 대화 상자에서 앱 증명 기능을 찾아 선택합니다.
- 이전 단계를 수행한 후 Xcode 프로젝트의 루트 폴더에
DatabaseExample (iOS).entitlements
파일이 나타납니다. -
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 시뮬레이터에서 디버그 비밀 얻기
-
AppCheckDebugProviderFactory
(위의 옵션 2)를 설치하도록 선택한 경우 앱 시작 인수에-FIRDebugEnabled
를 추가하여 앱에 대한 디버그 로깅을 활성화해야 합니다. - 시뮬레이터에서 앱 실행
- Xcode 콘솔에서 디버그 비밀을 찾으십시오. 콘솔 필터를 사용하여 더 빠르게 찾을 수 있습니다.
참고: 디버그 암호는 첫 번째 앱 실행 시 시뮬레이터에 대해 생성되고 사용자 기본값에 저장됩니다. 앱을 제거하거나 시뮬레이터를 재설정하거나 다른 시뮬레이터를 사용하면 새 디버그 암호가 생성됩니다. 새 디버그 암호를 등록해야 합니다.
디버그 암호 등록
- Firevbase 콘솔로 돌아가서 앱 검사 섹션으로 이동합니다.
- 앱 탭에서 앱을 클릭하여 세부 정보를 확장합니다.
- 오버플로 메뉴에서 디버그 토큰 관리 를 선택합니다.
- Xcode 콘솔에서 복사한 암호를 추가한 다음 저장 을 클릭합니다.
이 단계 후에는 앱 확인이 적용된 상태에서도 시뮬레이터에서 앱을 사용할 수 있습니다.
참고: 디버그 공급자는 디버그 비밀 누출을 방지하기 위해 특별히 설계되었습니다. 현재 접근 방식을 사용하면 소스 코드에 디버그 비밀을 저장할 필요가 없습니다.
이 흐름에 대한 자세한 내용은 설명서에서 찾을 수 있습니다. iOS에서 디버그 공급자와 함께 앱 확인 사용을 참조하세요.
9. Firebase 실시간 데이터베이스에 대한 앱 검사 시행 활성화
현재 우리 앱은 실제 장치에 대한 AppCheckProviderFactory
를 반환하는 AppAttestProvider
를 선언합니다. 실제 기기에서 실행할 때 앱은 증명을 수행하고 결과를 Firebase 백엔드로 보냅니다. 그러나 Firebase 백엔드는 여전히 모든 기기, iOS 시뮬레이터, 스크립트 등의 요청을 수락합니다. 이 모드는 여전히 App Check가 없는 이전 버전의 앱을 사용하는 사용자가 있고 액세스 권한을 적용하지 않으려는 경우에 유용합니다. 아직 확인합니다.
이제 합법적인 기기에서만 Firebase 앱에 액세스할 수 있도록 App Check 시행 을 활성화해야 합니다. Firebase 프로젝트에 적용을 활성화하면 App Check 통합이 없는 이전 앱 버전의 작동이 중지됩니다.
- Firebase 콘솔의 앱 검사 섹션에서 실시간 데이터베이스 를 클릭하여 세부정보를 확장합니다.
- 시행 을 클릭합니다.
- 확인 대화 상자의 정보를 읽은 다음 Enforce 를 클릭합니다.
이 단계를 완료하면 합법적인 앱만 데이터베이스에 액세스할 수 있습니다. 다른 모든 앱은 차단됩니다.
불법 앱으로 실시간 데이터베이스 접속 시도
App Check 시행을 보려면 다음 단계를 따르세요.
-
DatabaseExampleApp
에서 앱 진입점의init
메소드에서 앱 확인 등록 코드를 주석 처리하여 앱 확인 등록을 끕니다. - 장치 > 모든 콘텐츠 및 설정 지우기 를 선택하여 시뮬레이터를 재설정합니다. 시뮬레이터를 지우고 장치 토큰을 무효화합니다.
- 시뮬레이터에서 앱을 다시 실행하십시오.
- 이제 다음 오류 메시지가 표시되어야 합니다.
[FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server. Will not attempt reconnect. Reason: Invalid appcheck token.
앱 확인을 다시 활성화하려면 다음을 수행하십시오.
-
DatabaseExampleApp
에서 App Check 등록 코드의 주석 처리를 제거합니다. - 앱을 다시 시작합니다.
- Xcode의 콘솔에서 새로운 App Check 토큰을 기록해 둡니다.
- Firebase 콘솔에서 앱의 App Check 설정에 디버그 토큰을 등록합니다.
- 앱을 다시 실행합니다.
- 더 이상 오류 메시지가 표시되지 않으며 앱에서 새 게시물과 댓글을 추가할 수 있어야 합니다.
10. 축하합니다!
이제 다음을 수행하는 방법을 알게 되었습니다.
- 기존 프로젝트에 App Check 추가
- 앱의 프로덕션 버전에 대한 앱 증명 증명 공급자 구성
- 시뮬레이터에서 앱을 테스트하도록 디버그 증명 공급자 구성
- 앱 버전 출시를 관찰하여 Firebase 프로젝트에 앱 확인을 시행해야 하는 시기를 알아보세요.
- 앱 검사 시행 활성화
다음 단계
Firebase 원격 구성을 사용하여 Firebase App Check 점진적 출시 Codelab 에서 원격 구성을 사용하여 점진적으로 사용자에게 App Check를 출시하는 방법을 알아보세요.
도움이 될 수 있는 기타 리소스입니다.
이 코드랩에 설명된 설정은 대부분의 경우에 작동하지만 필요한 경우 App Check를 사용하면 더 많은 유연성을 얻을 수 있습니다. 자세한 내용은 다음 링크를 확인하세요.