팀 멀티테넌시 — 멤버십 라이프사이클(초대·권한변경·추방) + IAM 그랜트 + 읽기 격리
"우리 팀만 들어갈 수 있는 비밀 기지" 를 만드는 방법이에요. 기지에 친구를 초대하고, 초대받은 친구만 열쇠를 받아 들어가고, 멤버가 아니면 안이 어떻게 생겼는지 구경도 못 하게 막아요.
비유: 우리 반 비밀 기지 🏠
- 기지(팀) = 우리끼리 쓰는 공간. 그 안에 우리만의 물건(문서·프로젝트)이 있어요.
- 열쇠(권한) = 기지 문을 여는 열쇠. 열쇠가 있어야 들어가요.
- 대장(owner) = 기지를 만든 사람. 친구를 초대하고 열쇠를 나눠줄 수 있어요.
- 초대장(초대) = "우리 기지 들어올래?" 하고 보내는 쪽지. 이메일로 보내요.
중요한 규칙 하나: 기지 안 물건은 멤버가 된 "그때부터"만 보여요. 멤버가 아니면 문틈으로 훔쳐보는 것도 안 돼요.
어떻게 들어오나 (초대 → 수락)
친구를 이메일로 부르고, 친구가 "응 갈래!" 하면 그 순간 열쇠를 받아요.
재밌는 점: 친구가 아직 우리 서비스에 가입 안 했어도 초대장을 보낼 수 있어요. 나중에 그 이메일로 가입/로그인하면 "너 초대장 있어!" 하고 딱 이어져요.
멤버가 아니면 구경도 못 해요 (읽기 격리)
누가 "그 팀 방 좀 보여줘" 하고 문을 두드려도, 열쇠(그 팀 멤버 자격)가 없으면 문을 안 열어줘요. "보기만 할게요" 도 안 돼요. 멤버가 아니면 목록에도 안 뜨고, 존재조차 몰라요.
이게 왜 중요하냐면 — 남의 팀 방 번호(teamId)를 우연히 알아도, 열쇠가 없으면 아무것도 못 봐요. "내 팀 목록" 도 내가 열쇠 가진 기지만 보여요.
대장이 할 수 있는 일 (역할 바꾸기 · 내보내기)
들어온 뒤에도 관리가 돼요. 열쇠를 바꿔주거나(역할 변경), 뺏거나(내보내기) 할 수 있어요.
- 역할 바꾸기 = 낡은 열쇠를 걷고 새 열쇠 하나를 줘요. (구경만 하는 열쇠 → 물건도 만지는 열쇠)
- 내보내기 = 열쇠를 뺏어요. 뺏는 그 순간부터 그 사람은 기지 안을 다시 못 봐요.
- 안전장치 3개 🛡️
- 자기가 자기를 못 내보내요.
- 마지막 남은 대장은 못 내보내고, 대장 자리에서도 못 내려와요 (기지가 주인 없이 잠기면 안 되니까).
- 남의 초대장은 못 건드려요 (내 초대장만 수락/거절).
핵심만 다시
- 초대는 이메일로, 수락하면 그 순간 멤버 + 열쇠를 함께 받아요.
- 멤버가 된 그때부터만 팀 물건이 보여요. 비멤버는 구경도 못 해요.
- 열쇠는 바꿔주거나 뺏을 수 있고, 뺏으면 바로 안 보이게 돼요.
- 마지막 대장은 못 쫓아내요 — 기지가 고아가 되지 않게.
더 자세한 진짜 코드·설계는 옆의 개요 / Variants / Apply Recipe 탭에서 볼 수 있어요.