위치 좌표를 단말에 두는 telemetry

위치 좌표를 단말에 남기고 가명 처리한 품질 신호만 제한적으로 전송한 telemetry 설계

한강자리는 로그인 없이 위젯 사용, 알림 설정 저장과 API 지연 같은 작동 상태만 제한적으로 전송한다. 현재 위치 좌표, 이름, 이메일과 광고 식별자는 telemetry에 포함하지 않는다.

이벤트를 추가하기 전에는 장애와 성능을 확인하는 데 필요한 필드인지, 보관 기간과 접근 범위를 설명할 수 있는지 검토한다.

위치는 단말 안에서만

한강자리는 가까운 공원이나 주차장을 정렬할 때 현재 위치를 단말에서만 사용한다.

sequenceDiagram
  autonumber
  participant User as 사용자
  participant App as iOS 앱
  participant Location as 위치 서비스
  participant Server as 서버 API

  User->>App: 가까운 곳 보기
  App->>Location: 현재 위치 요청
  Location-->>App: 좌표 또는 nil
  App->>App: 공원/주차장 정렬
  App-xServer: 좌표 업로드 없음

위치 권한이 없으면 nil을 받고 가까운 정렬만 제한한다. 서버 API는 정렬에 사용할 공원과 주차장 데이터를 내려주며 사용자의 현재 좌표는 받거나 저장하지 않는다.

가명 처리한 이벤트

이벤트는 계정 대신 가명 처리한 설치 해시를 기준으로 한다. 앱은 seed를 기기에 저장하고 scope를 붙여 hash를 만든다.

서버에는 이름, 이메일, 광고 식별자, 위치 좌표를 보내지 않는다. 앱 상태를 보기에 필요한 최소 필드만 보낸다.

대표 필드는 다음과 같다.

필드목적
event type어떤 일이 일어났는가
surface/entrypoint앱, 위젯, 알림 중 어디에서 왔는가
park ID / lot ID어떤 공원 또는 주차장 맥락인가
정보 최신성 구간사용자가 본 정보가 최신에 가까운가, 오래됐는가
duration/status/reason느린 지점과 실패 이유
pseudonymous install hash중복 없는 설치 단위 구분

park ID와 lot ID는 화면별 오류를 구분하는 데만 사용하고 설치 해시와 결합한 장기 이동 기록을 만들지 않는다. 설치 해시는 계정은 아니지만 반복 이벤트를 연결할 수 있으므로 보관 기간과 접근 범위를 제한한다.

앱 응답과 분리한 전송

이벤트 reporter는 telemetry를 파일 queue에 쌓고 제한된 묶음으로 비동기 전송한다.

전송에 실패하면 백오프 뒤 다음 기회에 다시 보낸다.

flowchart LR
  Event["앱 이벤트"] --> Buffer["단말 파일 큐<br/>제한된 묶음"]
  Buffer --> API["텔레메트리 엔드포인트"]
  API -->|수락| Metrics["Prometheus/DB 메트릭"]
  API -.->|실패| Retry["백오프 재시도"]
  Retry --> Buffer

한 번에 보내는 수와 크기를 제한해 telemetry 전송이 앱 응답을 지연시키지 않게 한다.

성능 신호와 행동 신호의 분리

앱 이벤트와 성능 이벤트는 구분한다. 성능 telemetry는 API path, 응답 코드, 걸린 시간, cache 사용 여부 같은 기술 신호를 본다. 사용 패턴을 보려는 일과 API 안정성을 확인하는 일은 목적이 다르다.

서버에서는 이벤트 수집 수, 거절 이유, 수집에 걸린 시간, push ack 같은 metric을 남긴다. 이 metric은 앱 상태 확인에만 사용하고 사용자 프로파일링에는 사용하지 않는다.

대시보드는 API 지연과 오류를 찾는 성능 신호를 중심으로 구성한다. 공원·주차장 맥락은 기능별 오류를 구분하는 범위에서만 사용한다.

APNs device token과 알림 설정

알림은 예외적으로 서버 저장이 필요하다. APNs device token, 관심 공원·주차장, 알림 기준, 조용한 시간 같은 값이 있어야 서버가 사용자가 요청한 알림을 보낼 수 있다.

push 영역에는 다음 보관 규칙을 적용한다.

  • 알림을 켠 경우에만 필요한 값을 저장한다.
  • APNs가 기기를 구분하는 값은 전송 목적에 한정한다.
  • 무효화된 device token과 오래된 subscription은 정리한다.
  • 알림 규칙과 delivery audit은 사용자 보호를 위해 reason code를 남긴다.

푸시 서버는 사용자가 고른 알림을 보내기 위해 device token과 설정을 저장한다. delivery audit에는 발송 또는 억제 이유를 남기되 메시지 본문과 token을 운영 로그에 그대로 기록하지 않는다.

앱 동작과 일치하는 정책 문서

iOS Privacy Manifest에는 앱이 수집하는 데이터 유형과 Required Reason API 사용 이유를 선언한다. 개인정보 처리방침은 서버로 전송하는 정보, 이용 목적과 보관·삭제 기준을 사용자에게 설명한다. 두 문서는 실제 telemetry 필드와 함께 확인한다.

정책 문서에는 다음 항목을 명시했다.

  • 계정과 로그인 없음.
  • 광고 식별자 기반 추적 없음.
  • 위치 좌표 서버 전송 없음.
  • 앱 이벤트는 가명 설치 해시와 최소한의 작동 신호 중심.
  • APNs device token은 알림을 보내기 위한 목적.
  • 공개 데이터 원문에 민감 문자열이 섞일 수 있으면 저장/표시 전에 제한한다.

전송 필드와 정책의 일치

한강자리는 현재 위치 좌표를 단말에서만 사용하고 성능·기능 이벤트에는 필요한 필드와 가명 설치 해시만 넣는다. 파일 queue의 묶음 크기와 재시도를 제한하며 Privacy Manifest와 개인정보 처리방침을 실제 전송 필드에 맞춰 점검한다.

Apple의 Privacy Manifest 문서에서 선언 항목을 확인했다.

Comments

댓글

    이미지 확대