티스토리 뷰






여기까지 따라오시느라 수고하셨습니다. 코드는 완성되었습니다.  앞서도 언급되었지만, 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로 생성한 타임스탬프를 검증하는 데 특히 유용합니다.
작업 시도 전에 Firebase 데이터베이스에 존재한 루트 경로를 나타내는 RuleDataSnapshot입니다.
작업 시도 후에 존재할 데이터를 나타내는 RuleDataSnapshot입니다. 새로 기록되는 데이터와 기존 데이터를 포함합니다.
작업 시도 전에 존재한 데이터를 나타내는 RuleDataSnapshot입니다.
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 채팅앱 예제가 마무리되었습니다. 부족한점도 많이 있을 듯 합니다. 부족한 점이 보이면 피드백 부탁드립니다~

완성된 소스는 아래의 링크에서 확인 가능합니다.  






  1. 예제 소개
  2. Firebase 설정하기
  3. Hosting을 활용한 프로젝트 준비 작업
  4. Authentication을 이용한 유저 가입 및 로그인 구현하기
  5. Realtime Database를 이용한 채팅기능 구현 - Reatime Database 특징 및 데이터 구조
  6. Realtime Database를 이용한 채팅기능 구현 - 유저데이터 저장하기
  7. Realtime Database를 이용한 채팅기능 구현 - 유저리스팅 화면
  8. Realtime Database를 이용한 채팅기능 구현 - 채팅화면 및 채팅메세지 리스팅
  9. Realtime Database를 이용한 채팅기능 구현 - 채팅메세지 전송기능
  10. Realtime Database를 이용한 채팅기능 구현 - 채팅방 리스팅화면
  11. Realtime Database를 이용한 채팅기능 구현 - 채팅방 초대 기능
  12. Realtime Database를 이용한 채팅기능 구현 - 접속 중인 유저 표시하기
  13. Storage를 이용한 파일 전송기능
  14. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - FCM Token 정보 저장
  15. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - Functions를 통한 FCM 발송
  16. Cloud Messaging과 Functions을 이용한 푸시메세지 기능 - Service worker를 이용한 FCM수신
  17. Realtime Database 권한 설정

 


댓글
  • 프로필사진 플린(Flynn) 이렇게 한 번에 몰아서 올려주시다니... 감사합니다. React랑 Firebase 이용해서 사내 메신저 제작해보려고 하는데 좋은 정보 얻어갑니다 ㅎㅎ 2017.12.07 14:58 신고
  • 프로필사진 수워니s 방문해주셔서 감사합니다~저는 덕분에 힘을 얻네요~ 2017.12.08 00:08 신고
  • 프로필사진 김정훈 머리숙여 감사드립니다. 초급인데도 정리가 잘되어있어서 이해가잘되네요 :) 2018.01.10 12:41
  • 프로필사진 뚱이 정말 필요한 정보였는데 정리를 잘해주셔서 감사합니다!!! 2018.06.12 10:27
  • 프로필사진 김성윤 안녕하십니까 좋은 자료 감사합니다. 혹시 질문을 해도될런지.. users하위에 어떤 것은 읽고 쓰기가 가능하고 어떤 항목은 읽기만 가능하게 하려고하는데 그 부분도 가능할까요? 2019.04.30 06:41
  • 프로필사진 유병우 좋은 내용 공유해주셔서 감사합니다.
    ^^
    2020.01.14 11:27
  • 프로필사진 안드로이드 개발하는 중1 진짜 처음부터 끝까지 알려주시다니... 정말 감사하고 감동입니다. 2020.09.17 21:51
  • 프로필사진 GU아님 *안녕하세요 수워니s님, 수워니s님 덕분에 항상 실패했던 채팅앱도 구현하게 되었습니다.
    그런데 프로필 변경이나 메세지 삭제, 프로필 사진 변경등의 추가 기능들이 필요하게 되었습니다.
    이런 기능을 모아서 추가 응용 강좌가 있었으면 합니다.
    정말 감사합니다.
    ex)성별, 닉네임, 프로필 사진 구현, 이모티콘, 오픈채팅방, 친구 추가, 친구만 보이기등등...
    꼭 새로 만들어 주셨으면 좋겠습니다.!
    [추신]
    혹시라도 블로그에 포스팅하시게 된다면 댓글로 남겨주시면 감사하겠습니다.^^ {제가 거의 node.js 초보라 수워니s님의 도움이 절실합니다 ㅠㅠ.
    2020.10.12 15:17
댓글쓰기 폼