안전하지 않은 규칙 차단

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

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

Firebase 보안 규칙 보기

기존 규칙을 보려면 Firebase CLI 또는 Firebase Console을 사용합니다. 실수로 업데이트를 덮어쓰지 않으려면 같은 방법을 사용해 규칙을 일관되게 수정해야 합니다. 로컬에서 정의된 규칙이 최신 업데이트를 반영하는지 확실하지 않은 경우 언제든지 Firebase Console을 통해 Firebase 보안 규칙의 가장 최근에 배포된 버전을 볼 수 있습니다.

Firebase Console에서 규칙을 보려면 프로젝트를 선택한 다음 실시간 데이터베이스, Cloud Firestore 또는 Storage로 이동합니다. 올바른 데이터베이스 또는 스토리지 버킷에 들어가면 규칙을 클릭합니다.

Firebase CLI에서 규칙을 보려면 firebase.json 파일에 언급된 규칙 파일로 이동합니다.

Firebase 보안 규칙 이해

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

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

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

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

오픈 액세스

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

권장하지 않음: 모든 사용자에게 읽기 및 쓰기 액세스 허용

Cloud Firestore

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

Cloud Storage

// 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 인증을 사용하는 사용자 기반 보안입니다. 규칙으로 사용자를 인증하는 방법을 자세히 알아보세요.

Cloud Firestore

실시간 데이터베이스

Cloud Storage

인증된 사용자 액세스

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

권장하지 않음: 로그인한 모든 사용자에게 전체 데이터베이스에 대한 읽기 및 쓰기 액세스 허용

Cloud Firestore

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

Cloud Storage

// 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;
    }
  }
}
솔루션: 보안 조건을 사용하여 액세스 범위 제한

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

Cloud Firestore

실시간 데이터베이스

Cloud Storage

(실시간 데이터베이스) 잘못 상속된 규칙

실시간 데이터베이스 보안 규칙은 보다 얕은 상위 경로의 규칙이 하위로 전파되어 보다 세부적인 하위 노드의 규칙을 재정의합니다. 하위 노드에서 규칙을 작성할 때는 추가 권한만 부여할 수 있습니다. 데이터베이스에서 세부 경로에 있는 데이터에 대한 액세스를 세분화하거나 취소할 수 없습니다.

권장하지 않음: 하위 경로에서 규칙 세분화
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
솔루션: 상위 경로에서 포괄적인 규칙을 작성하고 하위 경로에서 세세한 권한 부여 데이터 액세스를 보다 세분화해야 하는 경우 규칙을 세분화합니다. 데이터 보안에서 실시간 데이터베이스 보안 규칙의 하위 전파에 대해 자세히 알아보세요.

제한적 액세스

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

Cloud Firestore

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

Cloud Storage

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

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

Cloud Firestore 보안 규칙 테스트

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

Firebase Console에서 Firebase 보안 규칙을 신속하게 검증하려면 Firebase 규칙 시뮬레이터를 사용하세요.