- Firebase Realtime Database특성상 권한 설정은 무척 중요합니다.
- 특히나 웹의 경우는 서버의 주요 로직들이 클라이언트에서 드러나기 때문입니다.
- Realtime Database의 기본 권한은 Authentication 인증 받았을 때 읽기와 쓰기 허용입니다.
- database.rules.json 파일에 Realtime Database 권한이 입력되어 있습니다.
- 해당 파일을 배포함으로써 권한 정보를 업데이트할 수 있습니다.
- Firebase console 창을 통해서도 권한 룰을 변경할 수 있습니다. Firebase console 화면에서 Database항목 에서 규칙 탭으로 들어가면 권한을 변경할 수 있고, 시뮬레이터로 테스트도 가능합니다.
- 프로젝트 생성하고 나서 기본 룰은 Authentication 인증 받아야만 읽기와 쓰기가 가능한 룰입니다.
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
- 기본적인 rule 유형.
규칙 유형 | |
.read |
사용자가 데이터를 읽을 수 있는 조건을 기술합니다. |
.write |
사용자가 데이터를 쓸 수 있는 조건을 기술합니다. |
.validate |
값의 올바른 형식, 하위 속성을 갖는지 여부 및 데이터 유형을 정의합니다. |
.indexOn |
정렬 및 쿼리를 위해 색인화할 하위 항목을 지정합니다. |
- 룰과 함께 정의할 때 사용되는 사전 정의된 변수 입니다.
사전 정의된 변수 | |
Linux 기점을 기준으로 하는 현재 시간(밀리초)입니다. SDK의 firebase.database.ServerValue.TIMESTAMP로 생성한 타임스탬프를 검증하는 데 특히 유용합니다. |
|
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 채팅앱 예제가 마무리되었습니다.
- 완성 소스 :