Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

안전하지 않은 규칙 피하기

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 가이드를 사용하여 Firebase 보안 규칙 구성의 일반적인 취약점을 이해하고, 자체 규칙을 검토 및 보호하고, 변경 사항을 배포하기 전에 테스트하세요.

데이터가 제대로 보호되지 않는다는 경고를 받으면 일반적으로 발생하는 오류를 검토하고 취약한 규칙을 업데이트하십시오.

Firebase 보안 규칙에 액세스

기존 규칙을 보려면 Firebase CLI 또는 Firebase 콘솔을 사용하세요. 실수로 업데이트를 덮어쓰지 않도록 동일한 방법을 사용하여 일관되게 규칙을 편집해야 합니다. 로컬에서 정의한 규칙이 최신 업데이트를 반영하는지 확실하지 않은 경우 Firebase 콘솔에는 항상 가장 최근에 배포된 Firebase 보안 규칙 버전이 표시됩니다.

Firebase 콘솔 에서 규칙에 액세스하려면 프로젝트를 선택한 다음 실시간 데이터베이스 , Cloud Firestore 또는 저장소 로 이동합니다. 올바른 데이터베이스 또는 저장소 버킷에 있으면 규칙 을 클릭합니다.

Firebase CLI에서 규칙에 액세스하려면 firebase.json 파일에 표시된 규칙 파일로 이동하세요.

Firebase 보안 규칙 이해

Firebase 보안 규칙은 악의적인 사용자로부터 데이터를 보호합니다. Firebase 콘솔에서 데이터베이스 인스턴스 또는 Cloud Storage 버킷을 만들 때 모든 사용자에 대한 액세스를 거부( 잠금 모드 )하거나 모든 사용자에게 액세스 권한을 부여( 테스트 모드 )하도록 선택할 수 있습니다. 개발 중에 보다 개방적인 구성을 원할 수 있지만 앱을 배포하기 전에 시간을 들여 규칙을 적절하게 구성하고 데이터를 보호해야 합니다.

앱을 개발하고 규칙에 대한 다양한 구성을 테스트할 때 로컬 Firebase 에뮬레이터 중 하나를 사용하여 로컬 개발 환경에서 앱을 실행합니다.

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

앱을 배포하기 전에 기본적으로 설정했거나 처음에 앱을 개발할 때 설정한 규칙을 검토하고 업데이트해야 합니다. 다음과 같은 일반적인 함정을 피하여 사용자 데이터를 적절하게 보호하십시오.

오픈 액세스

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

권장되지 않음: 모든 사용자에 대한 읽기 및 쓰기 권한.

클라우드 파이어스토어

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

실시간 데이터베이스

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

  "rules": {
    ".read": true,
    ".write": true
  }
}
    

클라우드 스토리지

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
솔루션: 읽기 및 쓰기 액세스를 제한하는 규칙.

데이터 계층 구조에 맞는 규칙을 만드세요. 이러한 불안정성에 대한 일반적인 솔루션 중 하나는 Firebase 인증을 사용한 사용자 기반 보안입니다. 규칙을 사용하여 사용자를 인증하는 방법에 대해 자세히 알아보십시오.

클라우드 파이어스토어

실시간 데이터베이스

클라우드 스토리지

모든 인증된 사용자에 대한 액세스

경우에 따라 규칙은 사용자가 로그인했는지 확인하지만 해당 인증을 기반으로 액세스를 추가로 제한하지 않습니다. 규칙 중 하나에 auth != null 이 포함된 경우 로그인한 모든 사용자가 데이터에 액세스할 수 있는지 확인하십시오.

권장하지 않음: 로그인한 모든 사용자는 전체 데이터베이스에 대한 읽기 및 쓰기 액세스 권한을 가집니다.

클라우드 파이어스토어

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

실시간 데이터베이스

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

클라우드 스토리지

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
솔루션: 보안 조건을 사용하여 액세스를 제한합니다.

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

클라우드 파이어스토어

실시간 데이터베이스

클라우드 스토리지

(실시간 데이터베이스) 부적절하게 상속된 규칙

실시간 데이터베이스 규칙 캐스케이드, 더 얕은 규칙, 더 깊은 하위 노드의 규칙을 재정의하는 상위 경로. 하위 노드에서 규칙을 작성할 때 추가 권한만 부여할 수 있다는 점을 기억하십시오. 데이터베이스의 더 깊은 경로에 있는 데이터에 대한 액세스를 세분화하거나 취소할 수 없습니다.

권장되지 않음: 하위 경로
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
에서 규칙 구체화
해결 방법: 상위 경로에 광범위한 규칙을 작성하고 하위 경로에 보다 구체적인 권한을 부여하십시오. 데이터 액세스 요구 사항에 더 세분화가 필요한 경우 규칙을 세분화하십시오. Secure Your Data 에서 계단식 실시간 데이터베이스 규칙에 대해 자세히 알아보십시오.

닫힌 접근

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

클라우드 파이어스토어

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

실시간 데이터베이스

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
    

클라우드 스토리지

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK 및 Cloud Functions는 계속해서 데이터베이스에 액세스할 수 있습니다. Firebase Admin SDK와 함께 Cloud Firestore 또는 실시간 데이터베이스를 서버 전용 백엔드로 사용하려는 경우 이 규칙을 사용하세요. 보안이 유지되는 동안 앱의 클라이언트가 데이터를 적절하게 검색할 수 있는지 테스트해야 합니다.

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

Cloud Firestore 보안 규칙 테스트

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

Firebase 콘솔에서 Firebase 보안 규칙을 빠르게 검증하려면 Firebase 규칙 시뮬레이터 를 사용하세요.