범위·정밀도·종료 시각을 서버가 서명한 session으로 고정합니다.
주변 친구 서비스
설계
주변 친구는 지도 위의 점을 찾는 기능이 아닙니다. 사용자가 허용한 시간과 범위 안에서만, 관계가 허용된 사람에게만, 오래되지 않은 위치를 대략적으로 보여 주는 동의·인가·공간 검색 시스템입니다.
최근 위치는 짧은 TTL의 공간 인덱스에서 후보를 찾는 데만 씁니다. 결과를 보여 주기 전에는 공유 세션의 동의·만료와 양방향 친구 그래프 인가를 재확인합니다. 근접 알림은 좌표 갱신마다 보내지 않고 enter/exit 상태 전이, hysteresis, cooldown을 거친 뒤 fanout합니다.
좌표보다 먼저 동의와 관계를 판정한다
“근처”라는 후보 생성과 “보여도 되는가”라는 인가는 다른 문제입니다. 공유 중지·정확도 수준·block·친구 해제가 결과와 알림보다 먼저 적용되어야 합니다.
권한, device binding, accuracy, stale 시각, 속도를 검사합니다.
후보마다 friend edge, block, scope, expiry를 확인합니다.
enter 전이와 cooldown 뒤, 전송 직전에 다시 opt-in을 봅니다.
최근 위치·관계·알림을 서로 다른 수명으로 둔다
ingestion은 유효한 관측값을 이벤트로 만들고, indexer가 현재 위치와 TTL 공간 인덱스를 갱신합니다. read API는 후보를 좁힌 뒤 친구 그래프와 동의를 확인합니다. notification은 별도 queue로 격리합니다.
쓰기의 최신성과 읽기의 인가를 각각 보장한다
클라이언트는 관측값을 보낼 뿐이고, 서버가 그것을 보관·노출·알림해도 되는지를 판정합니다. `observed_at`과 TTL은 오래된 표본이 현재처럼 보이는 일을 줄입니다.
동의 범위·정밀도·expiry를 서버가 기록합니다.
권한, device, accuracy, idempotency를 확인합니다.
순서 fence 뒤 cell과 current location을 갱신합니다.
반경 후보에 graph, block, scope를 batch로 적용합니다.
enter 상태와 cooldown을 기록하고 전송 직전 재검사합니다.
정확도와 즉시성의 이득은 노출·비용과 함께 온다
| 선택 | 장점 | 제약 | 권장 판단 |
|---|---|---|---|
| 정확 좌표 표시 | 거리·만남 안내가 직관적 | stalking·재식별 위험이 큼 | 강한 상호 동의, 짧은 명시 세션에 한정 |
| 거리 밴드 / 대략 셀 | 프라이버시와 UI 안정성 개선 | 정밀한 길 안내에는 부족 | 주변 친구의 기본 노출값 |
| Redis GEO 최근 인덱스 | 반경 후보 검색이 단순 | 정본·친구 인가·보존은 별도 문제 | 짧은 TTL의 점 기반 근접 검색 |
| H3/geohash 셀 routing | shard와 hot cell 제어가 명확 | 경계 병합·해상도 선택이 필요 | 대규모 event routing, 도시 편향 |
| enter마다 푸시 | 즉시성이 높음 | GPS 흔들림·밀집 지역 spam | hysteresis + cooldown + opt-in으로 대체 |
여덟 가지 실패를 노출 차단과 복구 검증으로 다룬다
중지한 위치가 cache나 예약된 알림에 잠시 남을 수 있습니다.
인덱스가 뒤처져 오래된 위치가 후보에 섞일 수 있습니다.
행사장 같은 셀에서 후보 수와 p99가 급증합니다.
관계를 확신할 수 없는데 위치를 보여 주면 안 됩니다.
늦은 표본이나 낮은 정확도가 false enter를 만들 수 있습니다.
일부 사용자가 검색에서 사라지거나 결과가 불완전해집니다.
근접 알림이 늦어져 이미 의미가 없어질 수 있습니다.
탈퇴·삭제한 위치의 파생 복사본이 남을 위험이 있습니다.
개인정보·관측·비용을 좌표 밖에서 운영한다
원본 좌표·친구 목록·token을 trace와 URL에서 제외합니다. TLS, device binding, 역할 기반 접근, 최소 정밀도·보존과 opt-out/delete fanout을 기본으로 둡니다.
ingest decision, 위치 나이, index lag, hot cell 후보 수, graph 허용/거부, transition, 철회→purge 지연을 ID·좌표 없이 단계별로 봅니다.
배터리·업로드·event stream·TTL 메모리·graph batch·notification fanout·삭제 운영이 함께 증가합니다. TTL을 늘리면 stale 후보와 삭제 노출 창도 커집니다.
공식·1차 출처
- W3C — Geolocation: 웹 위치 권한, 위치 취득과 `watchPosition()` 모델.
- Android Developers — Request location permissions: 전경/백그라운드 및 정밀/대략 위치 권한.
- Apple Developer — Requesting authorization to use location services: Core Location의 인가 수준과 변경 처리.
- Redis Docs — Geospatial: 좌표 저장과 반경·상자 기반 후보 검색.
- Firebase — Firebase Cloud Messaging: 앱 서버와 플랫폼 전송 계층의 메시지 모델.
- Apple Developer — Setting up a remote notification server: APNs provider server와 원격 알림 설정.
작성·검토·참고 자료
참고 자료
- W3C — Geolocation: 웹의 위치 권한, 위치 취득과 `watchPosition()` 인터페이스, 정확도·시각 모델.
- Android Developers — Request location permissions: 전경/백그라운드 및 정밀/대략 위치 권한의 구분.
- Apple Developer — Requesting authorization to use location services: Core Location 인가, 사용 중/항상 접근 수준과 변경 처리.
- Redis Docs — Geospatial: `GEOADD`, `GEOSEARCH` 등 점 좌표·반경/상자 검색의 자료형 동작.
- Firebase — Firebase Cloud Messaging: 앱 서버와 플랫폼 전송 계층 사이의 FCM 메시지 모델.
- Apple Developer — Setting up a remote notification server: APNs provider server와 원격 알림 전달 설정.
사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.