Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

Firebase 저장소 보안 규칙의 사용 조건

이 가이드 는 Firebase 보안 규칙 언어 가이드 의 핵심 구문을 기반으로 작성되어 Cloud Storage 용 Firebase 보안 규칙에 조건을 추가하는 방법을 보여줍니다.

스토리지 보안 규칙의 기본 구성 요소는 조건 입니다. 조건은 특정 작업의 허용 또는 거부 여부를 결정하는 부울 식입니다. 기본 규칙의 경우 truefalse 리터럴을 조건으로 사용하는 것이 좋습니다. 하지만 Cloud Storage 언어 용 Firebase 보안 규칙을 사용하면 다음을 수행 할 수있는 더 복잡한 조건을 작성할 수 있습니다.

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

입증

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

인증 된 사용자가 Google Cloud Storage에 대해 요청을 수행하면 request.auth 변수가 사용자의 uid ( request.auth.uid )와 Firebase 인증 JWT ( request.auth.token )의 클레임으로 채워집니다.

또한 사용자 지정 인증을 사용하는 경우 request.auth.token 필드에 추가 클레임이 표시됩니다.

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

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

  • 공개 : request.auth 무시
  • 인증 된 비공개 : request.authnull 이 아닌지 확인
  • 사용자 개인 : 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 변수가 존재하는지 확인하기 request.auth .

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

사용자 개인

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

Google Cloud Storage의 파일에는 파일에 대한 전체 '경로'가 있으므로 사용자가 제어하는 ​​파일을 만드는 데 필요한 것은 파일 이름 프리픽스 (예 : 사용자의 uid )에있는 고유 한 사용자 식별 정보의 일부 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)가 포함 된 Firebase 인증 맞춤 토큰 발행
  • 파일 메타 데이터에 그룹 정보 (예 : 그룹 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;
}

평가 요청

업로드, 다운로드, 메타 데이터 변경, 삭제는 Google Cloud Storage로 전송 된 request 사용하여 평가됩니다. 위에서 설명한 것처럼 request.auth 개체의 사용자 고유 ID 및 Firebase 인증 페이로드 외에도 request 변수에는 요청이 수행되는 파일 경로, 요청이 수신 된 시간 및 다음과 같은 경우 새 resource 값이 포함됩니다. 요청이 쓰기입니다. HTTP 헤더 및 인증 상태도 포함됩니다.

request 객체는 또한 request.auth 객체에 사용자의 고유 ID와 Firebase 인증 페이로드를 포함합니다. 이에 대해서는 문서의 사용자 기반 보안 섹션에서 자세히 설명합니다.

request 개체의 전체 속성 목록은 아래에서 확인할 수 있습니다.

특성 유형 기술
auth map <문자열, 문자열> 사용자가 로그인하면 사용자의 고유 ID 인 uid 와 Firebase 인증 JWT 클레임 맵인 token 을 제공합니다. 그렇지 않으면 null 됩니다.
params map <문자열, 문자열> 요청의 쿼리 매개 변수가 포함 된 맵입니다.
path 통로 요청이 수행되는 path 나타내는 경로입니다.
resource map <문자열, 문자열> write 요청에만있는 새 리소스 값입니다.
time 타임 스탬프 요청이 평가되는 서버 시간을 나타내는 타임 스탬프입니다.

자원 평가

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

Cloud Storage 용 Firebase 보안 규칙은 Google Cloud Storage 객체에 표시되는 메타 데이터의 키 / 값 쌍을 포함하는 resource 객체에 파일 메타 데이터를 제공합니다. 이러한 속성은 데이터 무결성을 보장하기 위해 read 또는 write 요청에서 검사 할 수 있습니다.

write 요청 (예 : 업로드, 메타 데이터 업데이트 및 삭제)에서 현재 요청 경로에있는 파일에 대한 파일 메타 데이터를 포함하는 resource 개체 외에도 request.resource 개체를 사용할 수 있습니다. 쓰기가 허용되는 경우 기록 할 파일 메타 데이터의 하위 집합을 포함합니다. 이 두 값을 사용하여 데이터 무결성을 보장하거나 파일 유형 또는 크기와 같은 애플리케이션 제약 조건을 적용 할 수 있습니다.

resource 개체의 전체 속성 목록은 아래에서 확인할 수 있습니다.

특성 유형 기술
name 개체의 전체 이름
bucket 이 객체가있는 버킷의 이름입니다.
generation int 개체GCS 개체 생성 입니다.
metageneration int 개체GCS 개체 메타 생성 입니다.
size int 개체의 크기 (바이트)입니다.
timeCreated 타임 스탬프 객체가 생성 된 시간을 나타내는 타임 스탬프입니다.
updated 타임 스탬프 객체가 마지막으로 업데이트 된 시간을 나타내는 타임 스탬프입니다.
md5Hash 개체의 MD5 해시입니다.
crc32c 개체의 crc32c 해시입니다.
etag 이 개체와 연결된 etag입니다.
contentDisposition 이 개체와 관련된 콘텐츠 처리입니다.
contentEncoding 이 개체와 관련된 콘텐츠 인코딩입니다.
contentLanguage 이 개체와 관련된 콘텐츠 언어입니다.
contentType 이 개체와 관련된 콘텐츠 유형입니다.
metadata map <문자열, 문자열> 추가 개발자 지정 맞춤 메타 데이터의 키 / 값 쌍입니다.

request.resource 에는 generation , metageneration , etag , timeCreatedupdated 제외한 모든 항목이 포함 updated .

데이터 유효성 검사

Cloud Storage 용 Firebase 보안 규칙은 파일 이름 및 경로뿐만 아니라 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 보안 규칙이 더 복잡 해짐에 따라 여러 규칙 세트에서 재사용 할 수있는 함수로 조건 세트를 래핑 할 수 있습니다. 보안 규칙은 사용자 지정 함수를 지원합니다. 맞춤 함수의 구문은 자바 스크립트와 약간 비슷하지만 Firebase 보안 규칙 함수는 몇 가지 중요한 제한이있는 도메인 별 언어로 작성됩니다.

  • 함수는 하나의 return 문만 포함 할 수 있습니다. 추가 논리를 포함 할 수 없습니다. 예를 들어 루프를 실행하거나 외부 서비스를 호출 할 수 없습니다.
  • 함수는 정의 된 범위에서 함수와 변수에 자동으로 액세스 할 수 있습니다. 예를 들어 service firebase.storage 범위 내에 정의 된 함수는 resource 변수에 액세스 할 수 있으며 Cloud Firestore의 경우에만 get()exists() 와 같은 내장 함수에 액세스 할 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 보안 규칙에서 함수를 사용하면 규칙이 복잡 해짐에 따라 유지 관리가 쉬워집니다.

다음 단계

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

핵심 사용 사례를 처리하는 방법과 규칙 개발, 테스트 및 배포를위한 워크 플로를 학습합니다.