본문 바로가기
공허의 유산/사상의 도구

[Firebase Codelab 샘플] 06. 접근 권한 설정

by 바른생활머시마 2023. 5. 9.
728x90
반응형

앞에서는 텍스트 채팅에 더하여 이미지를 대화에 올리기 위해 파일을 Cloud Storage에 올려 사용하는 방법을 살펴 보았고, 알림 메세지를 보내기 위해 FCM을 이용하는 방법을 알아보았습니다.

https://learn-and-give.tistory.com/107

 

[Firebase Codelab 샘플] 05. 이미지 메세지와 알림 보내기

앞에서 Firebase에서 제공하는 DB인 Cloud Firestore에 메세지 데이터를 저장하고 읽어와서 기본적인 채팅 기능을 구현하였습니다. https://learn-and-give.tistory.com/106 [Firebase Codelab 샘플] 04. Cloud Firestore에 메

learn-and-give.tistory.com

 

이번에는 이 예제에서 사용한 DB와 Storage의 접근 권한 제어 방법을 알아 볼 것 입니다.

실상 두 개의 시스템 모두 권한 설정 방식은 거의 동일합니다.

 

 

Cloud Firestore의 권한

 

DB의 접근 권한을 설정합니다.

먼저, Firebase console에서 설정하는 방법입니다.

규칙 탭을 선택 합니다.

 

아래는 codelab에 쓰여져 있는 기본값인데 모두 읽고 쓸 수 있는 설정입니다. 

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

그런데 실제로 프로젝트 콘솔의 내용은 조금 다른데요, 아마도 개발모드로 시작해서 권한 설정을 안한 상태로 상용 오픈을 해버리는 경우가 있어서 이런 조치를 한 것이 아닐까 싶네요.

 

그런데, 왜 모든 권한이 주어져 있게 되었느냐????

프로젝트 만들 때 개발모드, 상용모드 선택 시 개발모드를 선택했기 때문이죠.

이 내용은 콘솔에서도 수정 할 수 있고, 로컬에서도 수정 할 수 있는데, 먼저 콘솔에서 수정 해 보겠습니다.

 

입력 된 내용이 보이는 곳에서 바로 수정 가능한데, 수정을 하면 상단에 '게시'/ '취소' 버튼이 나타납니다. 수정 다 하고 나면 게시를 눌러주면 됩니다.

 



local의 설정하는 것은 그 역할을 하는 파일에 똑같은 내용을 넣어주는 것인데, firestore.rules라는 파일이며 샘플 프로젝트에는 그 파일이 없습니다. 저는 다운로드 받은 코드들에서 완성 된 결과물이 있는 web이라는 폴더에서 해당 파일을 찾아 web start 폴더에 붙여 넣은 뒤(파일 이름이 틀리지 않도록), 내용을 수정하였습니다. 그냥 저 파일 이름으로 그냥 만들어도 될 것 같습니다.

 로컬에서 수정을 했으면, 그 내용을 서버에 반영을 해줘야 하죠.

그것은 deploy 과정을 통해 처리 됩니다.

Warning이 나왔는데요,

 

로컬 파일에 제가 복사 해 넣을 때, 가장 위에 있는 버젼 줄은 빼고 아래 내용만 넣고 실행을 했을 때 발생 했었어요. 버젼 체크도 하나봐요. 콘솔과 똑같은 내용을 넣고 deploy 해주면 warning이 나타나지 않았습니다. 


권한 내용도 잠깐 살펴볼까요?

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    // Messages:
    //   - Anyone can read.
    //   - Authenticated users can add and edit messages.
    //   - Validation: Check name is same as auth token and text length below 300 char or that imageUrl is a URL.
    //   - Deletes are not allowed.
    match /messages/{messageId} {
      allow read;
      allow create, update: if request.auth != null
                    && request.resource.data.name == request.auth.token.name
                    && (request.resource.data.text is string
                      && request.resource.data.text.size() <= 300
                      || request.resource.data.imageUrl is string
                      && request.resource.data.imageUrl.matches('https?://.*'));
      allow delete: if false;
    }
    // FCM Tokens:
    //   - Anyone can write their token.
    //   - Reading list of tokens is not allowed.
    match /fcmTokens/{token} {
      allow read: if false;
      allow write;
    }
  }
}

권한 설정 파일의 버젼은 2이고,

메세지의 데이터들에 대해서는 모두 읽을 수 있고,  사용자 로그인이 되어 있고, 이러저러한 조건을 만족하면 생성과 수정이 가능하며, 삭제는 불가능하네요.

FCM 데이터는 읽을 수는 없고, 쓸 수만 있네요.

 

 

 

Cloud Storage 보안 규칙

 

DB말고 파일을 쓰고 읽는 Storage에도 DB와 거의 같은 방식으로 권한을 설정 할 수 있습니다.

 이 역시 콘솔에서 설정 가능한데, 콘솔의 UI나 작동 방식은 똑같습니다.

기본 값은 아래와 같이 되어 있고,

권한 설정 코드는 아래와 같습니다.

rules_version = '2';

// Returns true if the uploaded file is an image and its size is below the given number of MB.
function isImageBelowMaxSize(maxSizeMB) {
  return request.resource.size < maxSizeMB * 1024 * 1024
      && request.resource.contentType.matches('image/.*');
}

service firebase.storage {
  match /b/{bucket}/o {
    match /{userId}/{messageId}/{fileName} {
      allow write: if request.auth != null && request.auth.uid == userId && isImageBelowMaxSize(5);
      allow read;
    }
  }
}

내용을 보면....

로그인을 했고, 자신의 ID로 된 폴더에 5MB이하의 이미지를 올릴 수 있게 되어 있습니다. 이 내용을 콘솔에서 입력하고 게시합니다.

마찬가지로, 로컬에서 권한 파일을 작성하여 등록하는 것도 가능하죠. 

대신, 파일 이름이 storage.rules라는 것이 다른 점이죠.

DB와 다르게 한가지 처리를 더 해줘야 하는데, firebase와 관련 된 설정이 저장 된 firebase.json이라는 파일에 storage의 권한 체크를 이 파일을 참조해서 하라고 설정 해 줘야 합니다.

 

그리고 배포를 해보면,

error를 체크한다는 뜻이지 에러가 있다는 뜻이 아니니 안심.

서비스가 복잡하지 않고, 사용자가 많지 않을 때는 권한이 문제가 되지 않는데, 다양한 사용자들의 요구와 종류, 공유하고자 하는 데이터의 형태가 복잡해지면 점점 설정이 복잡 해 질 것입니다. 이렇게 분야별로 별도로 분리 된 설정을 사용하는 것이 장점이 될 수 있겠네요. 뭐 요즘이야 같은 파일을 여러 사람이 동시 작업을 하는 것이 흔한 일이라 하나의 문서에 있어도 별 문제가 되지 않겠네요.

 

다음에는 성능 데이터 수집과 웹호스팅을 통해 배포하는 방법을 살펴보겠습니다.

728x90
반응형

댓글