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 콘솔에서 수행된 모든 업데이트를 덮어쓸 수 있습니다.

업데이트 테스트

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

CLI로 작업하는 경우 도구 모음은 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. 그런 다음 제품 탐색에서 실시간 데이터베이스 , Cloud Firestore 또는 저장소 를 선택한 다음 규칙 을 클릭하여 규칙 편집기로 이동합니다.
  3. 편집기에서 직접 규칙을 편집하십시오.

업데이트 테스트

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

업데이트 배포

업데이트가 예상한 대로 만족스러우면 게시 를 클릭합니다.

관리 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 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로 규칙 세트 관리

대규모 규칙 배포를 관리하는 데 도움이 되도록 관리 API는 규칙 집합 및 릴리스를 만들기 위한 REST 방법 외에도 다음과 같은 방법을 제공합니다.

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

시간이 지남에 따라 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 페이로드와 함께 Rules 언어 소스 인라인을 해당 규칙에서 실행하기 위한 테스트 스위트와 함께 전달합니다. 규칙 평가 기대치와 규칙 세트를 테스트할 클라이언트 요청을 지정합니다. 또한 "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 상태로 확인합니다.

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

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

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

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

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

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