728x90
여기까지 따라오시느라 수고하셨습니다. 코드는 완성되었습니다. 앞서도 언급되었지만, Firebase Realtime Database특성상 권한 설정은 무척 중요합니다. 특히나 웹의 경우는 서버의 주요 로직들이 클라이언트에서 드러나기 때문입니다.
Realtime Database의 기본 권한은 Authentication 인증 받았을 때 읽기와 쓰기 허용입니다.
database.rules.json 파일에 Realtime Database 권한이 입력되어 있습니다. 해당 파일을 배포함으로써 권한 정보를 업데이트할 수 있습니다.
Firebase console 창을 통해서도 권한 룰을 변경할 수 있습니다. Firebase console 화면에서 Database항목 에서 규칙 탭으로 들어가면 권한을 변경할 수 있고, 시뮬레이터로 테스트도 가능합니다.
프로젝트 생성하고 나서 기본 룰은 Authentication 인증 받아야만 읽기와 쓰기가 가능한 룰입니다.
기본적인 rule 유형입니다.
규칙 유형 | |
.read |
사용자가 데이터를 읽을 수 있는 조건을 기술합니다. |
.write |
사용자가 데이터를 쓸 수 있는 조건을 기술합니다. |
.validate |
값의 올바른 형식, 하위 속성을 갖는지 여부 및 데이터 유형을 정의합니다. |
.indexOn |
정렬 및 쿼리를 위해 색인화할 하위 항목을 지정합니다. |
룰과 함께 정의할 때 사용되는 사전 정의된 변수 입니다.
사전 정의된 변수 | |
Linux 기점을 기준으로 하는 현재 시간(밀리초)입니다. SDK의 firebase.database.ServerValue.TIMESTAMP로 생성한 타임스탬프를 검증하는 데 특히 유용합니다. |
|
ID 및 동적 하위 키를 나타내는 데 사용되는 와일드카드 경로입니다. |
|
인증된 사용자의 토큰 페이로드를 나타냅니다. |
제가 적용한 룰입니다.
저도 더 연구해서 더욱 세세하게 권한을 줘야하겠지만, 일단 채팅앱에서 가장 핵심이되는 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 채팅앱 예제가 마무리되었습니다. 부족한점도 많이 있을 듯 합니다. 부족한 점이 보이면 피드백 부탁드립니다~
완성된 소스는 아래의 링크에서 확인 가능합니다.
728x90