사용자 데이터 보안 설정

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.authnull이므로 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;
}

전체 예

다음은 일반적인 4가지 유형의 인증 제한 방법을 간단히 보여 주는 예입니다.

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Anyone can view any image (no auth, publicly readable)
      match /{allImages=**} {
        allow read;
      }

      // Only authenticated users can write to "public" images
      match /public/{imageId} {
        allow write: if request.auth != null;
      }

      // Only an individual user can write to "their" images
      match /{userId}/{imageId} {
        allow write: if request.auth.uid == userId;
      }

      // Allow a "group" of users to read/write to shared images
      // An owner metadata property on the object contains the groupId for reads
      // A custom token has been minted with a groupId property for writes
      match /{groupId}/{imageId} {
        allow read: if resource.metadata.owner == request.auth.token.groupId;
        allow write: if request.auth.token.groupId == groupId;
      }
    }
  }
}

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.