Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

Firebase 보안 규칙 관리 및 배포

Firebase CLI 사용

Firebase CLI를 사용하여 규칙을 수정하고 배포하세요. CLI를 사용하면 애플리케이션 코드로 버전 제어하에 규칙을 유지하고 기존 배포 프로세스의 일환으로 규칙을 배포할 수 있습니다.

구성 파일 생성

Firebase CLI를 사용하여 Firebase 프로젝트를 구성할 때 프로젝트 디렉터리에 .rules 구성 파일을 만듭니다. 다음 명령어를 사용하여 Firebase 프로젝트 구성을 시작합니다.

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

실시간 데이터베이스

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Cloud Storage

// Set up Storage in your project directory, creates a .rules file
firebase init storage

규칙 수정 및 업데이트

.rules 구성 파일에서 직접 규칙을 수정합니다. Firebase CLI에서 수정한 내용이 Firebase Console에 반영되어 있는지 확인하거나 Firebase Console 또는 Firebase CLI를 사용하여 일관되게 업데이트해야 합니다. 그러지 않으면 Firebase Console에서 업데이트한 내용을 덮어쓰게 될 수 있습니다.

업데이트 테스트

Firebase 에뮬레이터를 사용하여 로컬에서 업데이트를 테스트하고 앱의 규칙이 원하는 동작을 나타내는지 확인합니다.

업데이트 배포

규칙을 업데이트하고 테스트를 했으면 프로덕션으로 배포합니다. 다음 명령어를 사용하여 규칙만 선택적으로 배포하거나 일반적인 배포 프로세스의 일환으로 규칙을 배포합니다.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

실시간 데이터베이스

// Deploy your .rules file
firebase deploy --only database

Cloud Storage

// Deploy your .rules file
firebase deploy --only storage

Firebase Console 사용

Firebase Console에서도 규칙을 수정하고 배포할 수 있습니다.

규칙 수정 및 업데이트

  1. Firebase Console을 열어 프로젝트를 선택합니다.
  2. 그런 다음 제품 탐색에서 실시간 데이터베이스, Cloud Firestore 또는 Storage를 선택한 다음 규칙을 클릭하여 규칙 편집기로 이동합니다.
  3. 편집기에서 직접 규칙을 수정합니다.

업데이트 테스트

Firebase 규칙 시뮬레이터를 사용하여 Firebase Console에서 규칙 동작을 직접 테스트할 수 있습니다. 규칙 편집기에서 시뮬레이터 화면을 열고 설정을 수정한 다음 실행을 클릭합니다. 편집기의 상단에 확인 메시지가 나타납니다.

업데이트 배포

업데이트 결과가 만족스럽다면 게시를 클릭합니다.

Admin SDK 사용

Node.js용 Admin SDK를 사용하여 프로그래매틱 방식으로 보안 규칙을 만들고 관리하고 배포할 수 있습니다. 이 프로그래매틱 액세스 방법으로 다음을 수행할 수 있습니다.

  • 규칙 관리를 위한 커스텀 도구, 스크립트, 대시보드, CI/CD 파이프라인을 구현합니다.
  • 여러 Firebase 프로젝트에서 보다 쉽게 규칙을 관리합니다.

프로그래매틱 방식으로 규칙을 업데이트할 때는 앱의 액세스 제어를 실수로 변경하지 않도록 주의해야 합니다. 특히 규칙을 업데이트하거나 배포할 때의 보안을 가장 염두에 두고 Admin SDK 코드를 작성해야 합니다.

또한 Firebase 보안 규칙이 완전히 배포되는 데는 몇 분 정도가 걸린다는 점에도 유의해야 합니다. Admin SDK를 사용하여 규칙을 배포할 때는 앱에서 배포가 아직 완료되지 않은 규칙을 즉시 적용함으로써 발생하는 경합 상태를 방지해야 합니다. 현재 사용 사례에서 액세스 제어 규칙을 자주 업데이트해야 한다면 빈번한 업데이트에도 경합 상태를 줄일 수 있도록 설계된 Cloud Firestore를 사용하는 것이 좋습니다.

또한 다음과 같은 제한사항에 유의하세요.

  • 규칙은 직렬화 시 UTF-8로 인코딩된 텍스트 64KiB보다 작아야 합니다.
  • 한 프로젝트에는 최대 총 2,500개의 규칙 세트를 배포할 수 있습니다. 이 한도에 도달하면 기존 규칙 세트를 일부 삭제해야 새 규칙 세트를 만들 수 있습니다.

Cloud Storage 또는 Cloud Firestore 규칙 세트 만들기 및 배포

Admin SDK로 보안 규칙을 관리하는 일반적인 워크플로에는 다음 세 단계가 포함될 수 있습니다.

  1. 규칙 파일 만들기(선택 사항)
  2. 규칙 세트 만들기
  3. 새 규칙 세트 출시 또는 배포

SDK는 이러한 단계를 Cloud Storage 및 Cloud Firestore 보안 규칙에 대한 단일 API 호출로 결합하는 메서드를 제공합니다. 예를 들면 다음과 같습니다.

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

releaseFirestoreRulesetFromSource()를 사용하는 Cloud Storage 규칙에도 동일한 패턴이 적용됩니다.

또는 규칙 파일을 인메모리 객체로 만들고, 규칙 세트를 만들고, 규칙 세트를 배포하는 과정을 더 세밀하게 제어하기 위해 이러한 이벤트를 개별적으로 처리할 수도 있습니다. 예를 들면 다음과 같습니다.

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

실시간 데이터베이스 규칙 세트 업데이트

Admin SDK로 실시간 데이터베이스 규칙 세트를 업데이트하려면 admin.databasegetRules()setRules() 메서드를 사용합니다. JSON 형식 또는 주석이 포함된 문자열로 규칙 세트를 가져올 수 있습니다.

규칙 세트를 업데이트하는 방법은 다음과 같습니다.

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score"
            "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

규칙 세트 관리

Admin SDK를 사용하면 admin.securityRules().listRulesetMetadata로 모든 기존 규칙을 나열하여 대규모 규칙 세트를 쉽게 관리할 수 있습니다. 예를 들면 다음과 같습니다.

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

매우 큰 규칙 세트의 경우 시간이 지나 규칙 한도인 2,500개에 도달하게 되면 고정된 시간 주기에서 가장 오래된 규칙을 삭제하는 로직을 만들 수 있습니다. 예를 들어 배포된 지 30일 이상 지난 모든 규칙 세트를 삭제하는 방법은 다음과 같습니다.

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);