Firebase Web 채팅앱 만들기 - 17. Realtime Database 권한 설정

  • Firebase Realtime Database특성상 권한 설정은 무척 중요합니다.
  • 특히나 웹의 경우는 서버의 주요 로직들이 클라이언트에서 드러나기 때문입니다.
  • Realtime Database의 기본 권한은 Authentication 인증 받았을 때 읽기와 쓰기 허용입니다.
  • database.rules.json 파일에 Realtime Database 권한이 입력되어 있습니다.
  • 해당 파일을 배포함으로써 권한 정보를 업데이트할 수 있습니다.
  • Firebase console 창을 통해서도 권한 룰을 변경할 수 있습니다. Firebase console 화면에서 Database항목 에서 규칙 탭으로 들어가면 권한을 변경할 수 있고, 시뮬레이터로 테스트도 가능합니다.

17-1

  • 프로젝트 생성하고 나서 기본 룰은 Authentication 인증 받아야만 읽기와 쓰기가 가능한 룰입니다.
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
  • 기본적인 rule 유형.
규칙 유형
.read
사용자가 데이터를 읽을 수 있는 조건을 기술합니다.
.write
사용자가 데이터를 쓸 수 있는 조건을 기술합니다.
.validate
값의 올바른 형식, 하위 속성을 갖는지 여부 및 데이터 유형을 정의합니다.
.indexOn
정렬 및 쿼리를 위해 색인화할 하위 항목을 지정합니다.
  • 룰과 함께 정의할 때 사용되는 사전 정의된 변수 입니다.
사전 정의된 변수
Linux 기점을 기준으로 하는 현재 시간(밀리초)입니다. SDK의 firebase.database.ServerValue.TIMESTAMP로 생성한 타임스탬프를 검증하는 데 특히 유용합니다.
작업 시도 전에 Firebase 데이터베이스에 존재한 루트 경로를 나타내는 RuleDataSnapshot입니다.
작업 시도 후에 존재할 데이터를 나타내는 RuleDataSnapshot입니다. 새로 기록되는 데이터와 기존 데이터를 포함합니다.
작업 시도 전에 존재한 데이터를 나타내는 RuleDataSnapshot입니다.
ID 및 동적 하위 키를 나타내는 데 사용되는 와일드카드 경로입니다.
인증된 사용자의 토큰 페이로드를 나타냅니다.
  • 예제를 위한 룰
{
  "rules": {
    "FcmId": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    },
    "Users": {
      ".read": "auth != null",
      "$uid": {
        ".read": "auth != null",
        ".write": "$uid === auth.uid"
      }
    },
    "UsersConnection": {
      ".read": "auth != null",
      ".write": "auth != null"
    },
    "Messages": {
      "$roomId" : {
        ".read": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
        ".write": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
        "$msgId" :{
          ".read": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
          ".write": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()"
        }
      }

    },
    "UserRooms" :{
      "$uid":{
        ".read": "$uid === auth.uid",
        "$roomId" :{
          ".read" : "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
          ".write": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()"
        }
      }
    },
    "RoomUsers" :{
      "$roomId":{
        "$uid":{
          ".read": "auth != null",
          ".write": "auth != null"
        }
      }
    }

  }
}
  • 룰 설명 :
    • 일단 채팅앱에서 가장 핵심이되는 Messages 부분은 RoomUsers아래 채팅방에 인원으로 등록되어 있지 않으면 읽기와 쓰기가 금지되어 있습니다.
      ".read": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
       ".write": "root.child('RoomUsers').child($roomId).child(auth.uid).exists()",
    
    • 채팅방 목록에 해당하는 UserRooms는 그 아래 키인 uid는 본인것만 읽을 수 있게 허용되어 있습니다.
      ".read": "$uid === auth.uid",
    
  • 권한 부분은 조금 더 고민이 필요한 부분이 있는 듯 합니다
  • 부족하지만 Firebase 채팅앱 예제가 마무리되었습니다.

  • 완성 소스 :