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

기본 보안 규칙

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

Firebase 보안 규칙을 사용하면 저장된 데이터에 대한 액세스를 제어할 수 있습니다. 유연한 규칙 구문은 전체 데이터베이스에 대한 모든 쓰기에서 특정 문서에 대한 작업에 이르기까지 모든 것과 일치하는 규칙을 생성할 수 있음을 의미합니다.

이 가이드에서는 앱을 설정하고 데이터를 보호할 때 구현할 수 있는 몇 가지 기본적인 사용 사례를 설명합니다. 그러나 규칙 작성을 시작하기 전에 규칙이 작성된 언어동작 에 대해 자세히 알고 싶을 수 있습니다.

규칙에 액세스하고 업데이트하려면 Firebase 보안 규칙 관리 및 배포 에 설명된 단계를 따르세요.

기본 규칙: 잠금 모드

Firebase 콘솔에서 데이터베이스 또는 저장소 인스턴스를 생성할 때 Firebase 보안 규칙이 데이터에 대한 액세스를 제한할지( Locked 모드 ) 모든 사람이 액세스할 수 있도록 허용할지( Test 모드 ) 선택합니다. Cloud Firestore 및 실시간 데이터베이스에서 잠금 모드 의 기본 규칙은 모든 사용자에 대한 액세스를 거부합니다. Cloud Storage에서는 인증된 사용자만 스토리지 버킷에 액세스할 수 있습니다.

클라우드 파이어스토어

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

실시간 데이터베이스

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

클라우드 스토리지

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

개발 환경 규칙

앱에서 작업하는 동안 데이터에 비교적 개방적이거나 제한 없는 액세스를 원할 수 있습니다. 앱을 프로덕션에 배포하기 전에 규칙을 업데이트해야 합니다. 또한 앱을 배포하면 앱을 시작 하지 않았더라도 공개적으로 액세스할 수 있다는 점을 기억하십시오.

Firebase는 클라이언트가 데이터에 직접 액세스할 수 있도록 허용하며 Firebase 보안 규칙은 악의적인 사용자에 대한 액세스를 차단하는 유일한 보호 장치입니다. 제품 논리와 별도로 규칙을 정의하면 여러 가지 이점이 있습니다. 클라이언트는 보안을 적용할 책임이 없고 버그가 있는 구현은 데이터를 손상시키지 않으며 가장 중요한 것은 세상에서 데이터를 보호하기 위해 중개 서버에 의존하지 않는다는 것입니다.

인증된 모든 사용자

로그인한 모든 사용자가 데이터에 액세스할 수 있도록 하는 것은 권장하지 않지만 앱을 개발하는 동안 인증된 사용자에게 액세스 권한을 설정하는 것이 유용할 수 있습니다.

클라우드 파이어스토어

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

실시간 데이터베이스

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

클라우드 스토리지

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

생산 준비 규칙

앱 배포를 준비할 때 데이터가 보호되고 사용자에게 액세스 권한이 제대로 부여되었는지 확인하세요. 인증 을 활용하여 사용자 기반 액세스를 설정하고 데이터베이스에서 직접 읽어 데이터 기반 액세스를 설정합니다.

데이터를 구성할 때 규칙을 작성하는 것이 좋습니다. 규칙을 설정하는 방식이 다른 경로의 데이터에 대한 액세스를 제한하는 방식에 영향을 미치기 때문입니다.

콘텐츠 소유자만 액세스

이러한 규칙은 콘텐츠의 인증된 소유자에게만 액세스를 제한합니다. 데이터는 한 명의 사용자만 읽고 쓸 수 있으며 데이터 경로에는 사용자의 ID가 포함됩니다.

이 규칙이 작동하는 경우: 이 규칙은 데이터가 사용자에 의해 격리된 경우 — 데이터에 액세스해야 하는 유일한 사용자가 데이터를 생성한 동일한 사용자인 경우에 잘 작동합니다.

이 규칙이 작동하지 않는 경우: 이 규칙 세트는 여러 사용자가 동일한 데이터를 쓰거나 읽어야 할 때 작동하지 않습니다. 사용자는 데이터를 덮어쓰거나 자신이 생성한 데이터에 액세스할 수 없습니다.

이 규칙을 설정하려면 데이터 읽기 또는 쓰기에 대한 액세스를 요청하는 사용자가 해당 데이터를 소유한 사용자인지 확인하는 규칙을 만듭니다.

클라우드 파이어스토어

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

실시간 데이터베이스

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    }
  }
}

클라우드 스토리지

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

공용 및 개인 액세스 혼합

이 규칙은 누구나 데이터 세트를 읽을 수 있도록 허용하지만 인증된 콘텐츠 소유자에게만 주어진 경로에서 데이터를 생성하거나 수정하는 기능을 제한합니다.

이 규칙이 작동하는 경우: 이 규칙은 공개적으로 읽을 수 있는 요소가 필요하지만 해당 요소의 소유자에 대한 편집 액세스를 제한해야 하는 앱에 적합합니다. 예를 들어 채팅 앱이나 블로그.

이 규칙이 작동하지 않는 경우: 콘텐츠 소유자 전용 규칙과 마찬가지로 이 규칙 집합은 여러 사용자가 동일한 데이터를 편집해야 하는 경우 작동하지 않습니다. 사용자는 궁극적으로 서로의 데이터를 덮어씁니다.

이 규칙을 설정하려면: 모든 사용자(또는 인증된 모든 사용자)에 대해 읽기 액세스를 활성화하고 데이터를 쓰는 사용자가 소유자인지 확인하는 규칙을 만듭니다.

클라우드 파이어스토어

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 create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

실시간 데이터베이스

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid !== null" for only authenticated users
        ".write": "auth.uid === $uid"
      }
    }
  }
}

클라우드 스토리지

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

속성 기반 및 역할 기반 액세스

이러한 규칙이 작동하려면 데이터의 사용자에게 속성을 정의하고 할당해야 합니다. Firebase 보안 규칙은 데이터베이스 또는 파일 메타데이터의 데이터에 대해 요청을 확인하여 액세스를 확인하거나 거부합니다.

이 규칙이 작동하는 경우: 사용자에게 역할을 할당하는 경우 이 규칙을 사용하면 역할 또는 특정 사용자 그룹을 기반으로 액세스를 쉽게 제한할 수 있습니다. 예를 들어, 성적을 저장하는 경우 "학생" 그룹(내용 읽기만), "교사" 그룹(주제에서 읽기 및 쓰기) 및 "교장" 그룹(읽기 모든 콘텐츠).

이 규칙이 작동하지 않는 경우: 실시간 데이터베이스 및 Cloud Storage에서 규칙은 Cloud Firestore 규칙이 통합할 수 있는 get() 메서드를 활용할 수 없습니다. 따라서 규칙에서 사용 중인 속성을 반영하도록 데이터베이스 또는 파일 메타데이터를 구조화해야 합니다.

이 규칙을 설정하려면: Cloud Firestore에서 읽을 수 있는 사용자 문서의 필드를 포함하고 해당 필드를 읽고 조건부로 액세스 권한을 부여하도록 규칙을 구성합니다. 실시간 데이터베이스에서 앱의 사용자를 정의하고 자식 노드에서 역할을 부여하는 데이터 경로를 만듭니다.

인증에서 맞춤 클레임을 설정한 다음 Firebase 보안 규칙의 auth.token 변수에서 해당 정보를 검색할 수도 있습니다.

데이터 정의 속성 및 역할

이러한 규칙은 Cloud Firestore 및 실시간 데이터베이스에서만 작동합니다.

클라우드 파이어스토어

아래 규칙과 같이 규칙에 읽기가 포함될 때마다 Cloud Firestore에서 읽기 작업에 대한 요금이 청구됩니다.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

실시간 데이터베이스

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

사용자 지정 클레임 속성 및 역할

이러한 규칙을 구현하려면 Firebase 인증에서 맞춤 클레임 을 설정한 다음 규칙에서 클레임을 활용하세요.

클라우드 파이어스토어

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

실시간 데이터베이스

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

클라우드 스토리지

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `owner` property
  // Allow writes if the group ID is in the user's custom token
  match /files/{groupId}/{fileName} {
    allow read: if resource.metadata.owner == request.auth.token.groupId;
    allow write: if request.auth.token.groupId == groupId;
  }
}

테넌시 속성

이러한 규칙을 구현하려면 Google Cloud Identity Platform(GCIP)에서 멀티테넌시 를 설정한 다음 규칙에서 테넌트를 활용하세요. 다음 예에서는 특정 테넌트(예: tenant2-m6tyz )에 있는 사용자의 쓰기를 허용합니다.

클라우드 파이어스토어

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

실시간 데이터베이스

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

클라우드 스토리지

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}