---
title: "Discord/Twitch/Snapchat 나이 인증 우회 — k-id의 얼굴 메타데이터 기반 검증이 뚫린 과정"
published: 2026-02-11T22:56:41.000Z
canonical: https://jeff.news/article/670
---
# Discord/Twitch/Snapchat 나이 인증 우회 — k-id의 얼굴 메타데이터 기반 검증이 뚫린 과정

Discord 등이 사용하는 k-id 나이 인증 서비스가 얼굴 이미지 대신 메타데이터만 전송하는 구조적 취약점으로 인해, 연구자들이 AES-GCM 암호화와 예측 배열을 리버스 엔지니어링하여 인증을 우회함. 패치 후에도 재우회되었으며 현재 다시 패치된 상태.

- Discord가 사용하는 나이 인증 서비스 k-id는 실제 얼굴 이미지를 서버로 보내지 않고, 얼굴에 대한 **메타데이터만** 전송함 — 프라이버시에는 좋지만 우회에 취약한 구조
- 연구자들이 이 프로토콜을 리버스 엔지니어링해서 합법적으로 보이는 메타데이터를 생성, 서버가 진짜와 구분할 수 없게 만듦

## 우회 과정

- **1단계 — 암호화 복제**: `encrypted_payload`, `auth_tag`, `timestamp`, `iv` 파라미터가 AES-GCM 암호화로 보호되고, 키는 nonce + timestamp + transaction_id를 HKDF(SHA-256)로 파생함 — 이 과정을 그대로 재현
- **2단계 — 예측 데이터 조작**: `outputs`, `primaryOutputs`, `raws` 배열이 핵심 검증 대상이었음. `raws`의 원시 숫자가 나이 출력값으로 매핑되고, z-score로 이상치를 1회(primaryOutputs) 또는 2회(outputs) 제거하는 구조를 파악함
- **추가 검증 항목**: `xScaledShiftAmt`/`yScaledShiftAmt`는 두 가지 값 중 하나여야 하고, 카메라 이름이 디바이스 목록과 일치해야 하며, 상태 완료 시간이 타임라인과 맞아야 함

## 패치와 재우회

- k-id의 얼굴 스캔 파트너 faceassure가 `recordedOpennessStreak`, `recordedSpeeds`, `failedOpennessReadings` 등의 값을 서버 측에서 교차 검증하는 패치를 비공개로 적용함
- 이 패치도 우회됨 — 현재는 다시 패치된 상태이며, 연구자들은 새로운 우회 방법을 작업 중
- 근본적으로 **클라이언트 측 데이터만으로 검증하는 구조**는 리버스 엔지니어링에 항상 취약할 수밖에 없음을 보여주는 사례

## 핵심 포인트

- k-id는 얼굴 이미지가 아닌 메타데이터만 서버로 전송하는 프라이버시 우선 설계
- AES-GCM + HKDF(SHA-256) 암호화를 완전히 복제하고 prediction 배열의 z-score 기반 이상치 제거 로직을 파악
- 카메라 이름 매칭, 상태 타임라인 검증 등 추가 체크도 우회됨
- faceassure의 서버 측 교차 검증 패치도 우회되어 클라이언트 데이터 기반 검증의 한계를 드러냄

## 인사이트

클라이언트에서 생성된 메타데이터만으로 신원을 검증하는 방식은 근본적으로 리버스 엔지니어링에 취약하며, 진정한 나이 인증에는 서버 측에서 독립적으로 검증 가능한 데이터가 필요함.
