코드는 다 돼 있습니다 · 콘솔에서 네 가지만 하시면 됩니다
카카오·구글 로그인, 서버 저장, 어느 쪽이 나중 것인지 가리는 일,
계정 지우기까지 코드는 전부 들어가 있습니다. 아래 네 단계를 거쳐
맨 마지막에 cloud-config.js에 두 줄만 채우면 켜집니다.
채우기 전까지는 이 기능이 통째로 꺼져 있습니다 — 화면에 나타나지도 않고, 서버로 아무것도 나가지 않으며, 게임은 지금처럼 기기 안에서만 돕니다. 잘못 켜질 걱정은 없습니다.
먼저 알아 두실 것
로그인은 결제 때문이 아닙니다. 결제는 구글 플레이가 전부 맡습니다 — 로그인이 없어도 옥은 사집니다. 로그인은 오직 폰을 바꿔도 기록이 따라오게 하기 위한 것입니다.
그래서 안 하셔도 게임은 하나도 빠짐없이 다 됩니다. 그 덕에 Play Console의 「앱에 제한된 부분이 있나요」는 여전히 「아니요」입니다.
로그인하기 전에는 서버에 한 글자도 보내지 않습니다. 익명 세션조차 만들지 않습니다 — 안 만들면 지울 것도, 새어 나갈 것도, 설명할 것도 없습니다.
표 한 줄이 전부입니다 — 누구의 것인지(계정 번호)와 게임 기록 한 덩이(단계·냥·옥·수련·호). 이름도 전화번호도 두지 않고, 이메일은 로그인 쪽이 갖고 있지 우리 표로 옮겨 오지 않습니다.
하나
감사담 것과 섞지 마십시오. 동의 화면에 「감사담」이 떠서 낱말산 사용자가 어리둥절해지고, 두 서비스의 사용자 데이터가 한 곳에 섞입니다. 낱말산 전용으로 새로 만드십시오.
natmalsan · Region Northeast Asia (Seoul)https://…….supabase.co)
eyJ… 로 시작하는 긴 글)같은 화면에 service_role 키도 있습니다. 그건
모든 사람의 기록을 다 읽는 열쇠입니다. 웹에 올라가는 파일에
절대 넣지 마십시오. 우리가 쓸 것은 anon public 하나뿐입니다.
둘
Supabase 대시보드 → 왼쪽 SQL Editor → New query →
저장소의 supabase/0001_saves.sql을 통째로 붙여 넣고
Run. 한 번만 하면 됩니다.
이 한 번으로 세 가지가 생깁니다.
| 생기는 것 | 하는 일 |
|---|---|
| saves 표 | 사람마다 기록 한 줄 |
| RLS 넉 줄 | 한 사람은 제 줄만 봅니다. 이게 없으면 anon 키를 쥔 누구나 남의 기록을 읽습니다 — 가장 중요한 줄입니다 |
| delete_me() | 로그인한 사람이 제 손으로 제 계정을 지웁니다. 구글 플레이가 요구하는 기능입니다 |
Table Editor → saves를 열면 표 이름 옆에 「RLS enabled」 라고 떠 있어야 합니다. 안 떠 있으면 SQL이 끝까지 안 돌아간 것이니 다시 실행하십시오.
셋
감사담 때와 같은 순서입니다. 다만 프로젝트는 새로 만듭니다 — 동의 화면에 뜨는 이름이 「낱말산」이어야 하기 때문입니다.
낱말산email · profile · openid)https://wordgamebest.vercel.app
<Supabase URL>/auth/v1/callback기본값인 테스트(Testing) 상태에서는 등록한 계정 100명만 로그인됩니다. 스토어에 올라간 뒤에 이 상태면 대부분의 사람에게 로그인이 그냥 실패합니다.
「프로덕션」으로 올리면 구글 검증이 붙는데, 범위가
email · profile · openid뿐이면 민감하지 않은 범위라
대개 바로 통과합니다. 다만 미리 해 두십시오 — 심사 끝나고 하면
그만큼 늦어집니다.
구글 쪽에는 이메일 칸이 둘인데 성격이 다릅니다.
나중에 바꿀 수 있습니다 — 프로젝트를 다시 만들 필요 없이 Google Auth Platform → 브랜딩에서 고치면 됩니다. 다만 드롭다운에는 본인이 소유한 주소만 뜹니다. 새 주소를 쓰시려면 그 계정을 IAM에서 프로젝트 소유자로 추가한 뒤 그 계정으로 로그인해 고르십시오.
어차피 Play 스토어 등록정보의 연락처 이메일은 스토어 페이지에 공개됩니다 — 구글이 필수로 요구하고 누구나 봅니다. 그래서 전용 주소는 어느 쪽이든 한 번은 필요합니다.
하나 만들어 네 군데에 같은 것을 쓰시면 한 군데도 평소 주소가 새지 않습니다. 스토어에 올라간 뒤에 고치면 이미 퍼진 뒤라, 지금 만드는 쪽이 훨씬 쌉니다.
넷
<Supabase URL>/auth/v1/callback카카오 콘솔에서 카카오계정(이메일)이 「권한 없음」으로 잠겨 있는
것이 정상입니다. 개인 개발자 앱은 이 항목을 아예 요청할 수 없고,
억지로 요구하면 KOE205로 로그인 자체가 막힙니다.
그래서 닉네임만 받습니다. 기록을 잇는 열쇠는 처음부터 이메일이 아니라 계정 번호였고, 이메일이 하던 일은 「어느 계정으로 이었는지」를 화면에 보여 주는 것뿐이라 닉네임으로 충분합니다. 오히려 모으는 개인정보가 하나 줄어듭니다.
카카오가 이메일을 주지 않으므로, Authentication → Providers → Kakao 안의 「Allow users without an email」을 켜십시오. 이게 꺼져 있으면 Supabase가 이메일 없는 로그인을 거부합니다 — 카카오 창까지 다 거치고 돌아와서 실패합니다.
구글 쪽은 끈 채로 두십시오. 구글은 이메일을 늘 주므로 켤 이유가 없습니다.
마지막
cloud-config.js를 열어 1단계에서 적어 둔 두 값을 넣습니다.
window.NM_CLOUD = {
url: "https://xxxxxxxx.supabase.co",
key: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....."
};
sw.js 맨 위의 var V = "natmal-15"에서 숫자를
하나 올리고 함께 올리셔야 합니다. 안 그러면 이미 깔린 폰은
예전의 빈 설정을 계속 씁니다.
올린 뒤 「규칙」을 열어 「기록 지키기」 칸이 나타났는지, 카카오·구글 단추가 눌리는지 확인하십시오. 설정이 비어 있으면 이 칸은 아예 안 보입니다 — 그게 안 켜졌다는 표시입니다.
켠 뒤
로그인을 켜는 순간 이메일을 모으게 됩니다. 「아무것도 모으지 않습니다」는 그때부터 쓸 수 없습니다. 아래를 함께 고치지 않으면 심사에서 막히거나, 통과한 뒤에 문제가 됩니다.
| 자리 | 바꿀 답 |
|---|---|
| 로그인 세부정보 | 아니요 — 그대로입니다. 로그인이 선택이고 잠긴 자리가 없습니다 |
| 데이터 보안 | 수집함으로 바뀝니다
· 이메일 주소 — 선택 · 계정 관리 목적 · 공유 안 함 · 앱 활동(게임 기록) — 선택 · 앱 기능 목적 · 공유 안 함 · 전송 중 암호화됨 · 삭제 요청 가능 |
| 계정 삭제 URL | wordgamebest.vercel.app/docs/account-delete.html |
| 개인정보처리방침 | 주소는 그대로 · 내용이 이미 고쳐져 있습니다 |
계정을 만드는 앱은 앱 안에서 지우는 길과 웹으로 지우는 길을 둘 다 둬야 합니다. 둘 다 돼 있습니다 — 앱에서는 「규칙 → 계정 지우기」, 웹에서는 위의 주소입니다.