Q Presence

개인정보처리방침 · Privacy Policy — 최종 업데이트 / Last updated: 2026-07-25

한국어

Q Presence는 콘텐츠에 중앙 서버가 없는 존재 기반 소셜 네트워크입니다. 다만 앱에는 성격이 완전히 다른 두 계층이 있고, 두 번째 계층에서는 개발자 서버가 일부 데이터를 받습니다. 이 문서는 그 경계를 정확히 구분합니다.

계층 1 — P2P 콘텐츠: 우리가 받지 않는 것

계층 2 — 선택적 계정/relay 계층: 우리가 받는 것

개발자가 운영하는 서버는 https://auth.ugot.uk 하나이며, 아래 여섯 가지 경우에만 데이터를 받습니다.

  1. Google 로그인(선택) — @핸들을 쓰려고 Google 로그인을 하면, 앱이 Google ID 토큰을 auth.ugot.uk로 보내 Q Presence 토큰으로 교환합니다. 요청 스코프는 openid profile email offline_access이며, 이때 이메일 주소·이름·프로필 사진 URL이 서버 계정 레코드로 저장됩니다. 로그인하지 않으면 이 항목은 전혀 발생하지 않습니다.
  2. pnp 공개키 ↔ @핸들 매핑 — 로그인 후 POST /api/auth/pubkey로 당신의 pnp 공개키(pnp: URI)와 @핸들의 연결이 서버에 저장됩니다. 이 매핑은 만료 기간 없이 보관되며, 누구나 인증 없이 GET /api/auth/username-by-pubkey로 공개키에서 @핸들을 역조회할 수 있습니다(그것이 이 기능의 목적입니다). 즉 로그인하는 순간 당신의 가명 pnp 신원과 Google 계정 기반 @핸들이 공개적으로 연결됩니다.
  3. iOS APNs 기기 토큰 — iOS는 OS가 백그라운드 P2P를 차단하므로, iOS 앱은 POST /api/relay/registerAPNs 기기 토큰을 등록합니다. 토큰은 서버에 최대 30일 보관되며(앱이 주기적으로 재등록해 갱신), Apple이 무효라고 확정하면 즉시 폐기됩니다. Android 앱은 이 등록을 하지 않습니다.
  4. relay 깨우기 대상 식별자 — 대화(DM)를 보낼 때마다 앱이 POST /api/relay/wake상대의 pnp URI와 종류 값(dm)을 서버에 보냅니다. 이 호출은 로그인 여부와 무관하게, 상대가 relay에 등록돼 있는지와 무관하게 발생합니다. 서버는 상대가 등록된 iOS 사용자일 때 내용이 전혀 없는 APNs 푸시로 상대 앱을 깨울 뿐이며, 메시지 내용은 절대 서버로 전송되지 않습니다 — 깨어난 앱이 당신과 직접 P2P로 연결해 내용을 받습니다. 서버는 대상 식별자나 wake 이력을 저장하지 않고, 남용(푸시 폭탄) 방지를 위해 발신 IP의 SHA-256 해시 앞 8바이트만 5분 창 카운터로 사용합니다(원문 IP는 저장·로그하지 않습니다).
  5. 핸들 역조회 시의 접속 정보 — 피드에서 다른 사람의 @핸들을 표시하기 위해 앱이 그 사람의 pnp 공개키를 조회 요청에 담아 보냅니다. 모든 HTTPS 요청과 마찬가지로 이때 당신의 IP 주소가 서버에 도달합니다.
  6. 구독 결제 — Q Presence+ 구독 결제 자체는 Apple App Store 또는 Google Play가 처리하며, 카드·결제 수단 정보는 우리에게 오지 않습니다. iOS에서 relay 구독 게이팅이 활성화된 경우에 한해, StoreKit 트랜잭션 증명(JWS — 상품 ID·구매/만료 시각 등 구매 이력)이 auth.ugot.uk로 전송되어 검증되고 당신의 계정에 결속됩니다.

보관 기간

데이터보관 기간
계정 레코드(이메일·이름·프로필 사진 URL)계정 삭제 요청 시까지
pnp 공개키 ↔ @핸들 매핑만료 없음 — 해제 또는 계정 삭제 시까지
iOS APNs 기기 토큰최대 30일(재등록 없으면 자동 만료, 무효 확정 시 즉시 삭제)
relay 소유자 기록(@핸들)365일(재등록 때마다 갱신)
wake 남용 방지 카운터(IP 해시)5분
wake 대상 식별자·메시지 내용저장하지 않음

기기에만 저장되는 것

제3자 인프라

권한

계정 삭제 / 데이터 삭제 요청

문의

dudnjsckrgo@gmail.com


English

Q Presence is a presence-based social network with no central server for content. However, the app has two layers with entirely different properties, and in the second layer the developer's server does receive some data. This document draws that line precisely.

Layer 1 — P2P content: what we never receive

Layer 2 — optional account / relay layer: what we receive

The developer operates exactly one server, https://auth.ugot.uk, and it receives data only in the six cases below.

  1. Google sign-in (optional) — If you sign in with Google to claim an @handle, the app sends your Google ID token to auth.ugot.uk to exchange it for a Q Presence token. The requested scopes are openid profile email offline_access, and your email address, name, and profile picture URL are stored in a server account record. None of this happens if you never sign in.
  2. pnp public key ↔ @handle mapping — After sign-in, POST /api/auth/pubkey stores the link between your pnp public key (pnp: URI) and your @handle on the server. This mapping is kept with no expiry, and anyone, without authentication, can reverse-look-up a handle from a public key via GET /api/auth/username-by-pubkey (that is the point of the feature). In other words, signing in publicly links your pseudonymous pnp identity to your Google-backed @handle.
  3. iOS APNs device token — Because iOS blocks background P2P at the OS level, the iOS app registers its APNs device token via POST /api/relay/register. The token is retained on the server for up to 30 days (the app periodically re-registers to refresh it) and is discarded immediately if Apple reports it as invalid. The Android app performs no such registration.
  4. Relay wake target identifier — Every time you send a direct message, the app sends the recipient's pnp URI and a kind value (dm) to POST /api/relay/wake. This call happens regardless of whether you are signed in and regardless of whether the recipient is registered. When the recipient is a registered iOS user, the server sends a contentless APNs push to wake their app; message content is never sent to the server — the woken app connects to you directly over P2P to receive it. The server does not store target identifiers or wake history; for abuse (push-bomb) protection it uses only the first 8 bytes of a SHA-256 hash of the sender IP as a 5-minute window counter (raw IPs are neither stored nor logged).
  5. Connection metadata during handle lookups — To show other people's @handles in your feed, the app sends their pnp public key in a lookup request. As with any HTTPS request, your IP address reaches the server.
  6. Subscription payments — Q Presence+ payments are processed by Apple's App Store or Google Play; card and payment-instrument details never reach us. Only when relay subscription gating is enabled on iOS, a StoreKit transaction proof (a JWS containing purchase history such as product ID and purchase/expiry timestamps) is sent to auth.ugot.uk for verification and bound to your account.

Retention

DataRetention
Account record (email, name, profile picture URL)Until you request deletion
pnp public key ↔ @handle mappingNo expiry — until unbound or the account is deleted
iOS APNs device tokenUp to 30 days (auto-expires without re-registration; deleted at once when invalidated)
Relay owner record (@handle)365 days (refreshed on each re-registration)
Wake abuse-protection counter (hashed IP)5 minutes
Wake target identifiers, message contentNot stored

Stored only on your device

Third-party infrastructure

Permissions

Account deletion / data deletion requests

Contact

dudnjsckrgo@gmail.com