Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

Firebase Cloud Storage 보안 규칙의 조건 사용

(가)에이 가이드는 빌드 중포 기지 보안 규칙 언어의 핵심 구문을 배울 클라우드 스토리지에 대한 중포 기지 보안 규칙에 조건을 추가하는 방법을 보여 가이드.

클라우드 스토리지 보안 규칙의 기본 빌딩 블록은 조건이다. 조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. 기본 규칙의 사용 truefalse 조건으로 리터럴은 prefectly 잘 작동합니다. 그러나 Cloud Storage 언어에 대한 Firebase 보안 규칙은 다음과 같은 더 복잡한 조건을 작성할 수 있는 방법을 제공합니다.

  • 사용자 인증 확인
  • 수신 데이터 검증

입증

Cloud Storage용 Firebase 보안 규칙은 Firebase 인증과 통합되어 Cloud Storage에 대한 강력한 사용자 기반 인증을 제공합니다. 이를 통해 Firebase 인증 토큰의 클레임을 기반으로 세분화된 액세스 제어가 가능합니다.

사용자의 응답을 행한다 클라우드 저장소에 대한 요청을 인증하면 request.auth 변수는 사용자로 채워진 uid ( request.auth.uid 잘 중포 기지 인증 JWT (의 청구항만큼) request.auth.token ).

사용자 지정 인증을 사용하는 경우 또한, 추가 요구는 표면화되어 request.auth.token 필드.

인증되지 않은 사용자가 요청을 수행 할 때, request.auth 변수는 null .

이 데이터를 사용하여 인증을 사용하여 파일을 보호하는 몇 가지 일반적인 방법이 있습니다.

  • 공공 : 무시 request.auth
  • 개인 인증 : 확인하는 것이 request.auth 아닌 null
  • 사용자 개인 : 있는지 확인 request.auth.uid 경로에 해당 uid
  • 그룹 비공개: 선택한 클레임과 일치하도록 사용자 지정 토큰의 클레임을 확인하거나 파일 메타데이터를 읽어 메타데이터 필드가 있는지 확인합니다.

공공의

고려하지 않는 모든 규칙 request.auth 상황이 고려 될 수있다 public 는 사용자의 인증 컨텍스트를 고려하지 않기 때문에, 규칙을. 이러한 규칙은 게임 자산, 사운드 파일 또는 기타 정적 콘텐츠와 같은 공개 데이터를 표시하는 데 유용할 수 있습니다.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

인증된 비공개

어떤 경우에는 애플리케이션의 인증된 모든 사용자가 데이터를 볼 수 있지만 인증되지 않은 사용자는 볼 수 없도록 할 수 있습니다. 이후 request.auth 변수가 null 모든 인증되지 않은 사용자를 위해, 당신이해야 할 검사입니다 request.auth 변수가 인증을 요구하기 위해 존재를 :

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

사용자 비공개

지금까지 가장 일반적인 사용 사례 request.auth 업로드 프로필 사진에서 개인 문서를 읽는 : 자신의 파일에 세분화 된 권한을 가진 개별 사용자를 제공하는 것입니다.

클라우드 스토리지에있는 파일은 파일에 대한 전체 "경로"를 가지고 있기 때문에, 그것은 사용자가 제어 파일을 만드는 데 걸리는 모든 (예 : 사용자와 파일 이름 접두어 독특한, 사용자 식별 정보의 조각 uid 확인하실 수 있습니다) 규칙이 평가될 때:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

그룹 비공개

똑같이 일반적인 또 다른 사용 사례는 여러 팀 구성원이 공유 문서에서 공동 작업할 수 있도록 허용하는 것과 같이 개체에 대한 그룹 권한을 허용하는 것입니다. 이를 수행하는 몇 가지 방법이 있습니다.

  • 민트 중포 기지 인증 토큰 정의 즉, (예를 들면 그룹 ID와 같은) 그룹 멤버에 대한 추가 정보를 포함
  • (이러한 그룹 ID 혹은 인증 목록과 같은 그룹 정보를 포함 uid 에서의) 파일 메타

이 데이터가 토큰 또는 파일 메타데이터에 저장되면 규칙 내에서 참조할 수 있습니다.

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

평가 요청

업로드, 다운로드, 메타 데이터 변경 및 삭제는 평가되며 request 클라우드 스토리지로 전송합니다. 사용자 고유 ID와의 중포 기지 인증 페이로드 이외에도 request.auth 전술 한 바와 같이 객체의 request 변수는 요청이 수행되고있는 파일 경로 요청이 수신 될 때, 새로운 포함 resource 값 경우를 요청은 쓰기입니다. HTTP 헤더 및 인증 상태도 포함됩니다.

request 객체는 사용자의 고유 ID와의 중포 기지 인증 페이로드를 포함 request.auth 에 더 설명한다 객체, 사용자 기반 보안 해당 문서의 섹션을.

에서 속성의 전체 목록 request 객체는 아래로 볼 수 있습니다 :

특성 유형 기술
auth 맵<문자열, 문자열> 로그인 한 사용자가 제공하는 경우 uid , 사용자의 고유 한 ID 및 token , 중포 기지 인증 JWT 주장의지도를. 그렇지 않으면 될 것 null .
params 맵<문자열, 문자열> 요청의 쿼리 매개변수가 포함된 맵입니다.
path 통로 path 요청이 수행되는 경로를 나타내는.
resource 맵<문자열, 문자열> 새로운 자원 값은에만 제공 write 요청.
time 타임스탬프 요청이 평가되는 서버 시간을 나타내는 타임스탬프입니다.

자원 평가

규칙을 평가할 때 업로드, 다운로드, 수정 또는 삭제되는 파일의 메타데이터도 평가할 수 있습니다. 이를 통해 특정 콘텐츠 유형의 파일만 업로드하거나 특정 크기보다 큰 파일만 삭제하는 등의 작업을 수행하는 복잡하고 강력한 규칙을 만들 수 있습니다.

클라우드 스토리지에 대한 중포 기지 보안 규칙은에서 파일의 메타 데이터를 제공하는 resource 메타 데이터의 키 / 값 쌍은 클라우드 스토리지 오브젝트의 표면 포함 객체. 이러한 속성에 검사 할 수 readwrite 데이터 무결성을 보장하기 위해 요청.

write (예 : 업로드, 메타 데이터 업데이트, 삭제 등) 요청을 발행 할 때, 이외에 resource 현재 요청 경로에서, 당신은 또한 사용할 수있는 기능이 존재하는 파일의 파일 메타 데이터 포함 개체, request.resource 객체를, 쓰기가 허용되는 경우 기록될 파일 메타데이터의 하위 집합을 포함합니다. 이 두 값을 사용하여 데이터 무결성을 보장하거나 파일 유형 또는 크기와 같은 응용 프로그램 제약 조건을 적용할 수 있습니다.

에서 속성의 전체 목록 resource 객체는 아래로 볼 수 있습니다 :

특성 유형 기술
name 개체의 전체 이름
bucket 이 객체가 있는 버킷의 이름입니다.
generation 정수 Google 클라우드 스토리지 객체 생성 이 객체의.
metageneration 정수 Google 클라우드 스토리지 오브젝트 metageneration 이 객체의.
size 정수 바이트 단위의 개체 크기입니다.
timeCreated 타임스탬프 개체가 생성된 시간을 나타내는 타임스탬프입니다.
updated 타임스탬프 개체가 마지막으로 업데이트된 시간을 나타내는 타임스탬프입니다.
md5Hash 개체의 MD5 해시입니다.
crc32c 개체의 crc32c 해시입니다.
etag 이 개체와 연결된 etag입니다.
contentDisposition 이 개체와 연결된 콘텐츠 처리입니다.
contentEncoding 이 개체와 연결된 콘텐츠 인코딩입니다.
contentLanguage 이 개체와 연결된 콘텐츠 언어입니다.
contentType 이 개체와 연결된 콘텐츠 형식입니다.
metadata 맵<문자열, 문자열> 추가 개발자 지정 사용자 지정 메타데이터의 키/값 쌍입니다.

request.resource 제외이 모두 포함 generation , metageneration , etag , timeCreatedupdated .

데이터 검증

클라우드 스토리지에 대한 중포 기지 보안 규칙은 파일 이름과 경로뿐만 아니라 같은 파일의 메타 데이터 속성의 검증을 시작해, 데이터 유효성 검사에 사용할 수있는 contentTypesize .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

사용자 정의 기능

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

  • 기능은 하나의 포함 할 수 있습니다 return 문을. 추가 논리를 포함할 수 없습니다. 예를 들어 루프를 실행하거나 외부 서비스를 호출할 수 없습니다.
  • 함수는 정의된 범위에서 함수와 변수에 자동으로 액세스할 수 있습니다. 예를 들어, 상기에서 정의 된 함수 service firebase.storage 범위를 갖는 액세스 resource 변수 및 클라우드 경우 FireStore 만, 내장 기능 등 get()exists() .
  • 함수는 다른 함수를 호출할 수 있지만 재귀할 수는 없습니다. 총 호출 스택 깊이는 10으로 제한됩니다.
  • 버전에서 rules2 , 기능은 사용하여 변수를 정의 할 수 있습니다 let 키워드를. 함수는 let 바인딩을 얼마든지 가질 수 있지만 return 문으로 끝나야 합니다.

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

service firebase.storage {
  match /b/{bucket}/o {
    // 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 /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

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

다음 단계

이러한 조건에 대한 논의를 마친 후에는 규칙에 대해 보다 정교하게 이해하고 다음 작업을 수행할 수 있습니다.

핵심 사용 사례를 처리하는 방법과 규칙 개발, 테스트 및 배포를 위한 워크플로를 알아보세요.