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

Firebase 보안 규칙 관리 및 배포

Firebase는 규칙을 관리할 수 있는 여러 도구를 제공합니다. 각 도구는 특정 경우에 유용하며 각 도구는 동일한 백엔드 Firebase 보안 규칙 관리 API를 사용합니다.

어떤 도구를 사용하여 호출하든 상관없이 관리 API는 다음을 수행합니다.

  • 규칙 소스 를 수집합니다. 일반적으로 Firebase 보안 규칙 문이 포함된 코드 파일인 규칙 집합입니다.
  • 수집된 소스를 변경할 수 없는 규칙 집합 으로 저장합니다.
  • 릴리스 에서 각 규칙 세트의 배포를 추적합니다. Firebase 보안 규칙 지원 서비스는 프로젝트의 릴리스를 조회하여 보안 리소스에 대한 각 요청을 평가합니다.
  • 규칙 세트의 구문 및 의미 테스트 를 실행할 수 있는 기능을 제공합니다.

Firebase CLI 사용

Firebase CLI 를 사용하여 로컬 소스 를 업로드하고 릴리스 를 배포할 수 있습니다. CLI의 Firebase 로컬 에뮬레이터 제품군을 사용하면 소스 의 전체 로컬 테스트를 수행할 수 있습니다.

CLI를 사용하면 애플리케이션 코드로 규칙을 버전 제어하고 기존 배포 프로세스의 일부로 규칙을 배포할 수 있습니다.

구성 파일 생성

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

클라우드 파이어스토어

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

클라우드 스토리지

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

규칙 수정 및 업데이트

.rules 구성 파일에서 직접 규칙 소스를 편집합니다. Firebase CLI에서 수정한 사항이 Firebase 콘솔에 반영되는지 확인하거나 Firebase 콘솔 또는 Firebase CLI를 사용하여 지속적으로 업데이트해야 합니다. 그렇지 않으면 Firebase 콘솔에서 업데이트를 덮어쓸 수 있습니다.

업데이트 테스트

로컬 에뮬레이터 제품군은 모든 보안 규칙 사용 제품에 대한 에뮬레이터를 제공합니다. 각 에뮬레이터의 보안 규칙 엔진은 규칙의 구문 및 의미 평가를 모두 수행하므로 보안 규칙 관리 API가 제공하는 구문 테스트를 능가합니다.

CLI로 작업하는 경우 Suite는 Firebase 보안 규칙 테스트를 위한 훌륭한 도구입니다. 로컬 에뮬레이터 제품군 을 사용하여 업데이트를 로컬에서 테스트하고 앱의 규칙이 원하는 동작을 나타내는지 확인합니다.

업데이트 배포

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

클라우드 파이어스토어

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

실시간 데이터베이스

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

클라우드 스토리지

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

Firebase 콘솔 사용

또한 규칙 소스 를 수정하고 Firebase 콘솔에서 릴리스 로 배포할 수 있습니다. 구문 테스트 는 Firebase 콘솔 UI에서 편집할 때 수행되며 의미 테스트는 Rules Playground를 사용하여 사용할 수 있습니다.

규칙 수정 및 업데이트

  1. Firebase 콘솔 을 열고 프로젝트를 선택합니다.
  2. 그런 다음 제품 탐색에서 Realtime Database , Cloud Firestore 또는 Storage 를 선택한 다음 규칙 을 클릭하여 규칙 편집기로 이동합니다.
  3. 편집기에서 직접 규칙을 편집합니다.

업데이트 테스트

편집기 UI에서 구문을 테스트하는 것 외에도 프로젝트의 데이터베이스 및 저장소 리소스를 사용하여 의미론적 규칙 동작을 테스트할 수 있습니다. Firebase 콘솔에서 직접 Rules Playground 를 사용할 수 있습니다. 규칙 편집기에서 규칙 플레이그라운드 화면을 열고 설정을 수정한 다음 실행 을 클릭합니다. 편집기 상단에서 확인 메시지를 찾습니다.

업데이트 배포

업데이트가 예상한 것과 같다고 생각되면 게시 를 클릭합니다.

Admin SDK 사용

Node.js 규칙 세트 용 Admin SDK를 사용할 수 있습니다. 이 프로그래밍 방식 액세스를 통해 다음을 수행할 수 있습니다.

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

프로그래밍 방식으로 규칙을 업데이트할 때 앱에 대한 액세스 제어를 의도하지 않게 변경하지 않는 것이 매우 중요합니다. 특히 규칙을 업데이트하거나 배포할 때 보안을 가장 먼저 염두에 두고 Admin SDK 코드를 작성하세요.

명심해야 할 또 다른 중요한 사항은 Firebase 보안 규칙 릴리스가 완전히 전파되는 데 몇 분이 걸린다는 것입니다. Admin SDK를 사용하여 규칙을 배포할 때 앱이 아직 배포가 완료되지 않은 규칙에 즉시 의존하는 경쟁 조건을 피해야 합니다. 사용 사례에서 액세스 제어 규칙을 자주 업데이트해야 하는 경우 빈번한 업데이트에도 불구하고 경쟁 조건을 줄이도록 설계된 Cloud Firestore를 사용하는 솔루션을 고려하십시오.

또한 다음 제한 사항에 유의하십시오.

  • 규칙은 직렬화될 때 UTF-8로 인코딩된 텍스트의 256KiB보다 작아야 합니다.
  • 프로젝트에는 최대 2500개의 배포된 규칙 집합이 있을 수 있습니다. 이 제한에 도달하면 새 규칙 세트를 만들기 전에 일부 이전 규칙 세트를 삭제해야 합니다.

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.database 의 getRules()setRules() 메소드를 admin.database . 규칙 세트를 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;
      }
    }

시간이 지남에 따라 2500개의 규칙 집합 제한에 도달하는 대규모 배포의 경우 고정된 시간 주기에서 가장 오래된 규칙을 삭제하는 논리를 생성할 수 있습니다. 예를 들어 30일 이상 배포된 모든 규칙 집합을 삭제하려면 다음을 수행합니다.

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

REST API 사용

위에서 설명한 도구는 다양한 워크플로에 적합하지만 관리 API 자체를 사용하여 Firebase 보안 규칙을 관리하고 배포할 수 있습니다. 관리 API는 최고의 유연성을 제공합니다.

Firebase 보안 규칙 릴리스가 완전히 전파되는 데 몇 분 정도 걸립니다. 관리 REST API를 사용하여 배포할 때 앱이 아직 배포가 완료되지 않은 규칙에 즉시 의존하는 경쟁 조건을 피해야 합니다.

또한 다음 제한 사항에 유의하십시오.

  • 규칙은 직렬화될 때 UTF-8로 인코딩된 텍스트의 256KiB보다 작아야 합니다.
  • 프로젝트에는 최대 2500개의 배포된 규칙 집합이 있을 수 있습니다. 이 제한에 도달하면 새 규칙 세트를 만들기 전에 일부 이전 규칙 세트를 삭제해야 합니다.

REST를 사용하여 Cloud Storage 또는 Cloud Firestore 규칙 세트 생성 및 배포

이 섹션의 예시에서는 스토리지 규칙을 사용하지만 Cloud Firestore 규칙에도 적용됩니다.

예제에서는 cURL을 사용하여 API를 호출하기도 합니다. 인증 토큰을 설정하고 전달하는 단계는 생략됩니다. 참조 문서 와 통합된 API 탐색기를 사용하여 이 API를 실험할 수 있습니다.

관리 API를 사용하여 규칙 세트를 만들고 배포하는 일반적인 단계는 다음과 같습니다.

  1. 규칙 파일 소스 만들기
  2. 규칙 집합 만들기
  3. 새 규칙 세트 릴리스(배포)

secure_commerce Firebase 프로젝트에서 작업 중이고 잠긴 Cloud Storage 규칙을 배포하려고 한다고 가정해 보겠습니다. storage.rules 파일에서 이러한 규칙을 구현할 수 있습니다.

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

이제 이 파일에 대해 base64로 인코딩된 지문을 생성합니다. 그런 다음 이 파일의 소스를 사용하여 projects.rulesets.create .rulesets.create REST 호출로 규칙 세트를 작성하는 데 필요한 페이로드를 채울 수 있습니다. 여기에서는 cat 명령을 사용하여 storage.rules 의 내용을 REST 페이로드에 삽입합니다.

curl -X POST -d '{
  "source": {
    {
      "files": [
        {
          "content": "' $(cat storage.rules) '",
          "name": "storage.rules",
          "fingerprint": <sha fingerprint>
        }
      ]
    }
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

API는 유효성 검사 응답과 규칙 집합 이름을 반환합니다(예: projects/secure_commerce/rulesets/uuid123 . 규칙 집합이 유효한 경우 마지막 단계는 명명된 릴리스에 새 규칙 집합을 배포하는 것입니다.

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/prod/v23   "  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123",
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

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

실시간 데이터베이스는 규칙 관리를 위한 자체 REST 인터페이스를 제공합니다. REST를 통한 Firebase 실시간 데이터베이스 규칙 관리를 참조하세요.

REST로 규칙 세트 관리

대규모 규칙 배포를 관리하는 데 도움이 되도록 규칙 세트 및 릴리스를 생성하기 위한 REST 방법 외에도 관리 API는 다음을 수행하는 방법을 제공합니다.

  • 규칙 세트 나열, 가져오기 및 삭제
  • 규칙 릴리스 나열, 가져오기 및 삭제

시간이 지남에 따라 2500개의 규칙 집합 제한에 도달하는 대규모 배포의 경우 고정된 시간 주기에서 가장 오래된 규칙을 삭제하는 논리를 생성할 수 있습니다. 예를 들어, 30일 이상 배포된 모든 규칙 세트를 삭제하려면 projects.rulesets.list 메소드를 호출하고 해당 createTime 키에서 Ruleset 객체의 JSON 목록을 구문 분석한 다음, ruleset_id 별로 해당 규칙 세트에서 project.rulesets.delete 를 호출할 수 있습니다. .

REST로 업데이트 테스트

마지막으로 관리 API를 사용하면 프로덕션 프로젝트의 Cloud Firestore 및 Cloud Storage 리소스에 대한 구문 및 의미 테스트를 실행할 수 있습니다.

API의 이 구성 요소를 사용한 테스트는 다음으로 구성됩니다.

  1. TestCase 객체 세트를 나타내는 TestSuite JSON 객체 정의
  2. TestSuite 제출
  3. 반환된 TestResult 개체 구문 분석

testcase.json 파일에서 단일 TestCaseTestSuite 개체를 정의해 보겠습니다. 이 예에서는 REST 페이로드와 함께 규칙 언어 소스를 인라인으로 전달하고 해당 규칙에서 실행할 테스트 제품군을 전달합니다. 우리는 규칙 평가 기대와 규칙 세트를 테스트할 클라이언트 요청을 지정합니다. 또한 "FULL" 값을 사용하여 요청과 일치하지 않는 표현식을 포함하여 모든 규칙 언어 표현식에 대한 결과가 보고서에 포함되어야 함을 나타내는 테스트 보고서의 완성도를 지정할 수 있습니다.

 {
  "source":
  {
    "files":
    [
      {
        "name": "firestore.rules",
        "content": "service cloud.firestore {
          match /databases/{database}/documents {
            match /users/{userId}{
              allow read: if (request.auth.uid == userId);
            }
            function doc(subpath) {
              return get(/databases/$(database)/documents/$(subpath)).data;
            }
            function isAccountOwner(accountId) {
              return request.auth.uid == accountId 
                  || doc(/users/$(request.auth.uid)).accountId == accountId;
            }
            match /licenses/{accountId} {
              allow read: if isAccountOwner(accountId);
            }
          }
        }"
      }
    ]
  },
  "testSuite":
  {
    "testCases":
    [
      {
        "expectation": "ALLOW",
        "request": {
           "auth": {"uid": "123"},
           "path": "/databases/(default)/documents/licenses/abcd",
           "method": "get"},
        "functionMocks": [
            {
            "function": "get",
            "args": [{"exact_value": "/databases/(default)/documents/users/123"}],
            "result": {"value": {"data": {"accountId": "abcd"}}}
            }
          ]
      }
    ]
  }
}

그런 다음 projects.test 메소드를 사용하여 평가를 위해 이 TestSuite 를 제출할 수 있습니다.

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

반환 TestReport (테스트 SUCCESS/FAILURE 상태, 디버그 메시지 목록, 방문한 규칙 표현식 목록 및 해당 평가 보고서 포함)는 액세스가 적절하게 허용되었음을 상태 SUCCESS로 확인합니다.

서비스 간 Cloud Storage 보안 규칙에 대한 권한 관리

Cloud Firestore 문서 콘텐츠를 사용하여 보안 조건을 평가 하는 Cloud Storage 보안 규칙을 만들면 Firebase 콘솔 또는 Firebase CLI에 두 제품을 연결할 수 있는 권한을 활성화하라는 메시지가 표시됩니다.

이러한 교차 서비스 보안을 비활성화하기로 결정한 경우:

  1. 먼저 기능을 비활성화하기 전에 규칙을 수정하고 규칙 함수를 사용하여 Cloud Firestore에 액세스하는 모든 명령문을 제거합니다. 그렇지 않으면 기능이 비활성화된 후 규칙 평가로 인해 스토리지 요청이 실패합니다.

  2. Google Cloud Console의 IAM 페이지에서 역할 취소에 대한 클라우드 가이드에 따라 'Firebase Rules Firestore 서비스 에이전트' 역할을 삭제합니다.

다음에 Firebase CLI 또는 Firebase 콘솔에서 교차 서비스 규칙을 저장할 때 이 기능을 다시 활성화하라는 메시지가 표시됩니다.