Firebase 데이터베이스 보안 규칙 API

규칙: 유형

.읽다

클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 읽기 액세스 권한을 부여합니다.

.read 규칙은 클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 읽기 액세스 권한을 부여하는 보안 규칙 유형입니다. 예를 들어:

 ".read": "auth != null && auth.provider == 'twitter'"

.read 규칙의 값은 명확성과 정확성을 높이기 위해 몇 가지 동작 변경을 통해 JavaScript 표현식 구문의 하위 집합으로 평가되는 문자열입니다. 위치를 읽을 수 있는 권한을 부여하는 .read 규칙은 해당 위치의 모든 하위 항목에 대한 읽기도 허용합니다. 이는 하위 항목에 실패한 자체 .read 규칙이 있더라도 마찬가지입니다.

.read 규칙은 newData 제외한 모든 Firebase 실시간 데이터베이스의 규칙 변수 에 액세스할 수 있습니다.

.쓰다

클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 쓰기 액세스 권한을 부여합니다.

.write 규칙은 클라이언트에 Firebase 실시간 데이터베이스 위치에 대한 쓰기 액세스 권한을 부여하는 보안 규칙 유형입니다. 예를 들어:

".write": "auth != null && auth.token.isAdmin == true"

.write 규칙의 값은 명확성과 정확성을 높이기 위해 몇 가지 동작 변경을 통해 JavaScript 표현식 구문의 하위 집합으로 평가되는 문자열입니다. 위치에 대한 쓰기 권한을 부여하는 .write 규칙은 하위 항목에 실패한 자체 .write 규칙이 있더라도 해당 위치의 모든 하위 항목에 대한 쓰기도 허용합니다.

.write 규칙은 모든 Firebase 실시간 데이터베이스의 규칙 변수 에 액세스할 수 있습니다.

.확인

.write 규칙에 액세스 권한이 부여되면 기록 중인 데이터가 특정 스키마를 준수하는지 확인하는 데 사용됩니다.

.validate 규칙에 액세스 권한이 부여되면 .write 규칙은 기록되는 데이터가 특정 표준을 준수하는지 확인하는 데 사용됩니다. 액세스 권한을 부여하는 .write 외에도 쓰기가 허용되기 전에 관련된 모든 .validate 규칙이 성공해야 합니다. 예를 들어:

".validate": "newData.hasChildren(['name', 'age'])"

.validate 규칙의 값은 명확성과 정확성을 높이기 위해 몇 가지 동작 변경을 통해 JavaScript 표현식 구문의 하위 집합으로 평가되는 문자열입니다.

.validate 규칙은 모든 Firebase 실시간 데이터베이스의 규칙 변수 에 액세스할 수 있습니다.

.indexOn

데이터 색인을 생성하려는 키를 Firebase 실시간 데이터베이스에 알려 쿼리 성능을 향상시킵니다.

.indexOn 규칙은 쿼리 성능을 향상시키기 위해 Firebase 실시간 데이터베이스 서버에 데이터의 특정 키를 색인화하도록 지시합니다. 예를 들어 공룡 데이터 모음이 포함된 데이터베이스가 있는 경우 다음 규칙을 추가하여 쿼리가 서버에서 반환되기 전에 Firebase 실시간 데이터베이스에 쿼리를 최적화하도록 지시할 수 있습니다.

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

데이터 인덱싱 에 대한 보안 가이드 섹션을 참조하여 .indexOn 규칙에 대한 자세한 내용을 확인할 수 있습니다.

규칙: 변수

인증

클라이언트가 인증된 경우 토큰 페이로드가 포함된 변수이고, 클라이언트가 인증되지 않은 경우 null .

Firebase 실시간 데이터베이스를 사용하면 여러 기본 제공업체에 쉽게 인증하고 해당 제공업체에 대한 인증 토큰을 생성할 수 있습니다. 사용자가 내장 공급자 중 하나로 인증되면 auth 변수에 다음이 포함됩니다.

필드 설명
provider 사용된 인증 방법(예: "password", "anonymous", "facebook", "github", "google" 또는 "twitter").
uid 모든 제공업체에서 고유함이 보장되는 고유한 사용자 ID입니다.
token Firebase 인증 ID 토큰의 콘텐츠입니다. auth.token 참조하세요.

예를 들어, 사용자가 댓글과 함께 사용자 ID를 저장하는 한 댓글을 작성할 수 있도록 다음과 같은 규칙을 가질 수 있습니다.

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

또한 사용자가 Facebook을 사용하여 로그인한 동안 댓글을 작성할 수 있도록 다음과 같은 규칙을 만들 수도 있습니다.

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && auth.provider == 'facebook'"
    }
  }
}

인증토큰

Firebase 인증 ID 토큰의 콘텐츠가 포함된 변수입니다.

토큰에는 다음 키 중 일부 또는 전부가 포함되어 있습니다.

필드 설명
email 계정과 연결된 이메일 주소(있는 경우)입니다.
email_verified 사용자가 email 주소에 대한 액세스 권한이 있음을 확인한 경우 true . 일부 제공업체는 자신이 소유한 이메일 주소를 자동으로 확인합니다.
phone_number 계정과 연결된 전화번호(있는 경우)입니다.
name 사용자의 표시 이름(설정된 경우)입니다.
sub 사용자의 Firebase UID입니다. 이는 프로젝트 내에서 고유합니다.
firebase.identities 이 사용자의 계정과 연결된 모든 ID의 사전입니다. 사전의 키는 email , phone , google.com , facebook.com , github.com , twitter.com 중 하나일 수 있습니다. 사전의 값은 계정과 연결된 각 ID 공급자의 고유 식별자 배열입니다. 예를 들어 auth.token.firebase.identities["google.com"][0] 에는 계정과 연결된 첫 번째 Google 사용자 ID가 포함되어 있습니다.
firebase.sign_in_provider 이 토큰을 얻는 데 사용되는 로그인 공급자입니다. 다음 문자열 중 하나일 수 있습니다: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant 계정과 연결된 테넌트 ID입니다(있는 경우). 예: tenant2-m6tyz

사용자 정의 인증을 사용하는 경우 auth.token 개발자가 지정한 사용자 정의 클레임도 포함됩니다.

이러한 값은 모두 규칙 내에서 사용할 수 있습니다. 예를 들어 gmail.com 주소와 연결된 Google 계정에 대한 액세스를 제한하려면 다음 규칙을 추가할 수 있습니다.

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

완전성을 위해 auth.token 에는 다음 필드도 포함되어 있지만 규칙에는 유용하지 않을 것입니다.

필드 설명
iss 토큰 발급자입니다.
aud 토큰의 대상입니다.
auth_time 사용자가 토큰을 수신하는 장치를 사용하여 자격 증명으로 마지막으로 인증한 시간입니다.
iat 토큰이 발행된 시간입니다.
exp 토큰이 만료되는 시간입니다.

$위치

규칙 구조에서 이전에 사용된 $location 의 키를 참조하는 데 사용할 수 있는 변수입니다.

규칙 구조에 $location 있으면 규칙 표현식 내에서 일치하는 $ 변수를 사용하여 읽거나 쓰는 실제 하위 항목의 이름을 가져올 수 있습니다. 따라서 모든 사용자에게 자신의 /users/<user> 위치에 대한 읽기 및 쓰기 액세스 권한을 부여한다고 가정해 보겠습니다. 다음을 사용할 수 있습니다.

{
  "rules": {
    "users": {
      "$user": {
        ".read": "auth.uid === $user",
        ".write": "auth.uid === $user"
      }
    }
  }
}

클라이언트가 /users/barney 액세스하려고 하면 $user 기본 위치는 $user 가 "barney"와 동일하도록 일치합니다. 따라서 .read 규칙은 auth.uid === 'barney' 인지 확인합니다. 결과적으로 /users/barney 읽기는 클라이언트가 "barney"라는 uid로 인증된 경우에만 성공합니다.

지금

Firebase 실시간 데이터베이스 서버에 따른 Unix 시대 이후의 밀리초 수를 포함합니다.

now 변수에는 Firebase 실시간 데이터베이스 서버에 따른 UNIX 시대 이후의 밀리초 수가 포함됩니다. 예를 들어, 이를 사용하여 사용자가 created 시간이 미래의 시간으로 설정되지 않았는지 확인할 수 있습니다.

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

뿌리

Firebase 실시간 데이터베이스 루트의 현재 데이터에 해당하는 RuleDataSnapshot입니다 .

루트 변수는 Firebase 실시간 데이터베이스 루트의 현재 데이터에 해당하는 RuleDataSnapshot을 제공합니다. 이를 사용하여 규칙 표현식에서 데이터베이스의 모든 데이터를 읽을 수 있습니다. 예를 들어 /users/<id>/active true로 설정된 경우에만 사용자가 /comments 읽을 수 있도록 하려면 다음을 사용할 수 있습니다.

{
  "rules": {
    "comments": {
      ".read": "root.child('users').child(auth.uid).child('active').val() == true"
    }
  }
}

그런 다음 /users/barney/active true 값이 포함되어 있으면 "barney"라는 uid로 인증된 사용자가 /comments 노드에 쓸 수 있습니다.

데이터

현재 실행 중인 규칙 위치에 있는 Firebase 실시간 데이터베이스의 현재 데이터에 해당하는 RuleDataSnapshot입니다 .

데이터 변수는 현재 실행 중인 규칙의 데이터베이스 위치에 있는 현재 데이터에 해당하는 RuleDataSnapshot을 제공합니다(데이터베이스 루트에 대한 데이터를 제공하는 루트와 반대).

예를 들어 / /users/<user>/public true로 설정된 경우 모든 클라이언트가 /users/<user> users/<user>에 액세스할 수 있도록 하려면 다음을 사용할 수 있습니다.

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

데이터 변수는 .read , .write.validate 규칙에서 사용할 수 있습니다.

새로운 데이터

쓰기가 허용되는 경우 생성되는 데이터에 해당하는 RuleDataSnapshot 입니다.

.write.validate 규칙의 경우 newData 변수는 쓰기가 허용될 경우 생성되는 데이터에 해당하는 RuleDataSnapshot을 제공합니다(기존 데이터와 작성 중인 새 데이터의 "병합"). 따라서 모든 사용자에게 이름과 나이가 있는지 확인하려면 다음을 사용할 수 있습니다.

{
  "rules": {
    "users": {
      "$user": {
        ".read": true,
        ".write": true,
        ".validate": "newData.hasChildren(['name', 'age'])"
      }
    }
  }
}

newData는 기존 데이터와 새 데이터를 병합하므로 "부분" 업데이트에도 올바르게 작동합니다. 예를 들어:

var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();

newData 변수는 기록되는 새 데이터가 없으므로 .read 규칙에서 사용할 수 없습니다. data 를 사용해야 합니다.

RuleDataSnapshot: 메서드

발()

RuleDataSnapshot 에서 기본 값( string , number , boolean 또는 null )을 가져옵니다.

반환 값 : ( String , Number , Boolean , Null ) - 이 RuleDataSnapshot 의 기본 값입니다.

DataSnapshot.val() 과 달리 하위 데이터가 있는 RuleDataSnapshot에서 val() 호출하면 하위 데이터가 포함된 객체가 반환되지 않습니다. 대신 특별한 센티널 값을 반환합니다. 이렇게 하면 규칙이 항상 매우 효율적으로 작동할 수 있습니다.

결과적으로 자식에 액세스하려면 항상 child() 사용해야 합니다(예: data.val data.val().name data.child('name').val() () ).

이 예제에서는 읽는 위치에서 isReadable 하위 항목이 true로 설정된 경우에만 읽기를 허용합니다.

".read": "data.child('isReadable').val() == true"

어린이()

지정된 상대 경로에 있는 위치에 대한 RuleDataSnapshot을 가져옵니다.

인수 : childPath String - 하위 데이터 위치에 대한 상대 경로입니다.

반환 값 : RuleDataSnapshot - 하위 위치에 대한 RuleDataSnapshot입니다 .

상대 경로는 단순한 하위 이름(예: 'fred')이거나 더 깊은 슬래시로 구분된 경로(예: 'fred/name/first')일 수 있습니다. 하위 위치에 데이터가 없으면 빈 RuleDataSnapshot이 반환됩니다.

이 예제에서는 읽는 위치에서 isReadable 하위 항목이 true로 설정된 경우에만 읽기를 허용합니다.

".read": "data.child('isReadable').val() == true"

부모의()

상위 위치에 대한 RuleDataSnapshot을 가져옵니다.

반환 값 : RuleDataSnapshot - 상위 위치에 대한 RuleDataSnapshot입니다 .

이 인스턴스가 Firebase 실시간 데이터베이스의 루트를 참조하는 경우 상위 항목이 없으며 parent() 실패하여 현재 규칙 표현식을 건너뛰게 됩니다(실패로 간주).

이 예에서는 isReadable 형제가 true로 설정된 경우에만 읽기를 허용합니다.

".read": "data.parent().child('isReadable').val() == true"

hasChild(자식 경로)

지정된 하위 항목이 있으면 true를 반환합니다.

인수 : childPath String - 잠재적인 하위 위치에 대한 상대 경로입니다.

반환 값 : 부울 - 지정된 하위 경로에 데이터가 있으면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 하위 "이름"이 포함된 경우에만 데이터 쓰기를 허용합니다.

".validate": "newData.hasChild('name')"

hasChildren([자녀])

자녀의 존재를 확인합니다.

인수 : children Array option - 모두 존재해야 하는 하위 키 배열입니다.

반환 값 : Boolean - (지정된) 자식이 존재하면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

인수가 제공되지 않은 경우 RuleDataSnapshot 에 하위 항목이 있으면 true를 반환합니다. 하위 이름 배열이 제공되면 지정된 하위 항목이 모두 RuleDataSnapshot 에 있는 경우에만 true를 반환합니다.

이 예에서는 하나 이상의 하위 항목이 포함된 경우에만 데이터 쓰기를 허용합니다.

".validate": "newData.hasChildren()"

이 예에서는 "이름" 및 "나이" 하위 항목이 포함된 경우에만 데이터 쓰기를 허용합니다.

".validate": "newData.hasChildren(['name', 'age'])"

존재합니다()

RuleDataSnapshot 에 데이터가 포함되어 있으면 true를 반환합니다.

반환 값 : Boolean - RuleDataSnapshot에 데이터가 포함되어 있으면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

RuleDataSnapshot 에 데이터가 포함된 경우 존재 함수는 true를 반환합니다. data.exists() data.val() != null 과 동일하므로 순전히 편의 함수입니다.

이 예에서는 기존 데이터가 없는 한 이 위치에 쓰기를 허용합니다.

".write": "!data.exists()"

우선순위()

RuleDataSnapshot 에서 데이터의 우선순위를 가져옵니다.

반환 값 : ( String , Number , Null ) - 이 RuleDataSnapshot 에 있는 데이터의 우선순위입니다.

이 예에서는 기록되는 새 데이터에 우선순위가 있음을 확인합니다.

".validate": "newData.getPriority() != null"

isNumber()

RuleDataSnapshot 에 숫자 값이 포함된 경우 true를 반환합니다.

반환 값 : Boolean - 데이터가 숫자이면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 기록되는 새 데이터에 숫자 값이 있는 하위 "연령"이 있는지 확인합니다.

".validate": "newData.child('age').isNumber()"

문자열()

RuleDataSnapshot 에 문자열 값이 포함된 경우 true를 반환합니다.

반환 값 : Boolean - 데이터가 String 이면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 기록되는 새 데이터에 문자열 값이 있는 하위 "이름"이 있는지 확인합니다.

".validate": "newData.child('name').isString()

isBoolean()

RuleDataSnapshot 에 부울 값이 포함된 경우 true를 반환합니다.

반환 값 : Boolean - 데이터가 부울이면 true 이고, 그렇지 Boolean . 그렇지 않으면 false .

이 예에서는 작성되는 새 데이터에 부울 값이 있는 하위 "활성"이 있는지 확인합니다.

".validate": "newData.child('active').isBoolean()"

문자열: 속성

길이

문자열의 길이를 반환합니다.

반환 값 : Number - 문자열의 문자 수입니다.

이 예에서는 문자열이 10자 이상이어야 합니다.

".validate": "newData.isString() && newData.val().length >= 10"

문자열: 메소드

포함(하위 문자열)

문자열에 지정된 하위 문자열이 포함되어 있으면 true를 반환합니다.

인수 : substring String - 찾을 하위 문자열입니다.

반환 값 : Boolean - 문자열에 지정된 하위 문자열이 포함되어 있으면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 데이터가 "@"을 포함하는 문자열이어야 합니다.

".validate": "newData.isString() && newData.val().contains('@')"

시작(하위 문자열)

문자열이 지정된 하위 문자열로 시작하는 경우 true를 반환합니다.

인수 : substring String - 시작 부분에서 찾을 하위 문자열입니다.

반환 값 : Boolean - 문자열에 지정된 하위 문자열이 포함되어 있으면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 auth.token.identifier "internal-"로 시작하는 경우 읽기 액세스를 허용합니다.

".read": "auth.token.identifier.beginsWith('internal-')"

endWith(하위 문자열)

문자열이 지정된 하위 문자열로 끝나는 경우 true를 반환합니다.

인수 : substring String - 끝에서 찾을 하위 문자열입니다.

반환 값 : Boolean - 문자열이 지정된 하위 문자열로 끝나면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

이 예에서는 auth.token.identifier "@company.com"으로 끝나는 경우 읽기 액세스를 허용합니다.

".read": "auth.token.identifier.endsWith('@company.com')"

교체(하위 문자열, 교체)

지정된 하위 문자열의 모든 인스턴스가 지정된 대체 문자열로 대체된 문자열의 복사본을 반환합니다.

인수 : substring String - 찾을 하위 문자열입니다. replacement String - 하위 문자열을 대체할 문자열입니다.

반환 값 : String - 하위 문자열을 대체 문자열로 바꾼 후의 새 문자열입니다.

replace() 메서드는 첫 번째 인스턴스뿐만 아니라 지정된 하위 문자열의 모든 인스턴스를 지정된 대체 문자열로 바꾼다는 점에서 JavaScript replace() 메서드와 약간 다릅니다.

키에는 마침표가 허용되지 않으므로 문자열을 저장하기 전에 마침표로 문자열을 이스케이프해야 합니다. 이에 대한 예는 이메일 주소입니다. /whitelist/ 노드에 허용된 이메일 주소 목록이 있다고 가정합니다.

{
 "user": {
   "$uid": {
     "email": <email>
   }
 },
 "whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
}

이메일이 /whitelist/ 노드에 있는 경우에만 사용자를 추가하도록 허용하는 규칙을 만들 수 있습니다.

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "true",
        ".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
      }
    }
  }
}

toLowerCase()

소문자로 변환된 문자열의 복사본을 반환합니다.

반환 값 : String - 소문자로 변환된 문자열입니다.

이 예에서는 auth.token.identifier 모두 소문자로 /users 아래에 있는 경우 읽기 액세스를 허용합니다.

".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"

to대문자()

대문자로 변환된 문자열의 복사본을 반환합니다.

반환 값 : String - 대문자로 변환된 문자열입니다.

이 예에서는 auth.token.identifier 모두 대문자로 /users 아래에 있는 경우 읽기 액세스를 허용합니다.

".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"

일치(정규식)

문자열이 지정된 정규식 리터럴과 일치하면 true를 반환합니다.

반환 값 : Boolean - 문자열이 정규식 리터럴, regex와 일치하면 true 이고, 그렇지 않으면 false입니다. 그렇지 않으면 false .

전체 규칙 정규식 문서를 참조하세요.

연산자

+ (추가)

변수를 추가하거나 문자열을 연결하는 데 사용됩니다.

다음 예에서는 새 값이 기존 값을 정확히 1만큼 증가시키는지 확인합니다. 이는 카운터를 구현하는 데 유용합니다.

".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"

- (부정 또는 빼기)

규칙 표현식에서 값을 부정하거나 두 값을 빼는 데 사용됩니다.

이 확인 규칙은 새 값이 다음 위치에서 하위 값의 반대인지 확인합니다.

".validate": "newData.val() === -(data.child('quantity').val())"

다음 예에서는 빼기를 사용하여 지난 10분 동안의 메시지만 읽을 수 있도록 합니다.

".read": "newData.child('timestamp').val() > (now - 600000)"

* (곱하기)

규칙 표현식에서 변수를 곱하는 데 사용됩니다.

이 확인 규칙은 새 값이 가격 및 수량(기존 값 2개)의 생산량과 같은지 확인합니다.

".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"

/ (나누다)

규칙 표현식에서 변수를 나누는 데 사용됩니다.

다음 예에서 유효성 검사 규칙은 저장된 데이터가 다른 곳에 저장된 전체 데이터의 평균인지 확인합니다.

".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"

% (계수)

규칙 표현식에서 한 변수를 다른 변수로 나눈 나머지를 찾는 데 사용됩니다.

이 규칙은 짝수만 쓸 수 있는지 확인합니다.

".validate": "newData.val() % 2 === 0"

=== (같음)

규칙 표현식의 두 변수가 동일한 유형과 값을 가지고 있는지 확인하는 데 사용됩니다.

다음 규칙은 === 연산자를 사용하여 사용자 계정 소유자에게만 쓰기 액세스 권한을 부여합니다. 규칙이 true로 평가되려면 사용자의 uid가 키( $user_id )와 정확히 일치해야 합니다.

"users": {
  ".write": "$user_id === auth.uid"
}

!== (같지 않음)

규칙 표현식의 두 변수가 동일하지 않은지 확인하는 데 사용됩니다.

다음 읽기 규칙은 로그인한 사용자만 데이터를 읽을 수 있도록 보장합니다.

".read": "auth !== null"

&& (그리고)

두 피연산자가 모두 true이면 true로 평가됩니다. 규칙 표현식에서 여러 조건을 평가하는 데 사용됩니다.

다음 유효성 검사 규칙은 새 데이터가 100자 미만의 문자열인지 확인합니다.

".validate": "newData.isString() && newData.val().length < 100"

|| (또는)

규칙 표현식의 피연산자 중 하나가 true인 경우 true로 평가됩니다.

이 예에서는 기존 데이터나 새 데이터가 존재하지 않는 한 쓸 수 있습니다. 즉, 데이터를 삭제하거나 생성하는 경우 쓸 수 있지만 데이터를 업데이트하는 경우에는 쓸 수 없습니다.

".write": "!data.exists() || !newData.exists()"

! (아니다)

단일 피연산자가 false인 경우 true로 평가됩니다. 규칙 표현식에서 ! 연산자는 데이터가 특정 위치에 기록되었는지 확인하는 데 자주 사용됩니다.

다음 규칙은 지정된 위치에 데이터가 없는 경우에만 쓰기 액세스를 허용합니다.

".write": "!data.exists()"

> (보다 큼)

규칙 표현식의 값이 다른 값보다 큰지 확인하는 데 사용됩니다.

이 유효성 검사 규칙은 작성 중인 문자열이 빈 문자열이 아닌지 확인합니다.

".validate": "newData.isString() && newData.val().length > 0"

<(보다 작음)

규칙 표현식의 값이 다른 값보다 작은지 확인하는 데 사용됩니다.

이 유효성 검사 규칙은 문자열이 20자 미만인지 확인합니다.

".validate": "newData.isString() && newData.val().length < 20"

>=(보다 크거나 같음)

값이 규칙 표현식의 다른 값보다 크거나 같은지 확인하는 데 사용됩니다.

이 유효성 검사 규칙은 작성 중인 문자열이 빈 문자열이 아닌지 확인합니다.

".validate": "newData.isString() && newData.val().length >= 1"

<=(보다 작거나 같음)

값이 규칙 표현식의 다른 값보다 작거나 같은지 확인하는 데 사용됩니다.

이 유효성 검사 규칙은 향후에 새 데이터를 추가할 수 없도록 보장합니다.

".validate": "newData.val() <= now"

? (삼항 연산자)

조건부 규칙 표현식을 평가하는 데 사용됩니다.

삼항 연산자는 세 개의 피연산자를 사용합니다. ? 앞의 피연산자 조건입니다. 조건이 true로 평가되면 두 번째 피연산자가 평가됩니다. 조건이 false이면 세 번째 피연산자가 평가됩니다.

다음 유효성 검사 규칙의 경우 새 값은 숫자 또는 부울일 수 있습니다. 숫자인 경우 0보다 커야 합니다.

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"