우리 제품을 직접 만들고 운영합니다.

Fantagram은 세 분야에서 전문적인 노하우를 축적한 AI 네이티브 팀입니다. KTRENZ로 데이터를, Welike로 커머스를, Krypton으로 비공개 소통을 다룹니다.

[email protected]

01제품

  1. KTRENZ

    상태: ktrenz.com에서 운영 중

    KTRENZ 데이터 리포트 화면. 최근 90일 동안 KTRENZ가 추적한 K-pop 발매 가운데 41%가 3세대 아티스트였다는 영어 제목과 41%라는 큰 숫자, 세대별 발매 비율 막대그래프가 보입니다.
    ktrenz.com의 데이터 리포트

    한류를 측정하는, 영어 중심의 K-컬처 데이터 플랫폼이자 매체입니다.

    • Trend는 한국 검색량, YouTube, 언론 보도, 챌린지를 합친 7일 변화 속도로 아티스트 순위를 매깁니다.
    • 공개 데이터는 키 없이 부를 수 있는 공개 REST 엔드포인트 4개로 내놓습니다.
    • K-Track은 KTRENZ 자체 서버 로그로, 발매 페이지마다 어떤 답변 엔진이 가져가는지 셉니다.
    플랫폼
    웹, 반응형
    스택
    • Next.js 14, React 18, TypeScript
    • Supabase (Postgres)
    • Cloudflare Pages, Workers

    ktrenz.com작동 방식

  2. Welike

    상태: 출시 전, 가입 받는 중

    Welike 크리에이터용 페이지. 어두운 바탕에, 정말 올리고 싶은 K-뷰티 캠페인에 초대받으라는 영어 제목과 크리에이터를 K-뷰티 캠페인에 연결해 준다는 설명이 있습니다.
    welike.show의 크리에이터용 페이지

    K-뷰티 브랜드가 미국 법인이나 미국 물류, 현지 팀 없이도 미국 TikTok Shop에서 판매할 수 있게 하는 관리형 플랫폼입니다.

    • 브랜드와 미국 TikTok 크리에이터를 이어 주고, 초대·무료 샘플·커미션을 처리합니다.
    • 영상마다 공개 전에 FTC #ad 표시 의무와 FDA/MoCRA 화장품 효능 표현 규정을 점검합니다.
    • TikTok Shop Open API(OAuth, 웹훅)와 연동하고, 결제와 정산은 Stripe Connect로 처리합니다.

    Fantagram이 만들고 관리합니다. Welike는 판매 책임 주체(merchant of record)이자 TikTok Shop 판매자인 미국의 Milestone Innovation Labs Inc.가 한국의 주식회사 위라이크와 함께 운영합니다.

    플랫폼
    웹: 브랜드 앱(한국어), 크리에이터 앱(영어)
    스택
    • React 18, Vite, TypeScript
    • Supabase(Postgres, Edge Functions 18개)
    • Cloudflare Pages

    welike.show작동 방식

  3. Krypton

    상태: iOS는 TestFlight 시험 중, Android는 빌드 완료

    폰으로 본 krypton.today의 ‘관계’ 구역. 1촌과 2촌을 설명하는 글 아래에 ‘나’와 이어진 사람들의 관계도가 있습니다. 폰으로 본 krypton.today의 ‘봉인’ 구역. 종단간 암호화를 설명하는 글 아래에 이름과 한 줄 소개가 암호문으로 보이는 칸이 있습니다.
    폰으로 본 krypton.today

    서로 실제로 아는 사람들끼리 쓰는, 초대로만 들어오는 소셜 앱입니다.

    • 글, 답, 사진, 영상, 프로필을 종단간 암호화합니다. 우리 서버는 이를 읽을 수 없습니다.
    • 전화번호나 이메일 없이 가입합니다. 계정은 폰에서 만든 열쇠입니다. 되찾을 방법을 준비해 두면 폰을 잃어버려도 PIN을 넣고 열쇠 조각을 맡긴 1촌들의 도움을 받아 계정을 되찾을 수 있습니다.
    • 광고가 없습니다. 화면 캡처를 막습니다.
    플랫폼
    iOS, Android
    스택
    • Expo, React Native, TypeScript
    • Rust 암호 코어, Swift, Kotlin
    • Supabase
    • Cloudflare Workers, R2

    krypton.today작동 방식보안 설계

02작동 방식

KTRENZ

KTRENZ는 공개된 데이터를 정해진 일정에 따라 모아 측정하고, 그 결과를 사이트와 공개 데이터로 내놓습니다.

공개된 출처에서 공개 데이터까지
  1. 1

    출처. YouTube, Naver, X, TikTok, Ticketmaster, TMDB, 한국 공공데이터, 그리고 KTRENZ 자체 서버 로그.

  2. 2

    수집. Cloudflare Workers 크론이 1분마다, 10분마다 돌며 17가지 예약 작업을 시작하고, 작업은 Supabase의 Postgres에 기록합니다.

  3. 3

    측정. Trend는 한국 검색량, YouTube, 언론 보도, 챌린지를 합친 7일 변화 속도로 아티스트 순위를 매깁니다. K-Track은 KTRENZ 자체 서버 로그(점선)를 읽어, 발매 페이지마다 어떤 답변 엔진이 가져가는지 셉니다.

  4. 4

    발행. ktrenz.com, 키 없이 부를 수 있는 REST 엔드포인트 4개, 그리고 공식 MCP Registry에 등록된 원격 MCP 서버와 npm 패키지.

Welike

Welike는 K-뷰티 브랜드가 미국 크리에이터와 함께 미국 TikTok Shop에서 판매하게 하고, 브랜드가 판매를 시작하기 전과 영상이 공개되기 전에 각각 점검합니다. 아직 출시 전이라, 아래는 지금 만들어 둔 제품이 하는 일입니다.

상품 등록부터 정산까지
  1. 1

    브랜드. 한국어 브랜드 웹 앱에서 상품을 등록하거나 Amazon에서 가져옵니다.

  2. 2

    점검. 브랜드마다 규정 준수 체크리스트를 거치고, 서류를 두 단계로 검토합니다. 검토 결과는 참고용이며 결정은 사람이 합니다.

  3. 3

    크리에이터. 영어 크리에이터 앱에서 미국 크리에이터를 매칭하고 초대합니다. 크리에이터는 무료 샘플을 받고 커미션을 법니다.

  4. 4

    점검. 크리에이터 영상은 하나하나 공개 전에 FTC #ad 표시 의무와 FDA/MoCRA 화장품 효능 표현 규정을 점검합니다.

  5. 5

    TikTok Shop. 주문은 TikTok Shop Open API로 들어오며, OAuth와 웹훅을 씁니다.

  6. 6

    Stripe. 결제와 정산은 Stripe Connect로 처리합니다.

Krypton

Krypton은 사람들이 쓴 내용을 각자의 폰에서 봉인합니다.

글 봉인하기
  1. 1

    글쓴이의 폰이 Rust 코어 안에서 새 콘텐츠 열쇠를 만듭니다.

  2. 2

    그 열쇠로 글의 본문, 사진, 영상을 암호화합니다. 본문은 먼저 정해진 크기 단위까지 채우므로 정확한 길이가 드러나지 않습니다. 프로필도 폰에서 봉인합니다.

  3. 3

    콘텐츠 열쇠를 읽는 사람마다 그 사람의 암호화 열쇠로 봉인합니다. 읽는 사람 한 명에 104바이트 봉투 하나입니다.

  4. 4

    읽는 사람의 폰이 Rust 코어 안에서 자기 암호화 열쇠로 자기 봉투를 엽니다.

  5. 5

    글을 복호화합니다.

그 사이에서 서버는 암호문과 봉투를 저장하고 전달합니다. 서버는 누가 누구에게 언제 보냈는지는 보지만, 글, 답, 사진, 영상, 이름, 프로필은 읽을 수 없습니다. 서버가 볼 수 있는 것과 없는 것은 아래 보안 설계에 모두 적었습니다.

새 폰에서 계정 되찾기
  • 준비. PIN 여섯 자리를 정하고 1촌 2~7명을 고릅니다. 폰은 두 반쪽 T와 U로 만든 비밀 S로 계정 열쇠와 암호화 열쇠를 백업에 봉인합니다. T는 열쇠 조각으로 나뉘며, 아무 조각 2개면 T를 다시 만들 수 있습니다. 조각은 하나씩 1촌 한 명에게 봉인합니다. 우리 서버는 U와 백업, 봉인된 조각을 보관하고, 각 조각은 그 1촌의 폰만 열 수 있습니다. 폰은 PIN을 스트레칭한 값만 보내고, 틀린 횟수는 서버가 셉니다.

  • 폰을 잃어버리면. 1촌이 한 번만 쓸 수 있는 되찾기 링크를 보내 줍니다. 새 폰에서 PIN을 넣으면, 조각을 맡은 1촌들이 전화로 본인인지 확인한 뒤 자기 조각을 열어 새 폰의 열쇠로 다시 봉인합니다.

  • 기다림. 서버는 맞는 PIN을 넣은 지 48시간이 지났고 조각을 맡은 1촌 2명이 확인했으면 U와 백업을 내줍니다. PIN 없이는(1촌을 4명 이상 골라 두었을 때) 맡은 1촌 4명이 확인했고 14일이 지났으면 내줍니다. 예전 폰에도 되찾기 요청이 전해지며, 예전 폰에서 요청을 취소할 수 있습니다. PIN을 다섯 번 틀리면 하루 동안 되찾기가 잠깁니다.

  • 다시 들어오기. 새 폰이 Rust 코어 안에서 S를 다시 만들어 백업을 열고, 되찾은 계정 열쇠로 새 기기 열쇠에 서명합니다. 예전 기기는 로그아웃됩니다.

  • 누구도 혼자서는 못 합니다. 조각을 맡은 1촌 한 명으로는 안 됩니다. 맡은 1촌들도 U 없이는 안 되고, U는 서버가 위 조건에서만 내줍니다. 서버는 T 없이는 안 됩니다. 맡은 1촌들은 우리 서버가 넘겨준 새 폰 열쇠에 조각을 다시 봉인하지만, 통화 중에 새 폰 화면의 숫자 여섯 자리를 듣고 쳐 넣어 맞을 때만 봉인합니다. 서버가 바꿔치기한 열쇠가 이 숫자와 맞을 확률은 맡은 1촌마다 100만분의 1입니다. 이 확인은 통화 목소리를 흉내 내는 일을 막지 못하고, 옛 판의 앱을 쓰는 맡은 1촌에게는 없으며, 준비 때 맡은 1촌의 열쇠를 바꿔치기하는 일은 받는 사람 확인을 켜야 막힙니다.

초대로 가입하기
  1. 1

    요청. 폰에서 열쇠를 만듭니다. 전화번호도 이메일도 쓰지 않습니다. 아는 회원에게 초대 요청을 링크나 QR 코드로 보냅니다. 링크에는 이름이 없습니다. 이름과 한 줄 소개는 링크의 # 뒤 비밀에서 뽑은 열쇠로 봉인되며, 우리 서버는 그 비밀을 받지 않습니다. 그다음 단계에서도 이름은 봉인되거나 솔트를 넣은 해시로만 오갑니다.

  2. 2

    초대와 확인. 기존 회원이나 Krypton 팀이 초대하고 확인합니다. 원칙적으로는 회원 두 사람이 함께 초대하고 각각 확인하며, Krypton 회원이 정해진 수에 이를 때까지는 한 사람이면 됩니다. 초대와 확인에는 각자 자기 열쇠로 서명하고, 우리 서버가 이를 기록합니다. 이름 없는 초대를 켜기 전까지는 초대 링크의 # 뒤에 초대한 사람의 이름이 실립니다.

  3. 3

    회원. 이제 회원입니다. 확인해 준 사람은 대부가 되어 내 명함에 나옵니다.

03보안 설계

Krypton의 암호화는 iOS와 Android가 함께 쓰는 Rust 코어 하나에서 돌아갑니다.

Rust 코어의 암호 기본 요소
기본 요소쓰임
X25519읽는 사람에게 콘텐츠 열쇠를 봉인합니다. 봉투마다 새 일회용 열쇠 쌍과 읽는 사람의 공개 열쇠를 씁니다. 모두 0인 공유 비밀은 거부합니다.
Ed25519계정 신원 열쇠와 기기별 기기 열쇠. 계정 열쇠는 각 기기의 인증서와 계정의 암호화 열쇠에 서명합니다.
XChaCha20-Poly1305봉인하는 모든 것의 암호화와 인증: 글 본문, 봉투, 감싼 열쇠, 되찾기 백업, 사진, 영상. 논스는 무작위 24바이트이고, 파일의 청크는 무작위 기준 논스에 청크 번호를 합쳐 씁니다.
HKDF-SHA256X25519 공유 비밀에서 양쪽 공개 열쇠를 솔트로 넣어 봉투별 열쇠를 유도하고, 두 반쪽에서 되찾기 비밀을 유도합니다. 쓰임마다 라벨이 따로 있습니다.
GF(28) 위의 Shamir 비밀 분산되찾기 비밀의 한쪽 반을 열쇠 조각으로 나눕니다. 유한체 연산은 조회 테이블 없이 상수 시간으로 계산합니다.
OS 난수 생성기모든 열쇠, 논스, 열쇠 조각의 계수.
열쇠가 있는 곳
개인 열쇠
Rust 코어 안의 네 자리: 계정(Ed25519), 기기(Ed25519), 암호화(X25519), 임시 되찾기 열쇠(X25519).
콘텐츠 열쇠
항목마다 새로 만드는 무작위 열쇠로, 코어 안에 둡니다. 앱은 열쇠 값이 들어 있지 않은 불투명한 핸들만 받습니다.
저장 상태
iOS는 Keychain에 둡니다. Android는 Android Keystore에 있는 열쇠로 암호화해 둡니다. 개인 열쇠는 네이티브 래퍼가 그곳에 저장할 때만 코어 밖으로 나옵니다.
JavaScript
앱의 JavaScript에 개인 열쇠를 돌려주는 호출은 하나도 없습니다. 경계 점검이 앱 코드에 열쇠를 다루는 곳이 있는지 살핍니다.
우리 서버
공개 열쇠. 되찾기용으로는 백업, 서버 반쪽 U, 그리고 1촌별 열쇠 조각입니다. 조각은 그 1촌의 폰만 열 수 있게 봉인되어 있습니다. 이 가운데 무엇도 T 없이는 백업을 열지 못합니다(위 되찾기 그림). 되찾기 링크는 비밀 키를 섞은 해시(HMAC)로만 두고, 요청이 끝나고 사흘 뒤 지웁니다. 그 밖에 Krypton 팀 웹 계정의 열쇠가 있으며, 우리 서버에 없는 암호 문구로 잠겨 있습니다.
열쇠 확인
폰은 서로의 공개 열쇠를 우리 서버에서 받고, 각 암호화 열쇠가 그 계정 열쇠로 서명됐는지 확인합니다. 앱 안에서 열쇠를 서로 견줘 볼 방법은 아직 없습니다. 그래서 이 확인은 우리 서버가 올바른 계정 열쇠를 나눠 준다는 데 기댑니다. 받는 사람 확인(창립자와 Krypton 팀에서 이어지는 회원 증서, 1촌마다 두 사람의 서명, 2촌은 확인된 1촌을 거치는 경로)은 만들어 두었고 아직 켜지 않았습니다. 켜기 전까지는 우리 서버에 가짜 회원·1촌·열쇠가 끼어들면 폰이 그쪽에도 봉인할 수 있습니다. 되찾기에서는 조각을 맡은 1촌이 통화 중에 숫자 여섯 자리로 새 폰의 열쇠도 확인합니다.
Krypton 서버가 볼 수 있는 것과 없는 것

읽을 수 없음

  • 글, 답, 사진, 영상. 파일은 암호문으로 저장됩니다.
  • 이름, 한 줄 소개, 프로필 사진. 명함(이름, 한 줄 소개, 대부의 계정 번호, 사진의 굵은 모자이크)과 반쯤 흐린 사진은 명함 주인이 ‘1촌만’을 고르면 1촌마다, ‘2촌까지’(기본값이고, 창립자는 ‘전체 공개’로 시작)나 ‘전체 공개’를 고르면 1촌과 2촌마다 따로 봉인됩니다. ‘전체 공개’로 둔 명함은 회원 열쇠로도 봉인되어 Krypton 팀 계정을 포함한 모든 회원에게 열립니다. 회원 한 사람의 열쇠와 우리 데이터베이스 사본을 함께 가진 사람은 이런 명함을 모두 읽을 수 있습니다. 반쯤 흐린 사진은 어느 범위에서도 2촌 밖으로 가지 않고, 사진 자체는 1촌에게만 열립니다. 범위를 좁히면 우리 서버가 회원 열쇠로 봉인한 것을 곧바로 지우고, ‘1촌만’이면 1촌이 아닌 사람의 봉투도 곧바로 지웁니다. 그다음 폰이 새 열쇠로 명함을 다시 봉인하고, 사진이 계속 열리도록 사진의 열쇠는 그대로 둡니다. 범위가 넓던 동안 이미 받아 간 열쇠와 이미 본 내용은 되돌릴 수 없습니다. ‘1촌만’으로 둔 명함이면 우리 서버는 앱이 어느 판이든 1촌이 아닌 사람의 봉투를 받지 않습니다. 범위는 이 명함에만 적용되고, 한 사람에게 보내는 명함(다음 항목)에는 적용되지 않습니다. 두 단계만 보여 주던 이전 판의 앱에서는 좁은 쪽이 ‘2촌까지’이고, 거기서 어느 쪽을 고르든 ‘1촌만’이 풀립니다. 공개 범위가 없던 판의 앱으로 올린 명함은 앱을 새로 받아 다시 올릴 때까지 회원 열쇠로 봉인되어 있습니다. 팀 계정에서 회원 열쇠를 빼는 일은 만들어 두었고 아직 켜지 않았습니다.
  • 한 사람에게 보내는 명함. 1촌 청이나 캡처·사진 저장 소식에 실리는 명함, 대화에 있는 사람에게 가는 명함은 받는 사람마다 따로 그 사람의 열쇠로 봉인됩니다. QR 코드, 1촌 링크, 초대 요청 링크에 실리는 명함은 링크의 # 뒤 비밀에서 뽑은 열쇠로 봉인되며, 우리 서버는 그 비밀을 받지 않습니다. 지우기 전까지는 링크와 우리 데이터베이스 사본을 함께 가진 사람이 열 수 있습니다. 이 사본들은 요청이 끝날 때, 1촌 링크가 하루 뒤 만료될 때, 그 사람이 대화에서 나갈 때 지우고, 요청과 소식은 30일이 지나면 정리합니다. 링크에 이름이 없는 초대는 만들어 두었고 아직 켜지 않았습니다. 지금은 초대 링크의 # 뒤에 초대한 사람의 이름이 실립니다.
  • 링크 미리보기. 글쓴이의 폰이 만들어 글과 함께 봉인합니다.
  • 글의 정확한 길이. 본문은 256바이트부터 시작하는 크기 단위까지 채웁니다.
  • 새로 온 답의 내용. 서버는 정해진 문구 한 줄과 봉인한 사본을 보내고, 잠금이 풀린 iPhone이 그 사본을 열어 누가 썼는지 보여 줍니다.
  • 전화번호와 이메일 주소. 처음부터 받지 않습니다.

볼 수 있음

  • 계정마다 무작위 계정 번호, 회원 상태, 공개 열쇠, 그리고 명함의 공개 범위.
  • 누가 누구와 1촌인지, 누가 누구를 초대하고 확인했는지, 그리고 그 시각.
  • 누가 누구에게 글을 건넸는지.
  • 글마다 누가 봉투를 가졌는지, 대화마다 누가 있는지, 그리고 언제 들어오고 나갔는지.
  • 글과 답마다 쓴 사람, 받는 사람, 시각.
  • 차단, 신고, 그리고 푸시용 기기 토큰.
  • 캡처 시도와 사진 저장: 누가, 누구의 글이나 페이지에서, 언제.
  • 파일 크기. 사진과 영상은 크기 단위까지 채우지 않습니다.
  • 신고된 글과 그 글쓴이의 이름. 신고한 사람이 우리에게 열어 줍니다.
  • IP 주소와 요청 시각. 호스팅 업체의 접속 기록에 남습니다. 초대 없이 가입하는 경우에는 가입 수를 제한하려고 우리 데이터베이스가 IP에 비밀 키를 섞은 해시를 이틀 동안 보관합니다.
구현과 점검
메모리
Rust 코어 안에서 열쇠와 복호화한 바이트는 해제될 때 0으로 덮어쓰는 버퍼에 둡니다. Swift·Kotlin 래퍼에 넘기는 버퍼도 마찬가지입니다. 복호화한 사진과 영상은 다시 복호화하지 않고 열 수 있게 폰의 캐시에 둡니다. 이 캐시는 로그아웃할 때와 계정을 없앨 때 비웁니다.
unsafe 코드
크레이트 전체에서 unsafe를 금지합니다. Swift(C ABI)와 Kotlin(JNI)을 잇는 경계 파일 두 개만 허용합니다.
경계
코어 코드를 실행하는 모든 C 진입점이 패닉을 잡습니다. 그래서 코어 안에서 실패해도 앱에는 오류 코드가 돌아갑니다.
큰 파일
인증된 64 KiB 청크 단위로 암호화합니다. 파일을 자르거나, 순서를 바꾸거나, 늘리거나, 다른 파일과 이어 붙이면 실패합니다. 복호화한 파일은 파일 전체가 검증된 뒤에야 나타나며, 실패한 파일은 아무것도 남기지 않습니다.
Rust 테스트
22개: 단위 테스트 19개, 공유 테스트 벡터로 하는 테스트 2개, C 헤더가 내보낸 함수와 맞는지 보는 검사 1개.
테스트 벡터
Rust 코어와 앱의 JavaScript 개발용 코어는 같은 바이트 형식을 쓰며, 서로의 고정 테스트 벡터를 열 수 있어야 합니다.
검토
출시 전 내부 검토에서 일곱 영역을 살폈습니다. 데이터베이스 권한, 서버 함수, 요청 수 제한, 미디어 저장소, 앱, 운영 도구, 비밀 값입니다. 코드를 읽고, 서버의 로컬 사본에 공격을 시도했습니다. 독립 감사는 아직 받지 않았습니다.

04기술

플랫폼
웹, iOS, Android
개발 언어
TypeScript, SQL, Rust, Swift, Kotlin
인프라
Cloudflare, Supabase (Postgres)
자동 테스트
코드베이스 세 곳에 걸쳐 5,000개가 넘는 테스트 케이스
  • 크로스 플랫폼 모바일네이티브 Swift(iOS)·Kotlin(Android) 모듈을 붙인 Expo·React Native 앱.쓰는 제품: Krypton
  • 응용 암호iOS와 Android가 함께 쓰는 Rust 암호화 코어 하나, Keychain·Keystore에 두는 열쇠, Shamir 비밀 분산으로 1촌들이 돕는 열쇠 되찾기.쓰는 제품: Krypton
  • 엣지 웹 플랫폼엣지 런타임의 Next.js와 Pages Functions를 쓴 React 앱. 둘 다 Cloudflare에 배포합니다.쓰는 제품: KTRENZ, Welike
  • 데이터 파이프라인과 측정YouTube, Naver, X, TikTok, Ticketmaster, TMDB, 한국 공공데이터에서 모으는 Cloudflare Workers 예약 작업, 그리고 그 데이터로 만든 7일 변화 속도 순위.쓰는 제품: KTRENZ
  • 공개 API키 없이 부를 수 있는 REST 엔드포인트, 그리고 공식 MCP Registry에 등록된 원격 MCP 서버와 npm 패키지.쓰는 제품: KTRENZ
  • 커머스와 결제TikTok Shop Open API, Stripe Connect 정산, Stripe 구독, 서버 통지를 받는 App Store 구독.쓰는 제품: KTRENZ, Welike, Krypton
  • 규정 준수 도구FTC 광고 표시 의무와 FDA/MoCRA 화장품 효능 표현 규정 점검, 브랜드 서류 2단계 검토(참고용이며 결정은 사람이 함).쓰는 제품: Welike
  • Postgres 백엔드행 수준 보안, Edge Functions, 관리되는 마이그레이션 741개를 갖춘 Supabase Postgres.쓰는 제품: KTRENZ, Welike, Krypton
  • 다국어 제품한 앱 안의 한국어·영어·일본어, 그리고 나란히 운영하는 한국어 브랜드 앱과 영어 크리에이터 앱.쓰는 제품: Welike, Krypton

05문의

제휴, 언론, 그 밖의 문의.

[email protected]

제품에 관한 문의는 각 제품 사이트에서 받습니다.