获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

안전하지 않은 규칙 피하기

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

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

Firebase 보안 규칙에 액세스

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

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

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

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

클라우드 파이어스토어

실시간 데이터베이스

클라우드 스토리지

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

실시간 데이터베이스 규칙 캐스케이드(cascade)는 더 얕은 규칙을 사용하고 상위 경로는 더 깊은 하위 노드의 규칙을 무시합니다. 자식 노드에서 규칙을 작성할 때 추가 권한만 부여할 수 있음을 기억하십시오. 데이터베이스의 더 깊은 경로에 있는 데이터에 대한 액세스를 구체화하거나 취소할 수 없습니다.

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

폐쇄 액세스

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

클라우드 파이어스토어

// 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 규칙 시뮬레이터 를 사용하세요.