MAKING · 설계
회원가입 없는 웹 서비스를 만드는 네 가지 방법
결과를 URL에 담기, 기기 안에서 끝내기, 익명 ID와 닉네임, 관리 링크. KKflow 프로젝트들이 가입 없이 동작하도록 쓴 설계 패턴과 각각의 장단점을 정리했습니다.
KKflow의 프로젝트들은 대부분 회원가입이 없습니다. 사주 플로우도, QRforge도, 로또르르도, 스택 타워의 온라인 랭킹도 가입 없이 씁니다. 가입을 없애면 처음 온 사람이 바로 쓸 수 있고, 운영하는 쪽도 개인정보를 보관하고 지킬 부담이 줄어듭니다. 대신 "로그인한 사용자"라는 편리한 기준 없이 데이터를 다뤄야 합니다. 이 글은 그 문제를 푸는 네 가지 패턴을 실제 프로젝트에 쓴 방식과 함께 정리합니다.
1. 결과를 URL에 담는다
쓴 곳: 사주 플로우
사주 결과는 입력값(생년월일시, 성별 등)만 있으면 언제든 다시 계산할 수 있습니다. 그렇다면 결과를 서버에 저장할 필요 없이, 입력값을 압축해서 결과 페이지 주소에 넣으면 됩니다. 주소를 열 때마다 같은 계산을 다시 하면 같은 결과가 나옵니다.
- 장점 — 서버나 데이터베이스에 개인정보 사본이 남지 않습니다. 링크는 서버 데이터가 지워질 일이 없으니 영구적으로 동작하고, 링크를 공유하면 상대도 같은 결과를 봅니다.
- 주의할 점 — 링크 자체가 곧 데이터입니다. 링크를 받은 사람은 입력값을 알 수 있습니다. 사주 플로우는 이 사실을 화면에 그대로 안내합니다. 또 주소에 담는 형식을 나중에 바꾸면 예전 링크가 깨질 수 있으므로, 형식 버전을 함께 넣어 두는 것이 좋습니다.
- 전제 조건 — 계산이 결정론적이어야 합니다. 같은 입력에 매번 다른 결과가 나온다면 이 방식은 쓸 수 없습니다. 사주 플로우가 무작위가 아니라 공개된 규칙으로만 계산하는 이유 중 하나입니다.
2. 처리를 기기 안에서 끝낸다
쓴 곳: QRforge, 로또르르
QR 코드 생성은 서버가 필요 없는 일입니다. 입력한 URL이나 WiFi 비밀번호를 브라우저 안에서 바로 코드로 바꾸고, 이미지로 저장하면 끝입니다. 로또르르의 용지 QR 스캔도 카메라 이미지를 서버로 보내지 않고 기기 안에서 읽어 등수를 판정합니다.
- 장점 — 민감한 값이 네트워크를 타지 않습니다. 서버 비용이 거의 들지 않고, 서버 장애와도 무관합니다.
- 주의할 점 — 기록을 남기려면 브라우저 저장소(localStorage 등)를 써야 하는데, 이 기록은 그 기기·그 브라우저에만 있습니다. 기기를 바꾸거나 브라우저 데이터를 지우면 사라집니다. 로또르르가 지난 추첨 기록을 최대 10회까지만 보관하는 것처럼, 잃어도 괜찮은 수준의 기록만 맡기는 것이 맞습니다.
3. 익명 ID와 닉네임
쓴 곳: 스택 타워 온라인 랭킹
랭킹은 여러 사람의 기록을 한곳에 모아야 하므로 서버가 필요합니다. 그래도 가입은 필요 없습니다. 처음 접속할 때 브라우저에 무작위 익명 ID를 만들어 저장하고, 사용자는 닉네임만 정합니다. 서버는 "이 익명 ID가 이 닉네임으로 이 점수를 냈다"만 압니다. 이름, 이메일, 전화번호는 받지 않습니다.
- 장점 — 첫 판을 끝내자마자 랭킹에 오를 수 있습니다. 서버에 쌓이는 정보가 개인을 특정하기 어려운 수준에 머뭅니다.
- 주의할 점 — 기기를 바꾸면 같은 사람이라는 걸 증명할 방법이 없습니다. 또 점수 조작을 완전히 막기 어렵습니다. 비정상적인 점수를 걸러 내는 서버 쪽 검증을 함께 두는 편이 좋습니다.
4. 관리 링크
쓴 곳: QRforge 동적 QR
동적 QR은 인쇄한 뒤에도 목적지를 바꿀 수 있어야 하므로, "이 QR의 주인"을 알아볼 방법이 필요합니다. 계정 대신 관리 링크를 만들어 줍니다. 이 링크를 가진 사람만 목적지를 바꾸고 스캔 횟수를 볼 수 있습니다. 링크 자체가 열쇠 역할을 하는 셈이라, 이런 링크에는 추측할 수 없을 만큼 긴 무작위 토큰을 담아야 합니다.
- 장점 — 가입 없이도 "내 것"을 관리할 수 있습니다.
- 주의할 점 — 링크를 잃어버리면 복구할 방법이 없고, 링크가 유출되면 누구나 관리할 수 있습니다. 링크를 만든 직후에 북마크나 메모로 보관하라고 분명히 안내해야 합니다.
어떤 패턴을 고를까
| 상황 | 어울리는 패턴 |
|---|---|
| 입력만 있으면 결과를 다시 계산할 수 있다 | 결과를 URL에 담기 |
| 민감한 값을 다루고 공유할 필요가 없다 | 기기 안에서 끝내기 |
| 여러 사람의 기록을 모아 보여 줘야 한다 | 익명 ID + 닉네임 |
| 한 사람만 수정할 수 있는 데이터가 있다 | 관리 링크 |
가입을 없앨 때 꼭 지킬 것
- 무엇이 어디에 남는지 솔직하게 알린다. "링크에 생년월일시가 담깁니다", "기록은 이 기기에만 남습니다"처럼 화면에서 바로 알 수 있어야 합니다.
- 잃어도 되는 것만 기기에 맡긴다. 사라지면 곤란한 데이터라면 결국 계정이 필요할 수 있습니다.
- 나중에 계정을 붙일 여지를 남긴다. 익명 ID 구조로 시작하면, 나중에 원하는 사람만 계정에 연결하는 방식으로 넓히기 쉽습니다.
가입이 없다는 건 기능이 모자란 게 아니라 하나의 설계 선택입니다. 사용자가 무엇을 맡기고 무엇을 가져가는지를 분명히 하면, 가입 없는 서비스도 충분히 믿고 쓸 수 있습니다.