이 가이드 는 Firebase 보안 규칙 언어 가이드의 핵심 구문 학습 을 기반으로 하여 Cloud Storage용 Firebase 보안 규칙에 조건을 추가하는 방법을 보여줍니다.
Cloud Storage 보안 규칙의 기본 구성 요소는 조건 입니다. 조건은 특정 작업을 허용할지 거부할지 여부를 결정하는 부울 식입니다. 기본 규칙의 경우 true
및 false
리터럴을 조건으로 사용하면 완벽하게 작동합니다. 그러나 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.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
의 가장 일반적인 사용 사례는 프로필 사진 업로드에서 개인 문서 읽기에 이르기까지 개별 사용자에게 파일에 대한 세분화된 권한을 제공하는 것입니다.
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
, timeCreated
및 updated
를 제외하고 이 모든 것이 포함되어 있습니다.
데이터 검증
Cloud Storage용 Firebase 보안 규칙은 파일 이름 및 경로는 물론 contentType
및 size
와 같은 파일 메타데이터 속성의 유효성 검사를 비롯한 데이터 유효성 검사에도 사용할 수 있습니다.
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 보안 규칙에서 함수를 사용하면 규칙이 복잡해짐에 따라 유지 관리가 더 쉬워집니다.
다음 단계
이 조건에 대한 논의를 마친 후에는 규칙에 대해 보다 정교하게 이해하게 되었으며 다음을 수행할 준비가 되었습니다.
핵심 사용 사례를 처리하는 방법과 규칙 개발, 테스트 및 배포를 위한 워크플로를 알아보세요.
- 일반적인 시나리오 를 다루는 규칙을 작성하십시오.
- 안전하지 않은 규칙을 찾아 피해야 하는 상황을 검토하여 지식을 기반으로 합니다.
- Cloud Storage 에뮬레이터 및 전용 보안 규칙 테스트 라이브러리 를 사용하여 규칙을 테스트합니다.
- 규칙 배포 에 사용할 수 있는 방법을 검토합니다.