Firebase Codelab : 12. 데이터 보안
Firebase github : View Source
firebase 보안 규칙을 바꾸고 배포하는 방법은 2가지가 있다고 한다.
(1) [ 구글 firestore console \ Cloud Firebase \ 빌드 \ Firestor Database \ 규칙 ] 에서 바꾸고 '게시' 버튼으로 배포.
(2) [ VS Code \ freindlyeats-web \ vanilla-js \ firestore.rules ] 에서 바꾸고 명령어 CLI로 배포.
일단 배포하기 전에! 보안규칙 문법이 뭔지 잘 모르겠다. 또 공식 문서 보면 된다.
참고 문헌
규칙 버전은 2.
서비스 클라우드.firestore {
// key의 값과 같은지 결정한다?
// 요청 전과 후에
함수(key를 인자로 받는) {
리소스.데이터 안에 key가 있고
&& 요청.리소스.데이터 안의 key가 있고
&& (리소스.데이터[key]의 값이 == 요청.리소스.데이터[key]의 값과 같다면)
리턴한다. ( boolean true를? 만약 리소스.데이터에 key 없고, 요청.리소스.데이터에 key 없고, 값도 같지 않다면 false겠지?)
}
}
rules_version = '2';
service cloud.firestore {
// Determine if the value of the field "key" is the same
// before and after the request.
function unchanged(key) {
return (key in resource.data)
&& (key in request.resource.data)
&& (resource.data[key] == request.resource.data[key]);
}
}
(뭔 함수진 모르겠지만 match 하란 거겠지)
match /db들 중에서/{니가 연결한 db}/문서들 {
// 레스토랑들이면:
// - 인증된 사용자만이 읽을 수 있게?
// - 인증된 사용자만이 입력/수정할 수 있게? (데모 목적으로만?)
// - 수정은 가능한데 아직 아무런 필드가 없고 변경된 이름이 없을 때만?
// - 삭제는 안된다.(고정)
match /레스토랑들/{레스토랑Id각각} {
읽기 가능여부 : 요청.권한이 null이 아닐 때만 가능.
입력 가능여부 : 요청.권한이 null이 아닐 때만 가능.
수정 가능여부 : 요청.권한이 null이 아니고 && (요청.리소스.데이터.key들이 == 리소스.데이터.key들과 같고) && "name"이 안 바뀌었으면?
match /databases/{database}/documents {
// Restaurants:
// - Authenticated user can read
// - Authenticated user can create/update (for demo purposes only)
// - Updates are allowed if no fields are added and name is unchanged
// - Deletes are not allowed (default)
match /restaurants/{restaurantId} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null
&& (request.resource.data.keys() == resource.data.keys())
&& unchanged("name");
// Ratings:
// - Authenticated user can read
// - Authenticated user can create if userId matches
// - Deletes and updates are not allowed (default)
match /ratings/{ratingId} {
allow read: if request.auth != null;
allow create: if request.auth != null
&& request.resource.data.userId == request.auth.uid;
}
}
}
// 리뷰들 :
// - 인증된 사용자만이 읽을 수 있음.
// - 인증된 사용자만이 userId가 일치할 때만 입력할 수 있음.
// - 삭제수정은 안됨(고정)
match /ratings/{리뷰Id} {
읽기 가능여부 : 요청.권한 null이 아니면 가능.
입력 가능여부 : 요청.권한 null이 아니고 && 요청.리소스.데이터.userId가 == 요청.인증.uid와 같으면 가능.
}
레스토랑을 만들 때 권한과
리뷰 작성 권한에 대한 조건들을 부여했다.
기본적으로 '레스토랑' 삭제도 안되고, '리뷰' 삭제도 안되고...
수정도 안되고... 그런 설정인 듯.
(1) [ 구글 \ Cloud Firebase \ 빌드 \ Firestor Database \ 규칙 ]
크롬 브라우저에서 본인 구글 계정 로그인하고 Firebase 로 이동.
좌측 사이드바 '빌드' \ Firestore Database \ 상단 메뉴 '규칙' \ Codelab의 소스 그대로 복붙. \ '게시' 버튼을 누르면 배포 완료.
=> 만약 이 반영된 '보안 규칙'을 프로젝트에서 파일로 보려면
'freindlyeats-web \ vanilla-js \ firestore.rules' 에서 확인할 수 있다.
(2) [ VS Code \ freindlyeats-web \ vanilla-js \ firestore.rules ]
로컬에 클론해서 받았던 'friendlyeats-web' 경로에서 vs code 실행.
'freindlyeats-web \ vanilla-js \ firestore.rules' 열기
Codelab의 소스 그대로 복붙하여 저장.
VS Code \ Terminal \ New Terminal \ 아래 커맨드로 배포.
friendlyeats-web/vanilla-js> $ firebase deploy --only firestore:rules
*a. 근데 (2) firestore.rules 파일에서 수정하여 배포하고
(1)에서 다시 수정해서 재배포하면, firestore.rules에선 수정된게 보이지 않는다. 가져오는 건 어떻게 하는거지?
*b. '보안 규칙' 수정해서 배포야 그렇다 치고,
이 보안 규칙 대로 서비스가 돌아가고 있는 건 어떻게 확인하지?
*a. 에 대한 궁금증은 왠지 명령어로 Cloud 상의 데이터를 가져올 수 있을 것 같아서 검색해본다.
참고문헌
ㄴ Firebase 프로젝트 초기화
참고: Firebase 서비스에 firebase init 명령어를 다시 실행하면 firebase.json 파일의 해당 섹션을 서비스의 기본 구성으로 다시 덮어쓰게 됩니다.
=> 해당 커맨드를 실행하면, firebase.json 뿐만 아니라 firebase.rules도 덮어쓸지 물어본다.
명령어, 커맨드, CLI에 빠삭하지 않고 검색해도 못 찾겠어서 이게 정답인진 모르겠다. 혹시 아는 분이 있으면 댓글 부탁드립니다...
- '초기화' 순서 -
1. firestore.rules 가 있는 경로로 이동한다.
friendlyeats-web/vanilla-js> $ pwd
/Users/user1/Firebase/friendlyeats-web/vanilla-js
절대 'friendlyeats-web' 경로가 아님!
2. Firebase 프로젝트 초기화
일단 명령어는 아래다.
friendlyeats-web/vanilla-js> $ firebase init firestore
공식 문서에 firestore가 아닌 database도 있었는데 지금은 꼭! 'firestore'로 해야한다.
명령어 시도를 많이 했더니 이상한거로 덮어씌어져버린, 초기화 전의 로컬 프로젝트 'firestore.rules'.
초기화 명령어 실행.
이미 파일이 있는데 덮어쓸지.
색인 설정
색인 파일도 이미 있는데 덮어쓸지
초기화한다... 완료!
Cloud Firestore Console에서 수정하고 '게시'해서 배포했던 게
로컬 프로젝트의 'firebase.rules' 파일로도 잘 확인된다. 해당 파일만 초기화하거나 가져오는 옵션 키워드가 없나 찾아봤지만 포기.
# 그 외 이거 명령어 찾아보려고 이것저것 시도하다 뭔가 출력된 명령어들.
friendlyeats-web/vanilla-js> $ firebase projects:list
* b. 테스트는 어떻게 해야할까?
이건 수정, 삭제 함수를 구현하고나서 테스트할 수 있는 듯하다. 오케이~.
아니면, RESTful API라서 curl PUT, DELETE 함수로 시도도 해볼 수 있을 것 같지만 PASS.
'─── Toy Project > Firebase - FriendlyEats' 카테고리의 다른 글
13. 결론 (0) | 2024.10.19 |
---|---|
11. 트랜잭션으로 데이터 쓰기 (0) | 2024.10.12 |
10. 색인 배포 (0) | 2024.10.11 |
9. 데이터 정렬 및 필터링 (0) | 2024.10.11 |
8-half. FirendlyEats 소스 분석 (0) | 2024.10.03 |