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

보안 규칙 언어

Firebase 보안 규칙은 다양한 복잡성과 세분화를 지원하는 유연하고 강력한 맞춤 언어를 활용합니다. 규칙을 앱에 맞게 구체적이거나 일반적으로 만들 수 있습니다. 실시간 데이터베이스 규칙은 JSON 구조에서 JavaScript처럼 보이는 구문을 사용합니다. Cloud Firestore 및 Cloud Storage 규칙은 조건부로 부여된 액세스를 지원하는 matchallow 문으로 CEL을 기반으로 하는 CEL (Common Expression Language) 기반 언어를 사용합니다.

그러나 이들은 사용자 정의 언어이기 때문에 학습 곡선이 있습니다. 이 가이드를 사용하여 보다 복잡한 규칙에 대해 자세히 알아볼 때 규칙 언어를 더 잘 이해할 수 있습니다.

제품을 선택하여 규칙에 대해 자세히 알아보세요.

기본 구조

클라우드 파이어스토어

Cloud Firestore 및 Cloud Storage의 Firebase 보안 규칙은 다음 구조와 구문을 사용합니다.

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

규칙을 작성할 때 다음 주요 개념을 이해하는 것이 중요합니다.

  • 요청: allow 문에서 호출된 메서드 또는 메서드입니다. 다음은 실행을 허용하는 방법입니다. 표준 메소드는 get , list , create , updatedelete 입니다. 편리한 readwrite 방법을 사용하면 지정된 데이터베이스 또는 저장소 경로에 대한 광범위한 읽기 및 쓰기 액세스가 가능합니다.
  • 경로: URI 경로로 표시되는 데이터베이스 또는 저장소 위치입니다.
  • 규칙: 요청이 true로 평가되는 경우 요청을 허용하는 조건을 포함하는 allow 문.

이러한 각 개념은 아래에서 더 자세히 설명됩니다.

클라우드 스토리지

Cloud Firestore 및 Cloud Storage의 Firebase 보안 규칙은 다음 구조와 구문을 사용합니다.

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

규칙을 작성할 때 다음 주요 개념을 이해하는 것이 중요합니다.

  • 요청: allow 문에서 호출된 메서드 또는 메서드입니다. 다음은 실행을 허용하는 방법입니다. 표준 메소드는 get , list , create , updatedelete 입니다. 편리한 readwrite 방법을 사용하면 지정된 데이터베이스 또는 저장소 경로에 대한 광범위한 읽기 및 쓰기 액세스가 가능합니다.
  • 경로: URI 경로로 표시되는 데이터베이스 또는 저장소 위치입니다.
  • 규칙: 요청이 true로 평가되는 경우 요청을 허용하는 조건을 포함하는 allow 문.

이러한 각 개념은 아래에서 더 자세히 설명됩니다.

실시간 데이터베이스

실시간 데이터베이스에서 Firebase 보안 규칙은 JSON 문서에 포함된 JavaScript와 유사한 표현식으로 구성됩니다.

다음 구문을 사용합니다.

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

규칙에는 세 가지 기본 요소가 있습니다.

  • 경로: 데이터베이스 위치입니다. 이것은 데이터베이스의 JSON 구조를 미러링합니다.
  • 요청: 규칙이 액세스 권한을 부여하는 데 사용하는 방법입니다. readwrite 규칙은 광범위한 읽기 및 쓰기 액세스 권한을 부여하는 반면 validate 규칙은 수신 또는 기존 데이터를 기반으로 액세스 권한을 부여하는 보조 검증 역할을 합니다.
  • 조건: 요청이 true로 평가되는 경우 요청을 허용하는 조건입니다.

규칙 구성

클라우드 파이어스토어

Cloud Firestore 및 Cloud Storage에서 규칙의 기본 요소는 다음과 같습니다.

  • service 선언: 규칙이 적용되는 Firebase 제품을 선언합니다.
  • match 블록: 규칙이 적용되는 데이터베이스 또는 스토리지 버킷의 경로를 정의합니다.
  • allow 문: 접근 권한을 부여하기 위한 조건을 제공하며, 메소드에 따라 구분됩니다. 지원되는 메소드에는 get , list , create , update , delete 및 편의 메소드인 readwrite 가 포함됩니다.
  • 선택적 function 선언: 여러 규칙에서 사용할 조건을 결합하고 래핑하는 기능을 제공합니다.

service 에는 요청에 대한 액세스 권한을 부여하는 조건을 제공하는 allow 문이 있는 하나 이상의 match 블록이 포함되어 있습니다. requestresource 변수는 규칙 조건에서 사용할 수 있습니다. Firebase 보안 규칙 언어는 function 선언도 지원합니다.

구문 버전

syntax 문은 소스를 작성하는 데 사용된 Firebase 규칙 언어의 버전을 나타냅니다. 언어의 최신 버전은 v2 입니다.

rules_version = '2';
service cloud.firestore {
...
}

rules_version 문이 제공되지 않은 경우 규칙은 v1 엔진을 사용하여 평가됩니다.

서비스

service 선언은 규칙이 적용되는 Firebase 제품 또는 서비스를 정의합니다. 소스 파일당 하나의 service 선언만 포함할 수 있습니다.

클라우드 파이어스토어

service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}

클라우드 스토리지

service firebase.storage {
  // Your 'match' blocks with their corresponding 'allow' statements and
  // optional 'function' declarations are contained here
}

Firebase CLI를 사용하여 Cloud Firestore와 Cloud Storage 모두에 대한 규칙을 정의하는 경우 별도의 파일에서 규칙을 유지해야 합니다.

성냥

match 블록은 요청된 작업의 경로( 들어오는 request.path )와 일치하는 path 패턴을 선언합니다. match 의 본문에는 하나 이상의 중첩된 match 블록, allow 문 또는 function 선언이 있어야 합니다. 중첩된 match 블록의 경로는 상위 match 블록의 경로에 상대적입니다.

path 패턴은 변수 또는 와일드카드를 포함할 수 있는 디렉토리와 같은 이름입니다. path 패턴은 단일 경로 세그먼트 및 다중 경로 세그먼트 일치를 허용합니다. path 에 바인딩된 모든 변수는 match 범위 또는 path 가 선언된 모든 중첩 범위 내에서 볼 수 있습니다.

path 패턴에 대한 일치는 부분적이거나 완전할 수 있습니다.

  • 부분 일치: path 패턴은 request.path 의 접두사 일치입니다.
  • 완전한 일치: path 패턴은 전체 request.path 와 일치합니다.

완전히 일치하면 블록 내의 규칙이 평가됩니다. 부분 일치가 이루어지면 중첩된 match 규칙이 테스트되어 중첩된 path 가 일치를 완료 하는지 확인합니다.

완전한 match 의 규칙은 요청을 허용할지 여부를 결정하기 위해 평가됩니다. 일치하는 규칙이 액세스 권한을 부여하면 요청이 허용됩니다. 일치하는 규칙이 액세스 권한을 부여하지 않으면 요청이 거부됩니다.

// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
  // Partial match.
  match /example/{singleSegment} {   // `singleSegment` == 'hello'
    allow write;                     // Write rule not evaluated.
    // Complete match.
    match /nested/path {             // `singleSegment` visible in scope.
      allow read;                    // Read rule is evaluated.
    }
  }
  // Complete match.
  match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
    allow read;                      // Read rule is evaluated.
  }
}

위의 예에서 볼 수 있듯이 path 선언은 다음 변수를 지원합니다.

  • 단일 세그먼트 와일드카드: 와일드카드 변수는 {variable} 중괄호로 변수를 래핑하여 경로에 선언됩니다. 이 변수는 match 문 내에서 string 로 액세스할 수 있습니다.
  • 재귀 와일드카드: 재귀 또는 다중 세그먼트 와일드카드는 경로에 있거나 그 아래에 있는 여러 경로 세그먼트와 일치합니다. 이 와일드카드는 설정한 위치 아래의 모든 경로와 일치합니다. 세그먼트 변수 {variable=**} 끝에 =** 문자열을 추가하여 선언할 수 있습니다. 이 변수는 match 문 내에서 path 개체로 액세스할 수 있습니다.

허용하다

match 블록에는 하나 이상의 allow 문이 포함되어 있습니다. 이것이 실제 규칙입니다. 하나 이상의 메서드에 allow 규칙을 적용할 수 있습니다. Cloud Firestore 또는 Cloud Storage가 들어오는 요청을 승인하려면 allow 문의 조건이 true로 평가되어야 합니다. 조건 없이 allow 문을 작성할 수도 있습니다(예: allow read ). 그러나 allow 문에 조건이 포함되어 있지 않으면 항상 해당 메서드에 대한 요청을 허용합니다.

메서드에 대한 allow 규칙 중 하나라도 충족되면 요청이 허용됩니다. 또한 더 광범위한 규칙이 액세스 권한을 부여하는 경우 규칙은 액세스 권한을 부여하고 액세스를 제한할 수 있는 보다 세부적인 규칙은 무시합니다.

모든 사용자가 자신의 파일을 읽거나 삭제할 수 있는 다음 예를 고려하십시오. 더 세분화된 규칙은 쓰기를 요청하는 사용자가 파일을 소유하고 파일이 PNG인 경우에만 쓰기를 허용합니다. 이전 규칙이 허용하기 때문에 사용자는 하위 경로에 있는 모든 파일을 삭제할 수 있습니다(PNG가 아니더라도).

service firebase.storage {
  // Allow the requestor to read or delete any resource on a path under the
  // user directory.
  match /users/{userId}/{anyUserFile=**} {
    allow read, delete: if request.auth != null && request.auth.uid == userId;
  }

  // Allow the requestor to create or update their own images.
  // When 'request.method' == 'delete' this rule and the one matching
  // any path under the user directory would both match and the `delete`
  // would be permitted.

  match /users/{userId}/images/{imageId} {
    // Whether to permit the request depends on the logical OR of all
    // matched rules. This means that even if this rule did not explicitly
    // allow the 'delete' the earlier rule would have.
    allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
  }
}

방법

allow 문에는 동일한 메서드의 수신 요청에 대한 액세스 권한을 부여하는 메서드가 포함되어 있습니다.

방법 요청 유형
편리한 방법
read 모든 유형의 읽기 요청
write 모든 유형의 쓰기 요청
표준 방법
get 단일 문서 또는 파일에 대한 읽기 요청
list 쿼리 및 컬렉션에 대한 읽기 요청
create 새 문서 또는 파일 작성
update 기존 데이터베이스 문서에 쓰기 또는 파일 메타데이터 업데이트
delete 데이터 삭제

동일한 match 블록의 읽기 방법이나 동일한 path 선언의 충돌하는 쓰기 방법을 겹칠 수 없습니다.

예를 들어 다음 규칙은 실패합니다.

service bad.example {
  match /rules/with/overlapping/methods {
    // This rule allows reads to all authenticated users
    allow read: if request.auth != null;

    match another/subpath {
      // This secondary, more specific read rule causes an error
      allow get: if request.auth != null && request.auth.uid == "me";
      // Overlapping write methods in the same path cause an error as well
      allow write: if request.auth != null;
      allow create: if request.auth != null && request.auth.uid == "me";
    }
  }
}

기능

보안 규칙이 더 복잡해짐에 따라 규칙 집합에서 재사용할 수 있는 함수의 조건 집합을 래핑할 수 있습니다. 보안 규칙은 사용자 정의 기능을 지원합니다. 사용자 정의 함수의 구문은 JavaScript와 약간 비슷하지만 보안 규칙 함수는 몇 가지 중요한 제한이 있는 도메인별 언어로 작성됩니다.

  • 함수는 하나의 return 문만 포함할 수 있습니다. 추가 논리를 포함할 수 없습니다. 예를 들어 루프를 실행하거나 외부 서비스를 호출할 수 없습니다.
  • 함수는 정의된 범위에서 함수와 변수에 자동으로 액세스할 수 있습니다. 예를 들어, service cloud.firestore 범위 내에 정의된 함수는 resource 변수 및 get() 및 Existing() 과 같은 기본 제공 함수에 액세스할 수 exists() .
  • 함수는 다른 함수를 호출할 수 있지만 재귀할 수는 없습니다. 총 호출 스택 깊이는 20으로 제한됩니다.
  • 규칙 버전 v2 에서 함수는 let 키워드를 사용하여 변수를 정의할 수 있습니다. 함수는 최대 10개의 let 바인딩을 가질 수 있지만 return 문으로 끝나야 합니다.

함수는 function 키워드로 정의되며 0개 이상의 인수를 사용합니다. 예를 들어, 위의 예에서 사용된 두 가지 유형의 조건을 단일 함수로 결합할 수 있습니다.

service cloud.firestore {
  match /databases/{database}/documents {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }

    match /cities/{city} {
      allow read, write: if signedInOrPublic();
    }

    match /users/{user} {
      allow read, write: if signedInOrPublic();
    }
  }
}

다음은 함수 인수와 let 할당을 보여주는 예입니다. let 대입문은 세미콜론으로 구분해야 합니다.

function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
  return isAuthor || isAdmin;
}

isAdmin 할당이 admins 컬렉션의 조회를 시행하는 방법에 유의하십시오. 불필요한 조회 없이 지연 평가하려면 && (AND) 및 || 의 단락 특성을 활용하십시오. (OR) 비교는 isAuthor 가 true( && 비교의 경우) 또는 false( || 비교의 경우)로 표시되는 경우에만 두 번째 함수를 호출합니다.

function isAdmin(userId) {
  return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  // `||` is short-circuiting; isAdmin called only if isAuthor == false.
  return isAuthor || isAdmin(userId);
}

보안 규칙에서 기능을 사용하면 규칙이 복잡해짐에 따라 유지 관리가 더 쉬워집니다.

클라우드 스토리지

Cloud Firestore 및 Cloud Storage에서 규칙의 기본 요소는 다음과 같습니다.

  • service 선언: 규칙이 적용되는 Firebase 제품을 선언합니다.
  • match 블록: 규칙이 적용되는 데이터베이스 또는 스토리지 버킷의 경로를 정의합니다.
  • allow 문: 접근 권한을 부여하기 위한 조건을 제공하며, 메소드에 따라 구분됩니다. 지원되는 메소드에는 get , list , create , update , delete 및 편의 메소드인 readwrite 가 포함됩니다.
  • 선택적 function 선언: 여러 규칙에서 사용할 조건을 결합하고 래핑하는 기능을 제공합니다.

service 에는 요청에 대한 액세스 권한을 부여하는 조건을 제공하는 allow 문이 있는 하나 이상의 match 블록이 포함되어 있습니다. requestresource 변수는 규칙 조건에서 사용할 수 있습니다. Firebase 보안 규칙 언어는 function 선언도 지원합니다.

구문 버전

syntax 문은 소스를 작성하는 데 사용된 Firebase 규칙 언어의 버전을 나타냅니다. 언어의 최신 버전은 v2 입니다.

rules_version = '2';
service cloud.firestore {
...
}

rules_version 문이 제공되지 않은 경우 규칙은 v1 엔진을 사용하여 평가됩니다.

서비스

service 선언은 규칙이 적용되는 Firebase 제품 또는 서비스를 정의합니다. 소스 파일당 하나의 service 선언만 포함할 수 있습니다.

클라우드 파이어스토어

service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}

클라우드 스토리지

service firebase.storage {
  // Your 'match' blocks with their corresponding 'allow' statements and
  // optional 'function' declarations are contained here
}

Firebase CLI를 사용하여 Cloud Firestore와 Cloud Storage 모두에 대한 규칙을 정의하는 경우 별도의 파일에서 규칙을 유지해야 합니다.

성냥

match 블록은 요청된 작업의 경로( 들어오는 request.path )와 일치하는 path 패턴을 선언합니다. match 의 본문에는 하나 이상의 중첩된 match 블록, allow 문 또는 function 선언이 있어야 합니다. 중첩된 match 블록의 경로는 상위 match 블록의 경로에 상대적입니다.

path 패턴은 변수 또는 와일드카드를 포함할 수 있는 디렉토리와 같은 이름입니다. path 패턴은 단일 경로 세그먼트 및 다중 경로 세그먼트 일치를 허용합니다. path 에 바인딩된 모든 변수는 match 범위 또는 path 가 선언된 모든 중첩 범위 내에서 볼 수 있습니다.

path 패턴에 대한 일치는 부분적이거나 완전할 수 있습니다.

  • 부분 일치: path 패턴은 request.path 의 접두사 일치입니다.
  • 완전한 일치: path 패턴은 전체 request.path 와 일치합니다.

완전히 일치하면 블록 내의 규칙이 평가됩니다. 부분 일치가 이루어지면 중첩된 match 규칙이 테스트되어 중첩된 path 가 일치를 완료 하는지 확인합니다.

완전한 match 의 규칙은 요청을 허용할지 여부를 결정하기 위해 평가됩니다. 일치하는 규칙이 액세스 권한을 부여하면 요청이 허용됩니다. 일치하는 규칙이 액세스 권한을 부여하지 않으면 요청이 거부됩니다.

// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
  // Partial match.
  match /example/{singleSegment} {   // `singleSegment` == 'hello'
    allow write;                     // Write rule not evaluated.
    // Complete match.
    match /nested/path {             // `singleSegment` visible in scope.
      allow read;                    // Read rule is evaluated.
    }
  }
  // Complete match.
  match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
    allow read;                      // Read rule is evaluated.
  }
}

위의 예에서 볼 수 있듯이 path 선언은 다음 변수를 지원합니다.

  • 단일 세그먼트 와일드카드: 와일드카드 변수는 {variable} 중괄호로 변수를 래핑하여 경로에 선언됩니다. 이 변수는 match 문 내에서 string 로 액세스할 수 있습니다.
  • 재귀 와일드카드: 재귀 또는 다중 세그먼트 와일드카드는 경로에 있거나 그 아래에 있는 여러 경로 세그먼트와 일치합니다. 이 와일드카드는 설정한 위치 아래의 모든 경로와 일치합니다. 세그먼트 변수 {variable=**} 끝에 =** 문자열을 추가하여 선언할 수 있습니다. 이 변수는 match 문 내에서 path 개체로 액세스할 수 있습니다.

허용하다

match 블록에는 하나 이상의 allow 문이 포함되어 있습니다. 이것이 실제 규칙입니다. 하나 이상의 메서드에 allow 규칙을 적용할 수 있습니다. Cloud Firestore 또는 Cloud Storage가 들어오는 요청을 승인하려면 allow 문의 조건이 true로 평가되어야 합니다. 조건 없이 allow 문을 작성할 수도 있습니다(예: allow read ). 그러나 allow 문에 조건이 포함되어 있지 않으면 항상 해당 메서드에 대한 요청을 허용합니다.

메서드에 대한 allow 규칙 중 하나라도 충족되면 요청이 허용됩니다. 또한 더 광범위한 규칙이 액세스 권한을 부여하는 경우 규칙은 액세스 권한을 부여하고 액세스를 제한할 수 있는 보다 세부적인 규칙은 무시합니다.

모든 사용자가 자신의 파일을 읽거나 삭제할 수 있는 다음 예를 고려하십시오. 더 세분화된 규칙은 쓰기를 요청하는 사용자가 파일을 소유하고 파일이 PNG인 경우에만 쓰기를 허용합니다. 이전 규칙이 허용하기 때문에 사용자는 하위 경로에 있는 모든 파일을 삭제할 수 있습니다(PNG가 아니더라도).

service firebase.storage {
  // Allow the requestor to read or delete any resource on a path under the
  // user directory.
  match /users/{userId}/{anyUserFile=**} {
    allow read, delete: if request.auth != null && request.auth.uid == userId;
  }

  // Allow the requestor to create or update their own images.
  // When 'request.method' == 'delete' this rule and the one matching
  // any path under the user directory would both match and the `delete`
  // would be permitted.

  match /users/{userId}/images/{imageId} {
    // Whether to permit the request depends on the logical OR of all
    // matched rules. This means that even if this rule did not explicitly
    // allow the 'delete' the earlier rule would have.
    allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
  }
}

방법

allow 문에는 동일한 메서드의 수신 요청에 대한 액세스 권한을 부여하는 메서드가 포함되어 있습니다.

방법 요청 유형
편리한 방법
read 모든 유형의 읽기 요청
write 모든 유형의 쓰기 요청
표준 방법
get 단일 문서 또는 파일에 대한 읽기 요청
list 쿼리 및 컬렉션에 대한 읽기 요청
create 새 문서 또는 파일 작성
update 기존 데이터베이스 문서에 쓰기 또는 파일 메타데이터 업데이트
delete 데이터 삭제

동일한 match 블록의 읽기 방법이나 동일한 path 선언의 충돌하는 쓰기 방법을 겹칠 수 없습니다.

예를 들어 다음 규칙은 실패합니다.

service bad.example {
  match /rules/with/overlapping/methods {
    // This rule allows reads to all authenticated users
    allow read: if request.auth != null;

    match another/subpath {
      // This secondary, more specific read rule causes an error
      allow get: if request.auth != null && request.auth.uid == "me";
      // Overlapping write methods in the same path cause an error as well
      allow write: if request.auth != null;
      allow create: if request.auth != null && request.auth.uid == "me";
    }
  }
}

기능

보안 규칙이 더 복잡해짐에 따라 규칙 집합에서 재사용할 수 있는 함수의 조건 집합을 래핑할 수 있습니다. 보안 규칙은 사용자 정의 기능을 지원합니다. 사용자 정의 함수의 구문은 JavaScript와 약간 비슷하지만 보안 규칙 함수는 몇 가지 중요한 제한이 있는 도메인별 언어로 작성됩니다.

  • 함수는 하나의 return 문만 포함할 수 있습니다. 추가 논리를 포함할 수 없습니다. 예를 들어 루프를 실행하거나 외부 서비스를 호출할 수 없습니다.
  • 함수는 정의된 범위에서 함수와 변수에 자동으로 액세스할 수 있습니다. 예를 들어, service cloud.firestore 범위 내에 정의된 함수는 resource 변수 및 get() 및 Existing() 과 같은 기본 제공 함수에 액세스할 수 exists() .
  • 함수는 다른 함수를 호출할 수 있지만 재귀할 수는 없습니다. 총 호출 스택 깊이는 20으로 제한됩니다.
  • 규칙 버전 v2 에서 함수는 let 키워드를 사용하여 변수를 정의할 수 있습니다. 함수는 최대 10개의 let 바인딩을 가질 수 있지만 return 문으로 끝나야 합니다.

함수는 function 키워드로 정의되며 0개 이상의 인수를 사용합니다. 예를 들어, 위의 예에서 사용된 두 가지 유형의 조건을 단일 함수로 결합할 수 있습니다.

service cloud.firestore {
  match /databases/{database}/documents {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }

    match /cities/{city} {
      allow read, write: if signedInOrPublic();
    }

    match /users/{user} {
      allow read, write: if signedInOrPublic();
    }
  }
}

다음은 함수 인수와 let 할당을 보여주는 예입니다. let 대입문은 세미콜론으로 구분해야 합니다.

function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
  return isAuthor || isAdmin;
}

isAdmin 할당이 admins 컬렉션의 조회를 시행하는 방법에 유의하십시오. 불필요한 조회 없이 지연 평가하려면 && (AND) 및 || 의 단락 특성을 활용하십시오. (OR) 비교는 isAuthor 가 true( && 비교의 경우) 또는 false( || 비교의 경우)로 표시되는 경우에만 두 번째 함수를 호출합니다.

function isAdmin(userId) {
  return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  // `||` is short-circuiting; isAdmin called only if isAuthor == false.
  return isAuthor || isAdmin(userId);
}

보안 규칙에서 기능을 사용하면 규칙이 복잡해짐에 따라 유지 관리가 더 쉬워집니다.

실시간 데이터베이스

위에서 설명한 것처럼 실시간 데이터베이스 규칙에는 세 가지 기본 요소가 포함됩니다. 데이터베이스의 JSON 구조를 미러링하는 데이터베이스 위치, 요청 유형 및 액세스 권한 부여 조건입니다.

데이터베이스 위치

규칙의 구조는 데이터베이스에 저장한 데이터의 구조를 따라야 합니다. 예를 들어 메시지 목록이 있는 채팅 앱에는 다음과 같은 데이터가 있을 수 있습니다.

  {
    "messages": {
      "message0": {
        "content": "Hello",
        "timestamp": 1405704370369
      },
      "message1": {
        "content": "Goodbye",
        "timestamp": 1405704395231
      },
      ...
    }
  }

규칙은 해당 구조를 반영해야 합니다. 예를 들어:

  {
    "rules": {
      "messages": {
        "$message": {
          // only messages from the last ten minutes can be read
          ".read": "data.child('timestamp').val() > (now - 600000)",

          // new messages must have a string content and a number timestamp
          ".validate": "newData.hasChildren(['content', 'timestamp']) &&
                        newData.child('content').isString() &&
                        newData.child('timestamp').isNumber()"
        }
      }
    }
  }

위의 예에서 볼 수 있듯이 실시간 데이터베이스 규칙은 경로 세그먼트와 일치하도록 $location 변수를 지원합니다. 경로 세그먼트 앞에 $ 접두사를 사용하여 경로를 따라 모든 하위 노드와 규칙을 일치시킵니다.

  {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }

$variable 을 상수 경로 이름과 병렬로 사용할 수도 있습니다.

  {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }

방법

실시간 데이터베이스에는 세 가지 유형의 규칙이 있습니다. 이러한 규칙 유형 중 두 가지( readwrite )는 들어오는 요청의 메서드에 적용됩니다. validate 규칙 유형은 데이터 구조를 적용하고 데이터 형식과 내용의 유효성을 검사합니다. 규칙은 .write 규칙이 액세스 권한을 부여하는지 확인한 후 .validate 규칙을 실행합니다.

규칙 유형
.읽다 사용자가 데이터를 읽을 수 있는지 여부와 시기를 설명합니다.
.쓰다 데이터 쓰기가 허용되는지 여부와 시기를 설명합니다.
.확인 올바른 형식의 값이 어떻게 생겼는지, 자식 속성이 있는지 여부와 데이터 유형을 정의합니다.

기본적으로 허용하는 규칙이 없으면 경로에서 액세스가 거부됩니다.

건물 조건

클라우드 파이어스토어

조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. requestresource 변수는 이러한 조건에 대한 컨텍스트를 제공합니다.

request 변수

request 변수에는 다음 필드와 해당 정보가 포함됩니다.

request.auth

Firebase 인증의 인증 자격 증명이 포함된 JWT(JSON Web Token)입니다. auth 토큰에는 Firebase 인증을 통해 생성한 모든 사용자 지정 클레임과 표준 클레임 집합이 포함되어 있습니다. Firebase 보안 규칙 및 인증 에 대해 자세히 알아보세요.

request.method

request.method 는 표준 방법 또는 사용자 정의 방법 중 하나일 수 있습니다. 모든 읽기 전용 또는 모든 쓰기 전용 표준 메서드에 각각 적용되는 쓰기 규칙을 단순화하기 위해 readwrite 편의 메서드도 존재합니다.

request.params

request.params 에는 평가에 유용할 수 있는 request.resource 와 특별히 관련되지 않은 모든 데이터가 포함됩니다. 실제로 이 맵은 모든 표준 방법에 대해 비어 있어야 하고 사용자 정의 방법에 대한 리소스가 아닌 데이터를 포함해야 합니다. 서비스는 params로 표시되는 키와 값의 유형을 변경하거나 이름을 바꾸지 않도록 주의해야 합니다.

request.path

request.path 는 대상 resource 의 경로입니다. 경로는 서비스에 상대적입니다. / 와 같은 비-URL 안전 문자를 포함하는 경로 세그먼트는 URL로 인코딩됩니다.

resource 변수

resource 는 키-값 쌍의 맵으로 표시되는 서비스 내의 현재 값입니다. 조건 내에서 resource 를 참조하면 서비스에서 값을 최대 한 번 읽습니다. 이 조회는 리소스에 대한 서비스 관련 할당량에 대해 계산됩니다. get 요청의 경우 resource 는 거부 시 할당량에만 계산됩니다.

연산자 및 연산자 우선 순위

아래 표를 Cloud Firestore 및 Cloud Storage에 대한 규칙에서 연산자 및 해당 우선순위에 대한 참조로 사용하세요.

임의의 표현식 ab , 필드 f 및 인덱스 i 가 제공됩니다.

운영자 설명 연관성
a[i] a() af 색인, 호출, 필드 액세스 왼쪽에서 오른쪽으로
!a -a 단항 부정 오른쪽에서 왼쪽으로
a/ba%ba*b 곱셈 연산자 왼쪽에서 오른쪽으로
a+b ab 덧셈 연산자 왼쪽에서 오른쪽으로
a>ba>=ba 관계 연산자 왼쪽에서 오른쪽으로
a in b 목록 또는 지도에 존재 왼쪽에서 오른쪽으로
a is type 유형 비교, 여기서 type 은 bool, int, float, 숫자, 문자열, 목록, 지도, 타임스탬프, 기간, 경로 또는 latlng일 수 있습니다. 왼쪽에서 오른쪽으로
a==ba!=b 비교 연산자 왼쪽에서 오른쪽으로
a && b 조건부 AND 왼쪽에서 오른쪽으로
a || b 조건부 OR 왼쪽에서 오른쪽으로
a ? true_value : false_value 삼항식 왼쪽에서 오른쪽으로

클라우드 스토리지

조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. requestresource 변수는 이러한 조건에 대한 컨텍스트를 제공합니다.

request 변수

request 변수에는 다음 필드와 해당 정보가 포함됩니다.

request.auth

Firebase 인증의 인증 자격 증명이 포함된 JWT(JSON Web Token)입니다. auth 토큰에는 Firebase 인증을 통해 생성한 모든 사용자 지정 클레임과 표준 클레임 집합이 포함되어 있습니다. Firebase 보안 규칙 및 인증 에 대해 자세히 알아보세요.

request.method

request.method 는 표준 방법 또는 사용자 정의 방법 중 하나일 수 있습니다. 모든 읽기 전용 또는 모든 쓰기 전용 표준 메서드에 각각 적용되는 쓰기 규칙을 단순화하기 위해 readwrite 편의 메서드도 존재합니다.

request.params

request.params 에는 평가에 유용할 수 있는 request.resource 와 특별히 관련되지 않은 모든 데이터가 포함됩니다. 실제로 이 맵은 모든 표준 방법에 대해 비어 있어야 하고 사용자 정의 방법에 대한 리소스가 아닌 데이터를 포함해야 합니다. 서비스는 params로 표시되는 키와 값의 유형을 변경하거나 이름을 바꾸지 않도록 주의해야 합니다.

request.path

request.path 는 대상 resource 의 경로입니다. 경로는 서비스에 상대적입니다. / 와 같은 비-URL 안전 문자를 포함하는 경로 세그먼트는 URL로 인코딩됩니다.

resource 변수

resource 는 키-값 쌍의 맵으로 표시되는 서비스 내의 현재 값입니다. 조건 내에서 resource 를 참조하면 서비스에서 값을 최대 한 번 읽습니다. 이 조회는 리소스에 대한 서비스 관련 할당량에 대해 계산됩니다. get 요청의 경우 resource 는 거부 시 할당량에만 계산됩니다.

연산자 및 연산자 우선 순위

아래 표를 Cloud Firestore 및 Cloud Storage에 대한 규칙에서 연산자 및 해당 우선순위에 대한 참조로 사용하세요.

임의의 표현식 ab , 필드 f 및 인덱스 i 가 제공됩니다.

운영자 설명 연관성
a[i] a() af 색인, 호출, 필드 액세스 왼쪽에서 오른쪽으로
!a -a 단항 부정 오른쪽에서 왼쪽으로
a/ba%ba*b 곱셈 연산자 왼쪽에서 오른쪽으로
a+b ab 덧셈 연산자 왼쪽에서 오른쪽으로
a>ba>=ba 관계 연산자 왼쪽에서 오른쪽으로
a in b 목록 또는 지도에 존재 왼쪽에서 오른쪽으로
a is type 유형 비교, 여기서 type 은 bool, int, float, 숫자, 문자열, 목록, 지도, 타임스탬프, 기간, 경로 또는 latlng일 수 있습니다. 왼쪽에서 오른쪽으로
a==ba!=b 비교 연산자 왼쪽에서 오른쪽으로
a && b 조건부 AND 왼쪽에서 오른쪽으로
a || b 조건부 OR 왼쪽에서 오른쪽으로
a ? true_value : false_value 삼항식 왼쪽에서 오른쪽으로

실시간 데이터베이스

조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. 다음과 같은 방법으로 실시간 데이터베이스 규칙에서 이러한 조건을 정의할 수 있습니다.

미리 정의된 변수

규칙 정의 내에서 액세스할 수 있는 유용한 사전 정의된 변수가 많이 있습니다. 각각에 대한 간략한 요약은 다음과 같습니다.

미리 정의된 변수
지금 Linux epoch 이후의 현재 시간(밀리초)입니다. 이는 SDK의 firebase.database.ServerValue.TIMESTAMP로 생성된 타임스탬프의 유효성을 검사하는 데 특히 효과적입니다.
뿌리 시도한 작업 이전에 존재하는 Firebase 데이터베이스의 루트 경로를 나타내는 RuleDataSnapshot 입니다.
새로운 데이터 시도한 작업 후에 존재할 데이터를 나타내는 RuleDataSnapshot 입니다. 여기에는 작성 중인 새 데이터와 기존 데이터가 포함됩니다.
데이터 시도한 작업 이전에 존재했던 데이터를 나타내는 RuleDataSnapshot 입니다.
$ 변수 ID 및 동적 자식 키를 나타내는 데 사용되는 와일드카드 경로입니다.
인증 인증된 사용자의 토큰 페이로드를 나타냅니다.

이러한 변수는 규칙의 어디에서나 사용할 수 있습니다. 예를 들어, 아래 보안 규칙은 /foo/ 노드에 기록된 데이터가 100자 미만의 문자열이어야 함을 보장합니다.

{
  "rules": {
    "foo": {
      // /foo is readable by the world
      ".read": true,

      // /foo is writable by the world
      ".write": true,

      // data written to /foo must be a string less than 100 characters
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

데이터 기반 규칙

데이터베이스의 모든 데이터를 규칙에 사용할 수 있습니다. 사전 정의된 변수 root , datanewData 를 사용하여 쓰기 이벤트 전후에 존재하는 모든 경로에 액세스할 수 있습니다.

/allow_writes/ 노드의 값이 true 이고 부모 노드에 readOnly 플래그가 설정되어 있지 않고 새로 작성된 데이터에 foo 라는 자식이 있는 한 쓰기 작업을 허용하는 이 예제를 고려하십시오.

".write": "root.child('allow_writes').val() === true &&
          !data.parent().child('readOnly').exists() &&
          newData.child('foo').exists()"

쿼리 기반 규칙

규칙을 필터로 사용할 수는 없지만 규칙에서 쿼리 매개변수를 사용하여 데이터 하위 집합에 대한 액세스를 제한할 수 있습니다. query. 쿼리 매개변수를 기반으로 읽기 또는 쓰기 액세스 권한을 부여하는 표현식.

예를 들어 다음 쿼리 기반 규칙은 사용자 기반 보안 규칙 과 쿼리 기반 규칙을 사용하여 baskets 컬렉션의 데이터에 대한 액세스를 활성 사용자가 소유한 장바구니로만 제한합니다.

"baskets": {
  ".read": "auth.uid !== null &&
            query.orderByChild === 'owner' &&
            query.equalTo === auth.uid" // restrict basket access to owner of basket
}

규칙에 쿼리 매개변수를 포함하는 다음 쿼리는 성공합니다.

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)                 // Would succeed

그러나 규칙에 매개변수를 포함하지 않는 쿼리는 PermissionDenied 오류와 함께 실패합니다.

db.ref("baskets").on("value", cb)                 // Would fail with PermissionDenied

쿼리 기반 규칙을 사용하여 클라이언트가 읽기 작업을 통해 다운로드하는 데이터의 양을 제한할 수도 있습니다.

예를 들어 다음 규칙은 우선 순위에 따라 쿼리의 처음 1000개 결과에 대해서만 읽기 액세스를 제한합니다.

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example queries:

db.ref("messages").on("value", cb)                // Would fail with PermissionDenied

db.ref("messages").limitToFirst(1000)
                  .on("value", cb)                // Would succeed (default order by key)

다음 query. 표현식은 실시간 데이터베이스 규칙에서 사용할 수 있습니다.

쿼리 기반 규칙 표현식
표현 유형 설명
query.orderByKey
query.orderByPriority
query.orderByValue
부울 키, 우선 순위 또는 값으로 정렬된 쿼리의 경우 True입니다. 그렇지 않으면 거짓입니다.
query.orderByChild
없는
문자열을 사용하여 자식 노드에 대한 상대 경로를 나타냅니다. 예: query.orderByChild === "address/zip" . 쿼리가 자식 노드에 의해 정렬되지 않은 경우 이 값은 null입니다.
query.startAt
쿼리.endAt
query.equalTo

숫자
부울
없는
실행 중인 쿼리의 경계를 검색하거나 경계 집합이 없으면 null을 반환합니다.
query.limitToFirst
query.limitToLast
숫자
없는
실행 쿼리에 대한 제한을 검색하거나 제한이 설정되지 않은 경우 null을 반환합니다.

연산자

실시간 데이터베이스 규칙은 조건문에서 변수를 결합하는 데 사용할 수 있는 여러 연산자 를 지원합니다. 참조 문서에서 전체 연산자 목록을 확인하세요.

조건 만들기

실제 조건은 부여하려는 액세스 권한에 따라 다릅니다. 규칙은 의도적으로 엄청난 유연성을 제공하므로 앱의 규칙은 궁극적으로 필요한 만큼 간단하거나 복잡할 수 있습니다.

간단한 프로덕션 준비 규칙을 만드는 몇 가지 지침은 기본 보안 규칙 을 참조하십시오.