안전하지 않은 규칙 수정

이 가이드를 활용하여 Cloud Firestore 보안 규칙 구성의 일반적인 취약점을 이해하고 자체 규칙을 검토하여 규칙의 보안을 강화한 후 변경사항을 배포하기 전에 테스트해 보세요.

Cloud Firestore 데이터베이스가 제대로 보호되지 않는다는 알림이 표시되는 경우 Cloud Firestore 보안 규칙을 수정하고 테스트하여 취약점을 해결할 수 있습니다.

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

Cloud Firestore 보안 규칙 이해

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

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

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

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

오픈 액세스

Cloud 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
    }
  }
}
  

인증된 사용자 액세스

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

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

Cloud Firestore 보안 규칙 확인

앱의 동작을 확인하고 Cloud Firestore 보안 규칙 구성을 검증하려면 Cloud Firestore 에뮬레이터를 사용하세요. 변경사항을 배포하기 전에 Cloud Firestore 에뮬레이터를 사용하여 단위 테스트를 실행하고 자동화하세요.

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

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