Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

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

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

Cloud Storage 보안 규칙의 기본 구성 요소는 조건 입니다. 조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. 기본 규칙의 경우 truefalse 리터럴을 조건으로 사용하면 완벽하게 작동합니다. 그러나 Cloud Storage 언어에 대한 Firebase 보안 규칙은 다음과 같은 더 복잡한 조건을 작성할 수 있는 방법을 제공합니다.

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

입증

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

인증된 사용자가 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 변수가 존재하는지 확인하기만 하면 됩니다.

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

사용자 비공개

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

Cloud Storage의 파일에는 파일에 대한 전체 '경로'가 있으므로 사용자가 제어하는 ​​파일을 만드는 데 필요한 것은 확인할 수 있는 파일 이름 접두사(예: 사용자의 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;
}

평가 요청

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

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

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

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

자원 평가

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

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

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

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

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

request.resource 에는 generation , metageneration , etag , timeCreatedupdated 를 제외하고 이 모든 것이 포함되어 있습니다.

Cloud Firestore로 향상

Cloud Firestore의 문서에 액세스하여 다른 승인 기준을 평가할 수 있습니다.

firestore.get()firestore.exists() 함수를 사용하여 보안 규칙은 Cloud Firestore의 문서에 대해 수신 요청을 평가할 수 있습니다. firestore.get()firestore.exists() 함수는 모두 완전히 지정된 문서 경로를 예상합니다. 변수를 사용하여 firestore.get()firestore.exists() 에 대한 경로를 구성할 때 $(variable) 구문을 사용하여 변수를 명시적으로 이스케이프해야 합니다.

아래 예에서 파일에 대한 읽기 액세스를 특정 클럽의 회원인 사용자로 제한하는 규칙을 볼 수 있습니다.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships
    }
  }
}
다음 예에서는 사용자의 친구만 사진을 볼 수 있습니다.
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id))
    }
  }
}

이러한 Cloud Firestore 기능을 사용하는 첫 번째 Cloud Storage 보안 규칙을 만들고 저장하면 Firebase 콘솔 또는 Firebase CLI에 두 제품을 연결할 수 있는 권한을 활성화하라는 메시지가 표시됩니다.

Firebase 보안 규칙 관리 및 배포 에 설명된 대로 IAM 역할을 제거하여 기능을 비활성화할 수 있습니다.

데이터 검증

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

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

다음 단계

이러한 조건에 대한 논의를 마친 후에는 규칙에 대해 보다 정교하게 이해하게 되었으며 다음을 수행할 준비가 되었습니다.

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