Cloud Storage용 Firebase 보안 규칙 언어의 핵심 구문 알아보기

Cloud Storage용 Firebase 보안 규칙을 사용하면 Cloud Storage 버킷에 저장된 객체에 대한 액세스를 제어할 수 있습니다. 유연한 규칙 구문을 사용하면 Cloud Storage 버킷에 대한 모든 쓰기에서 특정 파일에 대한 작업에 이르기까지 모든 작업을 제어하는 ​​규칙을 만들 수 있습니다.

이 가이드에서는 완전한 규칙 집합을 만들기 위한 Cloud Storage 보안 규칙의 기본 구문과 구조를 설명합니다.

서비스 및 데이터베이스 선언

Cloud Storage에 대한 Firebase 보안 규칙은 항상 다음 선언으로 시작합니다.

service firebase.storage {
    // ...
}

service firebase.storage 선언은 클라우드 경우 FireStore 같은 다른 제품에 대한 클라우드 스토리지 보안 규칙과 규칙 간의 충돌을 방지 클라우드 스토리지에 대한 규칙을 스코프.

기본 읽기/쓰기 규칙

기본 규칙은 구성 match 클라우드 스토리지 버킷, 파일 이름을 지정하는 매치 문을 식별 문 및이 allow 지정된 데이터를 읽고하는 것은 허용 될 때 식을 자세히. allow 식이 액세스하거나 허용 또는 거부되고있는 접근 방법 관련 (예를 들어, 읽기, 쓰기) 및 조건을 지정합니다.

당신의 기본 규칙 집합에서 첫 번째 match 문은 사용 {bucket} 규칙 프로젝트에서 모든 버킷에 적용 나타 내기 위해 와일드 카드 표현식입니다. 다음 섹션에서 와일드카드 일치의 개념에 대해 더 논의할 것입니다.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

모든 match 문은 파일을 가리킵니다. 매치 문에서와 같이 특정 파일을 가리킬 수 있습니다 match /images/profilePhoto.png .

와일드카드 일치

하나의 파일을 가리키는에 additiont에서, 규칙과 같이 슬래시를 포함하여 이름에 특정 문자열 접두어, 어떤 파일을 가리 키도록 와일드 카드를 사용할 수 match /images/{imageId} .

위의 예에서, 경기 문은 사용 {imageId} 와일드 카드 구문을. 이 수단 규칙은 어떤 파일에 적용 /images/ 와 같은 이름의 시작에 /images/profilePhoto.png 또는 /images/croppedProfilePhoto.png . (가) 때 allow 경기 문에 표현식 평가의 imageId 변수는 다음과 같은 이미지 파일 이름에 해결할 수 profilePhoto.png 또는 croppedProfilePhoto.png .

와일드 카드 변수는 내부에서 참조 할 수있는 match 파일 이름이나 경로 인증을 제공 :

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

계층적 데이터

이전에 말했듯이 Cloud Storage 버킷에는 계층 구조가 없습니다. 그러나 파일 이름에 슬래시를 포함하는 파일 명명 규칙을 사용하여 중첩된 일련의 디렉터리 및 하위 디렉터리처럼 보이는 구조를 모방할 수 있습니다. Firebase 보안 규칙이 이러한 파일 이름과 상호 작용하는 방식을 이해하는 것이 중요합니다.

모든 시작의 이름을 가진 파일의 일련의 상황을 고려 /images/ 줄기를. 온 정의 된 액세스 제어 있도록 중포 기지 보안 규칙 만 일치하는 파일 이름에 적용 /images/ 에 적용되지 않는 줄기 /mp3s/ 줄기. 대신 다른 파일 이름 패턴과 일치하는 명시적 규칙을 작성하십시오.

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

중첩되면 match 문을 내부의 경로 match 문은 항상 외부의 경로에 추가됩니다 match 문. 따라서 다음 두 규칙 집합은 동일합니다.

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

재귀 일치 와일드카드

파일명의 끝과 일치 리턴 스트링, 다중 세그먼트 와일드 카드가 추가로 더 복잡한 매칭으로 선언 될 수 와일드 카드 이외에 =** 같은 와일드 이름 {path=**} :

// Partial match for files that start with "images"
match /images {

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

여러 규칙이 파일과 일치하는 경우, 결과는이다 OR 모든 규칙 평가의 결과. 파일에 evalutes에 일치하는 규칙이있는 경우 즉, true , 결과는 true .

어느 경우 위의 규칙에서 파일 "이미지 / profilePhoto.png는"읽을 수있는 condition 또는 other_condition 결과에만 적용됩니다 true로 평가 파일 "12345 / profilePhoto.png 이미지 / 사용자 / 사용자가"하면서, other_condition .

Cloud Storage 보안 규칙은 계단식으로 적용되지 않으며 요청 경로가 지정된 규칙이 있는 경로와 일치할 때만 규칙이 평가됩니다.

버전 1

Firebase 보안 규칙은 기본적으로 버전 1을 사용합니다. 버전 1에서 재귀 와일드카드는 0개 이상의 요소가 아닌 하나 이상의 파일 이름 요소와 일치합니다. 따라서, match /images/{filenamePrefixWildcard}/{imageFilename=**} /images/profilePics/profile.png 같은 파일 이름을 일치하지만 /images/badge.png 없습니다. 사용 /images/{imagePrefixorFilename=**} 대신.

재귀 와일드카드는 일치 문의 끝에 와야 합니다.

더 강력한 기능을 사용하려면 버전 2를 사용하는 것이 좋습니다.

버전 2

Firebase 보안 규칙 버전 2에서 재귀 와일드 카드는 0개 이상의 경로 항목과 일치합니다. 따라서 /images/{filenamePrefixWildcard}/{imageFilename=**} 일치는 /images/profilePics/profile.png 및 /images/badge.png을는 파일 이름.

당신은 선택-에 있어야 버전 2에 추가하여 rules_version = '2'; 보안 규칙 상단:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

매치 문당 최대 하나의 재귀 와일드카드를 가질 수 있지만 버전 2에서는 이 와일드카드를 매치 문의 아무 곳에나 배치할 수 있습니다. 예를 들어:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

세분화된 작업

일부 상황에서는 분해하는 것이 유용 readwrite 더 세부적인 운영에. 예를 들어 앱에서 파일 삭제와 파일 생성에 대해 다른 조건을 적용하려고 할 수 있습니다.

read 동작은으로 나눌 수 있습니다 getlist .

write 규칙으로 나눌 수 있습니다 create , updatedelete :

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single document read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to nonexistent files
      allow create: if <condition>;

      // Applies to updates to file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

겹치는 일치 문

파일 이름이 하나 이상 일치하는 것이 가능 match 문을. 다중이 경우에 allow 표현이 요청과 일치, 액세스는 조건이있는 경우 허용되는 true :

service firebase.storage {
  match b/{bucket}/o {
    // Matches any filename containing string '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches all filenames containing string `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

위의 예에서, 모든 읽기 및 문자열로 파일에 기록 /images/ 두 번째 규칙은 항상 있기 때문에 어디서든 파일 이름에 허용되는 true 첫 번째 규칙은 항상 비록 false .

규칙은 필터가 아닙니다.

데이터를 보호하고 파일 작업을 수행하기 시작하면 보안 규칙은 필터가 아님을 명심하십시오. 파일 이름 패턴과 일치하는 파일 집합에 대해 작업을 수행할 수 없으며 Cloud Storage는 현재 클라이언트에 액세스 권한이 있는 파일에만 액세스할 것으로 예상합니다.

예를 들어 다음 보안 규칙을 사용합니다.

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

거부 : 결과 집합 파일을 포함 할 수 있기 때문에이 규칙은 다음과 같은 요청을 거부 contentType 아닌 image/png :

편물
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Cloud Storage 보안 규칙의 규칙은 잠재적인 결과에 대해 각 쿼리를 평가하고 클라이언트에게 읽기 권한이 없는 파일을 반환할 수 있는 경우 요청에 실패합니다. 액세스 요청은 규칙에서 설정한 제약 조건을 따라야 합니다.

다음 단계

Cloud Storage용 Firebase 보안 규칙에 대한 이해를 심화할 수 있습니다.

  • 규칙 언어, 동적의 다음 주요 개념을 알아 조건 , 규칙 체크 사용자 인증을하자, 기존 및 수신 데이터를 비교, 입력 데이터의 유효성을 검사, 그리고 더.

  • 일반적인 보안 사용 사례 및 검토 중포 기지 보안 규칙 정의 주소 그 것을 .

Cloud Storage와 관련된 Firebase 보안 규칙 사용 사례를 탐색할 수 있습니다.