이 가이드 는 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
변수가 존재하는지 확인하기 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 | map <문자열, 문자열> | 사용자가 로그인하면 사용자의 고유 ID 인 uid 와 Firebase 인증 JWT 클레임 맵인 token 을 제공합니다. 그렇지 않으면 null 됩니다. |
params | map <문자열, 문자열> | 요청의 쿼리 매개 변수를 포함하는 맵입니다. |
path | 통로 | 요청이 수행되는 path 나타내는 경로입니다. |
resource | map <문자열, 문자열> | write 요청에만있는 새 리소스 값입니다. |
time | 타임 스탬프 | 요청이 평가되는 서버 시간을 나타내는 타임 스탬프입니다. |
자원 평가
규칙을 평가할 때 업로드, 다운로드, 수정 또는 삭제되는 파일의 메타 데이터를 평가할 수도 있습니다. 이를 통해 특정 콘텐츠 유형의 파일 만 업로드하거나 특정 크기보다 큰 파일 만 삭제하도록 허용하는 복잡하고 강력한 규칙을 만들 수 있습니다.
Cloud Storage 용 Firebase 보안 규칙은 Cloud Storage 객체에 표시된 메타 데이터의 키 / 값 쌍을 포함하는 resource
객체에 파일 메타 데이터를 제공합니다. 이러한 속성은 데이터 무결성을 보장하기 위해 read
또는 write
요청에서 검사 할 수 있습니다.
write
요청 (예 : 업로드, 메타 데이터 업데이트 및 삭제)에서 현재 요청 경로에있는 파일에 대한 파일 메타 데이터를 포함하는 resource
개체 외에도 request.resource
개체를 사용할 수 있습니다. 쓰기가 허용되는 경우 기록 할 파일 메타 데이터의 하위 집합을 포함합니다. 이 두 값을 사용하여 데이터 무결성을 보장하거나 파일 유형 또는 크기와 같은 애플리케이션 제약 조건을 적용 할 수 있습니다.
resource
개체의 전체 속성 목록은 아래에서 확인할 수 있습니다.
특성 | 유형 | 기술 |
---|---|---|
name | 끈 | 개체의 전체 이름 |
bucket | 끈 | 이 객체가있는 버킷의 이름입니다. |
generation | int | 이 객체 의 Google Cloud Storage 객체 생성 입니다. |
metageneration | int | 이 객체 의 Google Cloud Storage 객체 메타 생성 입니다. |
size | int | 개체의 크기 (바이트)입니다. |
timeCreated | 타임 스탬프 | 객체가 생성 된 시간을 나타내는 타임 스탬프입니다. |
updated | 타임 스탬프 | 객체가 마지막으로 업데이트 된 시간을 나타내는 타임 스탬프입니다. |
md5Hash | 끈 | 개체의 MD5 해시입니다. |
crc32c | 끈 | 개체의 crc32c 해시입니다. |
etag | 끈 | 이 개체와 연결된 etag입니다. |
contentDisposition | 끈 | 이 개체와 관련된 콘텐츠 처리입니다. |
contentEncoding | 끈 | 이 개체와 관련된 콘텐츠 인코딩입니다. |
contentLanguage | 끈 | 이 개체와 관련된 콘텐츠 언어입니다. |
contentType | 끈 | 이 개체와 관련된 콘텐츠 유형입니다. |
metadata | map <문자열, 문자열> | 추가 개발자 지정 맞춤 메타 데이터의 키 / 값 쌍입니다. |
request.resource
에는 generation
, metageneration
, etag
, timeCreated
및 updated
제외한 모든 항목이 포함 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 보안 규칙이 더 복잡 해짐에 따라 규칙 세트 전체에서 재사용 할 수있는 함수로 조건 세트를 래핑 할 수 있습니다. 보안 규칙은 사용자 지정 함수를 지원합니다. 맞춤 함수의 구문은 자바 스크립트와 약간 비슷하지만 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 보안 규칙에서 함수를 사용하면 규칙이 복잡 해짐에 따라 유지 관리가 쉬워집니다.
다음 단계
이 조건에 대한 논의를 마치면 규칙에 대해보다 정교하게 이해하고 다음을 수행 할 수 있습니다.
핵심 사용 사례를 처리하는 방법을 배우고 규칙 개발, 테스트 및 배포를위한 워크 플로를 학습합니다.
- 일반적인 시나리오 를 다루는 규칙을 작성합니다.
- 안전하지 않은 규칙을 발견하고 피해야하는 상황을 검토하여 지식을 쌓으십시오.
- 규칙 배포에 사용할 수있는 방법을 검토합니다.