안전하지 않은 규칙 수정

이 가이드를 활용하여 Firestore 보안 규칙 구성의 일반적인 취약점을 이해하고, 자체 규칙을 검토하여 규칙 보안을 강화하고, 변경사항을 배포하기 전에 테스트할 수 있습니다.

Firestore 데이터베이스가 올바르게 보호되지 않는다는 알림을 받으면 Firestore 보안 규칙을 수정 및 테스트하여 취약점을 해결할 수 있습니다.

기존 보안 규칙을 보려면 Firebase Console의 규칙 탭으로 이동하세요.

Firestore 보안 규칙 이해

Firestore 보안 규칙은 악의적인 사용자로부터 데이터를 보호합니다. Firebase Console에서 생성된 모든 Firestore 인스턴스의 기본 규칙은 모든 사용자에 대한 액세스를 거부합니다. 앱을 개발하고 데이터베이스에 액세스하려면 이러한 규칙을 수정해야 하며 개발 환경의 모든 사용자에게 포괄적인 액세스 권한을 부여하는 것도 고려해 볼 수 있습니다. 하지만 프로덕션 환경에 앱을 배포하기 전에 규칙을 올바르게 구성하고 데이터를 보호해야 합니다.

앱을 개발하고 다양한 규칙 구성을 테스트하는 과정에서 Firestore 에뮬레이터를 사용하여 로컬 개발 환경에서 앱을 실행하세요.

안전하지 않은 규칙의 일반적인 시나리오

Firestore 보안 규칙을 기본값으로 설정했거나 Firestore로 앱을 처음에 개발할 때의 상태로 둔 경우 앱을 배포하기 전에 이 규칙을 검토하고 업데이트해야 합니다. 다음과 같은 일반적인 함정에 빠지지 않고 사용자 데이터를 올바르게 보호해야 합니다.

오픈 액세스

Firestore를 설정할 때 개발 중에 오픈 액세스를 허용하도록 규칙을 설정했을 수 있습니다. 자신이 앱의 유일한 사용자라고 생각할 수도 있겠지만 앱을 배포했다면 인터넷에서 제공된다는 의미입니다. 사용자를 인증하고 보안 규칙을 구성하지 않으면 프로젝트 ID를 추측한 다른 사람이 데이터를 도용, 수정 또는 삭제할 수 있습니다.

권장하지 않음: 모든 사용자에 대한 읽기 및 쓰기 액세스 권한
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
솔루션: 읽기 및 쓰기 액세스를 제한하는 규칙

데이터 계층 구조에 적합한 규칙을 작성하세요. 이 보안 위험에 대응하기 위한 일반적인 솔루션 중 하나는 Firebase 인증을 사용하는 사용자 기반 보안입니다. 규칙으로 사용자를 인증하는 방법을 자세히 알아보세요.

콘텐츠 소유자만

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

공개 및 비공개 액세스 혼합

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

인증된 사용자 액세스

Firestore 보안 규칙에서 사용자가 로그인했는지 확인하지만 인증을 기반으로 액세스를 추가로 제한하지 않는 경우가 있습니다. 규칙 중 하나라도 auth != null이 포함되어 있으면 로그인한 사용자에게 데이터에 대한 액세스 권한을 부여할지 확인하세요.

권장하지 않음: 로그인한 모든 사용자에게 전체 데이터베이스에 대한 읽기 및 쓰기 액세스 허용
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
솔루션: 보안 조건을 사용하여 액세스 범위 제한

인증을 확인할 때 인증 속성 중 하나를 사용하여 특정 데이터세트에 대한 특정 사용자의 액세스를 추가로 제한할 수도 있습니다. 보안 조건 추가역할 기반 액세스에 대해 자세히 알아보세요.

역할 기반 액세스

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

속성 기반 액세스

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

공개 및 비공개 액세스 혼합

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

차단된 액세스

앱을 개발할 때 또 다른 일반적인 방식은 데이터를 잠긴 상태로 유지하는 것입니다. 일반적으로 다음과 같이 모든 사용자에 대한 읽기 및 쓰기 액세스 권한을 차단하는 것을 의미합니다.

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK 및 Cloud Functions에서는 계속 데이터베이스에 액세스할 수 있습니다. Firestore를 Firebase Admin SDK와 함께 서버 전용 백엔드로 사용하려면 이 규칙을 사용합니다. 안전한 방식이지만 앱의 클라이언트에서 데이터를 제대로 검색할 수 있는지 테스트해야 합니다.

Firestore 보안 규칙 시작하기에서 Firestore 보안 규칙과 작동 방식을 자세히 알아보세요.

Firestore 보안 규칙 확인

앱 동작을 확인하고 Firestore 보안 규칙 구성을 확인하려면 Firestore 에뮬레이터를 사용합니다. 변경사항을 배포하기 전에 로컬 환경에서 Firestore 에뮬레이터를 사용하여 단위 테스트를 실행 및 자동화합니다.

Firebase Console에서 업데이트된 Firestore 보안 규칙을 빠르게 테스트하려면 규칙 플레이그라운드 도구를 사용합니다.

  1. 규칙 플레이그라운드를 열려면 규칙 탭에서 규칙 플레이그라운드를 클릭합니다.
  2. 규칙 플레이그라운드 설정에서 다음을 포함한 테스트 옵션을 선택합니다.
    • 읽기 또는 쓰기 테스트
    • 데이터베이스의 특정 위치(경로)
    • 인증 유형 — 인증되지 않은 사용자, 인증된 익명 사용자 또는 특정 사용자 ID
    • 규칙에서 구체적으로 참조하는 문서별 데이터(예: 특정 필드가 있어야 쓰기를 허용하는 규칙의 경우)
  3. 실행을 클릭하고 규칙 창 위의 배너에서 결과를 확인합니다.