대상 독자: 본 기고문은 개인정보 보호 담당자, 교육청 및 부처의 IT 아키텍트, fleet 헬스 대시보드를 통합하는 OEM 파트너, 그리고 EU·미국·걸프·중남미 바이어에게 "펜이 공장으로 어떤 데이터를 전송하는가?"라는 질문에 답해야 하는 B2B 수입상을 위한 글입니다. GDPR과 COPPA를 개념 수준에서 이해하고 있다고 가정하되, B1/B2/F8/K7/KF1/L5/P2/Q6/Q8/T2/Y6 펜에서 어떤 이벤트 클래스가 전송되는지, 어떤 데이터가 익명화되는지, 어떤 데이터가 옵트인 방식인지, 그리고 어떤 데이터는 절대 전송되지 않는지를 정확히 알고 싶은 분들을 대상으로 합니다.
지난 분기 스페인 학교협동조합이 12,000대의 펜을 도입하면서 저희 컴플라이언스 팀에 정밀한 질문을 던졌습니다: "GDPR 25조에 따라 기기에서 어떤 데이터가 나가고, 어떤 데이터가 기기 내에 남아 있으며, 보호자가 품질보증 커버리지 손실 없이 옵트아웃할 수 있는가?" 솔직한 답은 23페이지에 달합니다. 여기서 공개하는 짧은 답은, EU에서는 텔레메트리 이벤트가 기본 옵트아웃, 미국은 COPPA에 따라 기본 옵트인, 사우디아라비아는 SFDA에 따라 기본 옵트인, OEM 자체 호스팅 fleet은 기본적으로 절대 전송되지 않음. 이러한 정책의 엔지니어링 배경을 아래에 설명합니다.
본 기고문에서는 기기 내 로그 링 버퍼, 이벤트 스키마, 익명화 파이프라인, 업로드 스케줄, GDPR/COPPA/PIPL/LGPD 컴플라이언스 태세, 대시보드가 제공하는 fleet 헬스 지표, 그리고 47개국 47,000대 이상의 펜에서 텔레메트리를 운영할 때의 비용을 다룹니다.
1. 기기 내 로그 링 버퍼
모든 펜은 사용자 데이터 파티션에 512 KB 링 버퍼를 갖추고 있습니다. 이 버퍼는 추가 전용(append-only)이며 시간 인덱싱이 적용되고, 보호자가 "진단 로그 보존"을 선택한 경우에만 공장 초기화 후에도 유지됩니다. 이는 엔터프라이즈 배포에서는 기본값이며, 일반 소매에서는 기본값이 꺼져 있습니다.
1.1 모델별 버퍼 파라미터
| 모델 | 파티션 | 버퍼 크기 | 이벤트 레코드 수 | 보존 기간(일) |
|---|---|---|---|---|
| B1 | 사용자 데이터 NOR | 256 KB | 2,800 | 14 |
| B2 | 사용자 데이터 NOR | 256 KB | 2,800 | 14 |
| F8 | 사용자 데이터 NAND | 512 KB | 5,600 | 21 |
| K7 / KF1 | 사용자 데이터 NAND | 512 KB | 5,600 | 21 |
| L5 | 사용자 데이터 NAND | 1 MB | 11,200 | 30 |
| P2 | 사용자 데이터 NOR | 256 KB | 2,800 | 14 |
| Q6 / Q8 | 사용자 데이터 NAND | 1 MB | 11,200 | 30 |
| T2 / Y6 | 사용자 데이터 NAND | 2 MB | 22,400 | 45 |
버퍼는 모델에 따라 14~45일 동안 가장 빈도가 높은 이벤트 클래스(앱.이벤트)를 보관할 수 있도록 크기가 설계되었습니다. 버퍼는 순환식이며, 가장 오래된 이벤트가 먼저 삭제됩니다.
1.2 이벤트 스키마
모든 레코드는 1바이트 타입, 4바이트 타임스탬프, 2바이트 스키마 버전, 그리고 89바이트의 타입별 페이로드로 구성된 고정 96바이트 구조입니다.
struct telemetry_event_t {
uint8_t type; // 0x01..0x2C
uint32_t timestamp; // seconds since boot
uint16_t schema_ver; // e.g., 0x0007
uint8_t severity; // 0..3 (info, warn, error, critical)
uint8_t reserved;
uint8_t payload[80];
uint16_t crc; // CRC-16-CCITT
uint8_t sig_pad[6]; // reserved for Ed25519 short sig
} __attribute__((packed));
페이로드는 유형별로 다릅니다. 부팅.종료 이벤트는 uint32 부팅 지속 시간을 전달하고, oid.조회 이벤트는 uint16 지연 시간과 uint16 사전 페이지 버킷을 전달하며, 앱.크래시 이벤트는 64바이트 스택 지문 해시를 전달합니다.
2. 이벤트 클래스
총 44개의 이벤트 클래스를 정의합니다. 모두 업로드되지는 않습니다. 분류는 로컬 (절대 업로드되지 않음), 원격측정 (업로드되며 익명화됨), 또는 지원 (사용자의 명시적 동의 시에만 업로드됨)입니다.
| 클래스 | 개수 | 기본 동작 | 예시 |
|---|---|---|---|
| 로컬 전용 | 18 | 로컬 | 키.입력, 책.열기, 앱.로케일 |
| 텔레메트리(익명화) | 19 | 원격측정 | 부팅.종료, oid.조회, 전력.소모, 펌웨어.업데이트 |
| 지원(옵트인) | 7 | 지원 | 음성.클립, 음성인식.발화, 사전.덮어쓰기 |
18개의 LOCAL 이벤트는 기기에 그대로 남아 "이전에 읽던 위치에서 이어서 읽기" 같은 앱 내 기능에만 사용됩니다. 19개의 TELEMETRY 이벤트는 Wi-Fi를 통해 배치로 업로드됩니다. 7개의 SUPPORT 이벤트는 부모 또는 fleet 관리자가 명시적으로 지원 모드를 활성화한 경우에만 업로드됩니다.
3. 익명화 규칙
모든 TELEMETRY 이벤트는 업로드 전에 4단계 익명화 파이프라인을 거칩니다. 이 파이프라인은 기기 내에서 실행되며 부트로더가 강제하므로, 손상된 애플리케이션도 이를 우회할 수 없습니다.
- 식별자 제거 — 기기 일련번호는 부팅마다 회전하는 솔트로 대체됩니다. 이 솔트는 128비트 랜덤 값이며 콜드 부팅 시마다 재생성됩니다.
- 값을 버킷화 — 지연 시간은 가장 가까운 10ms 단위로 반올림됩니다. 배터리 잔량은 가장 가까운 5% 단위로 반올림됩니다. 사전 조회는 CEFR 레벨로 버킷화됩니다.
- 지문 해시화 — 스택 트레이스는 fleet별 솔트로 해시됩니다. 이 솔트는 매월 회전되며 절대 업로드되지 않습니다.
- 원본에서 집계 — 단일 이벤트는 기기 내에서 15분 단위 윈도우로 집계됩니다. 기기는 윈도우당 1개의 레코드만 업로드하며, 개별 이벤트 30건을 따로 업로드하지 않습니다.
집계된 레코드에는 윈도우 타임스탬프, fleet ID(OEM 하위키의 32-bit 해시), 모델, 펌웨어 버전, 지역 코드, 그리고 6개의 메트릭 카운터가 포함됩니다. 기기 일련번호, 부모 이름, 자녀 이름 또는 자녀가 터치한 콘텐츠는 포함되지 않습니다.
4. 업로드 일정 및 배치 처리
업로드는 Wi-Fi에서만 수행되며 셀룰러에서는 절대 수행되지 않습니다(셀룰러 모뎀은 포함되지 않음). 기본 일정은 다음과 같습니다.
| 조건 | 동작 |
|---|---|
| Wi-Fi 연결됨, 유휴 >5분 | 대기 중인 배치 업로드 |
| 배터리 <20% | 업로드 보류 |
| 배터리 <10% | 업로드 취소, 배치 로컬에 보존 |
| 충전기 연결, 배터리 무관 | 즉시 업로드 |
| 플릿 관리자 강제 업로드 | 상태 무관하게 지금 업로드 |
일반적인 펜은 하루 1~3개의 배치 레코드를 업로드하며, 총 18~54 KB입니다. 12,000대 규모 플릿에서 한 학주간 업로드 용량은 주당 1.6~4.8 GB로 단일 기업 광대역 회선 내에서 충분히 처리됩니다.
5. GDPR / COPPA / PIPL / LGPD 규정 준수
기본 텔레메트리 동작은 관할 지역별로 다릅니다. 공장은 배송 목적지 규정에 따라 기본값을 적용합니다.
| 관할 지역 | 기본 텔레메트리 | 기본 지원 | 옵트아웃 방식 |
|---|---|---|---|
| EU (GDPR) | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
| 영국 (GDPR + DPA) | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
| 미국 (COPPA, 13세 미만) | 옵트인 | 해제 | 최초 부팅 마법사 |
| 미국 (13세 이상, 주법) | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
| 사우디아라비아 (SFDA, PTA) | 옵트인 | 해제 | 최초 부팅 마법사 + PTA 포털 |
| UAE (TDRA) | 옵트인 | 해제 | 최초 부팅 마법사 + TDRA 포털 |
| 중국 (PIPL) | 옵트인 | 해제 | 최초 부팅 마법사 + PIPL 동의 |
| 브라질 (LGPD) | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
| 멕시코 (LFPDPPP) | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
| 기타 모든 지역 | 옵트아웃 | 해제 | 설정 → 개인정보 → 텔레메트리 |
모든 관할 지역에서 부모 또는 플릿 관리자는 보증 coverage, OTA 업데이트 접근권, 지원 접근권을 잃지 않고 텔레메트리를 비활성화할 수 있습니다. 옵트아웃 시 비활성화되는 유일한 기능은 운영 상태 대시보드이며, 이 기능은 집계 텔레메트리 데이터가 필요합니다.
6. 플릿 운영 상태 지표 대시보드
OEM 파트너 및 대규모 플릿 운영사를 위해 텔레메트리 대시보드는 플릿 레벨에서 9가지 지표를 제공합니다. 단일 기기 시리얼까지 드릴다운할 수 있는 지표는 없습니다.
| 지표 | 정의 | 용도 |
|---|---|---|
| 일일 활성률 | (24시간 이내에 1회 이상 부팅한 펜 수) / (전체 fleet 규모) | 참여도 |
| 크래시 없는 세션 | (처리되지 않은 예외가 없는 세션 수) / (전체 세션 수) | 안정성 |
| OID 조회 p95 | OID-발음 응답의 95번째 백분위수 | 성능 |
| 배터리 상태 | 초기 용량의 80% 미만으로 보고되는 펜 | 하드웨어 수명 주기 |
| OTA 적용률 | (최신 펌웨어가 적용된 펜들) / (보유 대수) | 업데이트 속도 |
| 사전 캐시 적중률 | (캐시에서 제공된 조회 수) / (전체 조회 수) | 성능 |
| 언어 팩 로드 성공률 | (서명 검증에 실패하지 않은 LP 로드 수) / (전체 로드 수) | 콘텐츠 무결성 |
| 충전 이벤트 발생률 | (펜 1대당 주간 충전 세션 수) | 사용 패턴 |
| 오류 심각도 구성 | 심각도 0–3 이벤트 분포 | 상태 |
대시보드는 5,000개 이상의 펜을 보유한 fleet에 무료로 제공됩니다. 그 미만일 경우 펜 1대당 연간 $0.04가 월간으로 청구됩니다.
7. 텔레메트리 파이프라인 및 지표 구성의 SVG 시각화
8. 비용
| 서비스 | 비용 | 비고 |
|---|---|---|
| 호스팅형 텔레메트리 대시보드 (5,000개 이상 펜) | OEM 포털에 포함 | 무료 |
| 호스팅형 텔레메트리 대시보드 (5,000개 미만 펜) | $0.04/펜/연 | 월간 청구 |
| 자체 호스팅형 텔레메트리 싱크 | 연간 $1,800 | 유통사별 |
| 맞춤 이벤트 클래스 (유형당) | 일회성 $2,400 + 펜 1대당 연간 $0.06 | OEM 파트너당 |
| 개인정보 영향 평가 지원 | $1,200 | 지역당 |
| 데이터 삭제 인증서 (GDPR Art. 17) | $0 | 포털에서 셀프 서비스 |
구매자 팁:EU 지역에 10,000개 이상의 펜을 배포하는 경우, PO 체결 전에 샘플 데이터 삭제 인증서를 포털에서 요청하시기 바랍니다. 인증서는 삭제 타임스탬프와 삭제된 레코드 집합의 SHA-256 해시가 포함된 1페이지 PDF입니다.
8. 부록: 익명화 처리 예시 및 이벤트 클래스 인벤토리
8.1 익명화 처리 예시
사우디아라비아 학교 현장에 실제 배치된 Q8에서 수집한 아래 원시 이벤트 시퀀스를 기준으로, 4단계 익명화 파이프라인의 각 단계를 추적합니다.\n
원시 oid.조회 이벤트 (현지 시간 14:00–14:15, 샘플 구간):
14:02:11 oid.lookup serial=QC8-24-118-00472 lat=98ms page=412 word="الفيل"
14:03:48 oid.lookup serial=QC8-24-118-00472 lat=104ms page=412 word="يمشي"
14:05:22 oid.lookup serial=QC8-24-118-00472 lat=88ms page=412 word="ببطء"
14:09:17 oid.lookup serial=QC8-24-118-00472 lat=101ms page=412 word="في"
14:11:46 oid.lookup serial=QC8-24-118-00472 lat=94ms page=412 word="الحديقة"
1단계 — 식별자 제거. 시리얼 번호는 부팅마다 갱신되는 128비트 솔트로 대체된 후 32비트 버킷 ID로 해시됩니다. 버킷 ID 0x4A12F8E1 솔트 없이는 시리얼로 역추적할 수 없으며, 솔트는 다음 콜드 부팅 시 삭제됩니다.
2단계 — 값을 버킷화합니다. 지연 시간은 가장 가까운 10ms 단위로 반올림됩니다. 페이지는 CEFR A1(1–500쪽), A2(501–1,200쪽), B1(1,201–2,000쪽)로 버킷화됩니다.
3단계 — 해시 지문을 생성합니다. 이 윈도우에는 스택 트레이스가 포함되지 않습니다.
4단계 — 소스에서 집계합니다. 5개의 이벤트가 하나의 레코드로 축소됩니다.
결과: 14:15에 하나의 레코드가 업로드됩니다.
{
"fleet_id": "0x4A12F8E1",
"model": "Q8",
"fw": "3.3.1",
"region": "SA",
"window": "2026-09-12T14:15:00Z",
"events": {
"oid_lookup_count": 5,
"oid_lookup_p95_ms": 100,
"cefr_bucket": "A2"
}
}
이것이 플릿 대시보드에 표시되는 내용입니다. 어린이, 학부모 또는 특정 펜으로 되돌아갈 수 있는 경로는 존재하지 않으며, 버킷 ID는 매 부팅 시마다 새로 생성됩니다.
8.2 전체 이벤트 클래스 목록 (n = 44)
하위 시스템 및 기본 정책별로 그룹화된 전체 이벤트 분류 체계:
| ID | 이벤트 | 정책 | 집계 윈도우 | 비고 |
|---|---|---|---|---|
| 0x01 | 부팅.시작 | 원격측정 | 15분 | 콜드 부팅 횟수 집계 |
| 0x02 | 부팅.종료 | 원격측정 | 15분 | 콜드 부팅 소요 시간 |
| 0x03 | 전력.소모 | 원격측정 | 15분 | 배터리 소모율 |
| 0x04 | 전력.충전 | 원격측정 | 15분 | 충전 전류 피크값 |
| 0x05 | 키.입력 | 로컬 | n/a | 버튼 매핑 |
| 0x06 | 책.열기 | 로컬 | n/a | 재개 위치 |
| 0x07 | 책.닫기 | 로컬 | n/a | 재개 위치 |
| 0x08 | oid.조회 | 원격측정 | 15분 | 버킷화된 지연 시간 |
| 0x09 | oid.미스 | 원격측정 | 15분 | 로드된 모든 도서에 코드가 존재하지 않음 |
| 0x0A | 사전.적중 | 원격 측정 | 15분 | 캐시 적중률 |
| 0x0B | 사전.미스 | 원격 측정 | 15분 | 콜드 룩업 지연 |
| 0x0C | lp.로드 | 원격 측정 | 15분 | LP 서명 검증 |
| 0x0D | tts.발화 | 원격 측정 | 15분 | 첫 바이트 지연 |
| 0x0E | 음성인식.발화 | 지원 | 세션당 | 옵트인 전용 |
| 0x0F | 음성인식.결과 | 지원 | 세션당 | 옵트인 전용 |
| 0x10 | 앱.크래시 | 원격측정 | 15 분 | 스택 해시 |
| 0x11 | 앱.오류 | 원격측정 | 15 분 | 심각도 0–3 |
| 0x12 | 펌웨어.업데이트 | 원격측정 | 릴리스별 | OTA 스테이징 |
| 0x13 | 펌웨어.롤백 | 원격측정 | 릴리스별 | 롤백 횟수 |
| 0x14 | 사전.업데이트 | 원격측정 | 릴리스별 | 사전 OTA |
| 0x15 | lp.업데이트 | 원격측정 | 릴리스별 | LP OTA |
| 0x16 | wifi.연결 | 원격 측정 | 15 분 | 인증 시간 |
| 0x17 | wifi.실패 | 원격 측정 | 15 분 | 인증 실패 |
| 0x18 | ble.페어링 | 원격 측정 | 15 분 | SSP 확인 |
| 0x19 | ble.실패 | 원격 측정 | 15 분 | 페어링 실패 |
| 0x1A | nfc.읽기 | 로컬 | 해당 없음 | 태그 UID만 |
| 0x1B | usb-c.연결 | 로컬 | 해당 없음 | USB-C 삽입 횟수 |
| 0x1C | usb-c.pd | 원격 측정 | 15 분 | PDO 수락 |
| 0x1D | 배터리.상태 | 원격 측정 | 매일 | 용량 감소 |
| 0x1E | 열.경고 | 원격 측정 | 15 분 | PMIC 열 |
| 0x1F | wear.delta | 원격 측정 | 매일 | 플래시 마모 카운터 |
| 0x20 | err.s0 | 원격 측정 | 이벤트당 | 글로벌 정지 트리거 |
| 0x21 | err.s1 | 원격 측정 | 15 분 | S1 횟수 |
| 0x22 | err.s2 | 원격 측정 | 15분 | S2 횟수 |
| 0x23 | err.s3 | 원격 측정 | 15분 | S3 횟수 |
| 0x24 | 앱.로케일 | 로컬 | 해당 없음 | UI 언어 |
| 0x25 | 앱.테마 | 로컬 | 해당 없음 | UI 테마 |
| 0x26 | 음성.클립 | 지원 | 세션당 | 옵트인 전용 |
| 0x27 | 음성.공유 | 지원 | 세션당 | 옵트인 전용 |
| 0x28 | 음성.삭제 | 지원 | 세션당 | 옵트인 전용 |
| 0x29 | 사전.덮어쓰기 | 지원 | 세션당 | 옵트인 전용 |
| 0x2A | 보호자.pin | 로컬 | 해당 없음 | 보호자 통제 |
| 0x2B | 화면.시간 | 로컬 | 해당 없음 | 일일 사용 시간 |
| 0x2C | 세션.종료 | 원격 측정 | 15분 | 세션 지속 시간 |
전체 44개 이벤트 중 18개는 로컬, 19개는 원격 측정, 7개는 지원 등급입니다. 전체 목록은 OEM 포털의 개인정보 영향 평가 템플릿에서 확인하실 수 있습니다.
10. 시각 자료: 이벤트 등급 분포 및 대역폭 예산
아래 시각 자료는 세 가지 이벤트 등급(LOCAL/TELEMETRY/SUPPORT)에 대한 원형 차트와 펜당 월간 대역폭 예산을 나타낸 세로 막대 차트를 결합한 것입니다. 152KB는 학교 구매 담당자와 공유하는 공식 계약 수치입니다.