Files
llm-wiki/raw/official-docs/cuid2-spec.md
T

10 KiB

title, source_type, url, archive_url, related_branches, related_projects, tags, created
title source_type url archive_url related_branches related_projects tags created
official-doc / CUID2 — Secure Collision-Resistant ID Specification (paralleldrive) official-doc https://github.com/paralleldrive/cuid2
feature-resource-identifier-contract
ca-skeleton
official-doc
ca-skeleton
api-design
security
idempotency
2026-05-31

official-doc / CUID2 — Secure Collision-Resistant ID Specification (paralleldrive)

Layer: raw/ — 외부 자료(공식 문서)의 원문 발췌·출처 기록. 검증된 요약은 /ingestwiki/concepts/source-summary-template 형식으로 별도 작성. 원본은 raw 에 영구 보관.

Parent / 활용 branch (필수)

Branch 이 자료가 정당화하는 결정
raw/branch-notes/feature-resource-identifier-contract D1 (resource ID default 형식) — CUID2 를 privacy-sensitive 도메인의 후보로 채택하는 근거; D7 (timestamp leak 완화) — CUID2 가 timestamp 를 평문 노출하지 않음; D9 (enumeration/SecureRandom) — CUID2 의 암호학적 보안 설계

출처 / Source

  • 원본 URL: https://github.com/paralleldrive/cuid2
  • 아카이브 URL: (미확보)
  • 저자 / 조직: paralleldrive (Eric Elliott 외)
  • 발행일: (초기 공개 2022년, 지속 유지)
  • 마지막 확인일: 2026-05-31

왜 저장했는지 / Why archived

ca-skeleton 이 resource ID 기본 형식을 결정하는 과정에서 CUID2 를 후보군으로 평가하기 위해 보관. CUID2 의 핵심 차별점인 timestamp 비노출암호학적 해싱 기반 보안 설계가 UUIDv7 / ULID 의 privacy 약점(48bit timestamp 평문 노출)을 대체할 수 있는지 판단하는 근거 자료.

핵심 인용 / Key quotes (verbatim)

[§Security / Hashing] "The new Cuid2 hashes all sources of entropy into a random-looking string. Due to the hashing algorithm, it should not be practically possible to recover any of the entropy sources from the generated ids." — source: README.md §Security section (line 4 in fetched text)

[§Deprecation] "The changes in Cuid2 are significant and could potentially disrupt the many projects that rely on Cuid, so we decided to create a replacement library and id standard, instead. Cuid is now deprecated in favor of Cuid2." — source: README.md §Why not use Cuid? (line 10 in fetched text)

[§Alphabet / Encoding] "The string is Base36 encoded, which means it contains only lowercase letters and the numbers: 0 - 9, with no special symbols." — source: README.md §Alphabet section (line 13 in fetched text)

[§Collision Resistance] "The original Cuid...never had a problem with collisions in production systems using it" across "thousands of software implementations...with more than 100 million users generating ids." — source: README.md §Collision resistance (line 16 in fetched text)

[§Comparison] "Cuid2 is the only solution that passed all of our tests" against criteria including security, collision resistance, horizontal scalability, offline compatibility, and URL-friendliness. — source: README.md §Comparison section (line 19 in fetched text)

Claims Extracted / 추출된 주장

이 자료가 직접 말하는 것만 claim 으로 분리한다. 내 프로젝트에 적용한 결론은 여기에 쓰지 않는다. Claim ID 형식: CUID2-C<number>.

Claim ID Claim (이 자료가 직접 말하는 것) Evidence quote Strength Applies to Does not prove
CUID2-C1 CUID2 는 모든 entropy 소스(시스템 시각, 난수, 세션 카운터, 호스트 핑거프린트)를 SHA-3 해시로 결합하여 생성하므로, 생성된 ID 에서 timestamp 를 역산하는 것은 실질적으로 불가능하다 [§Security] "The new Cuid2 hashes all sources of entropy into a random-looking string. Due to the hashing algorithm, it should not be practically possible to recover any of the entropy sources from the generated ids." official-reference 보안/privacy-sensitive 도메인에서 user-facing resource ID 로 CUID2 채택 시 독립 제3자 보안 감사 결과가 아님 — 저자 주장. 내부 구현이 실제로 SHA-3 을 올바르게 사용하는지 외부에서 검증되지 않음
CUID2-C2 CUID v1 은 공식적으로 deprecated 되었고, CUID2 가 그 후계 라이브러리 및 ID 표준으로 지정되었다 [§Deprecation] "Cuid is now deprecated in favor of Cuid2." official-reference CUID v1 사용 중단 근거 / CUID2 채택 정당화 CUID v1 의 구체적인 보안 취약점 목록이 아님. "significant changes" 의 내용을 상세 설명하지 않음
CUID2-C3 CUID2 ID 는 소문자와 숫자(0-9)만 포함하는 Base36 인코딩이며, 특수 문자가 없다. 기본 길이는 24자이다 [§Alphabet] "The string is Base36 encoded, which means it contains only lowercase letters and the numbers: 0 - 9, with no special symbols." official-reference URL path variable 에서 특수 문자 escape 없이 사용 가능한지 판단 / RFC 3986 unreserved charset 적합성 평가 Base36 charset 이 RFC 3986 unreserved (ALPHA / DIGIT / "-" / "." / "_" / "~") 에 완전 부합한다는 독립 확인은 별도 필요
CUID2-C4 CUID (v1) 은 실제 프로덕션에서 충돌 문제가 보고된 적이 없으며, 1억 명 이상의 사용자를 가진 수천 개의 소프트웨어 구현에서 사용되었다 [§Collision Resistance] "The original Cuid...never had a problem with collisions in production systems using it" across "thousands of software implementations...with more than 100 million users generating ids." official-reference CUID 계열의 실전 검증 근거 CUID2 (v2) 의 충돌 저항성을 직접 검증한 것이 아님 — v1 의 사용 이력. 수학적 충돌 확률 계산 별도 필요
CUID2-C5 CUID2 는 보안, 충돌 저항성, 수평 확장성, 오프라인 호환성, URL 친화성 기준에서 평가한 결과 경쟁 대안들(NanoID, ULID 등) 중 유일하게 모든 테스트를 통과한 솔루션이라고 저자가 주장한다 [§Comparison] "Cuid2 is the only solution that passed all of our tests" official-reference ID 후보군 비교에서 CUID2 를 최종 후보로 포함시키는 근거 저자 자체 평가 기준이며, 독립 제3자 벤치마크가 아님. "tests" 의 구체적 내용과 방법론이 공개되어야 재현 가능

Strength 근거

이 자료는 프로젝트 저자(paralleldrive / Eric Elliott)가 작성한 GitHub README 임. 공식 라이브러리 문서이지만 독립 보안 감사나 표준 기구(IETF, NIST 등) 의 인증은 아님. 따라서 보안 관련 claim(CUID2-C1, CUID2-C5)은 official-reference 로 분류하되, 독립 검증이 없음을 Does not prove 에 명시.

Usage Boundaries / 적용 경계

  • 이 자료가 직접 증명하는 것:

    • CUID2-C1: CUID2 는 설계상 timestamp 를 ID 에 평문 노출하지 않으며, SHA-3 해싱으로 entropy 소스를 복원 불가능하게 만든다 (저자 주장 기준).
    • CUID2-C2: CUID v1 은 공식 deprecated 상태이며 CUID2 로의 전환이 권고된다.
    • CUID2-C3: CUID2 의 기본 출력 형태는 소문자 + 숫자(Base36), 24자, 특수 문자 없음.
    • CUID2-C4: CUID 계열은 대규모 실전 배포에서 충돌 이슈가 보고되지 않음.
    • CUID2-C5: 저자 기준으로 CUID2 는 NanoID, ULID 등 경쟁 대안보다 종합 우수하다고 평가됨.
  • 이 자료가 증명하지 않는 것:

    • CUID2 의 보안 특성이 제3자 감사(independent security audit)로 검증되었다는 사실.
    • CUID2 가 FIPS 140-2 / NIST 인증 환경에서 사용 가능하다는 사실.
    • Java / Kotlin 생태계에서 CUID2 를 production-ready 한 형태로 사용할 수 있는 공식 라이브러리가 존재한다는 사실 (README 는 JS 라이브러리 기준).
    • UUIDv7 / ULID 대비 DB index 성능 차이 (timestamp-ordered vs random 측면에서 CUID2 는 random에 가까움).
    • 24자 Base36 이 RFC 3986 unreserved charset 에 완전 부합한다는 공식 확인 (별도 RFC 3986 §2.3 대조 필요).
  • ca-skeleton 에 적용하려면 추가 확인이 필요한 것:

    • Java/Kotlin 용 CUID2 구현체 존재 여부 및 성숙도 (JS 생태계 기준 라이브러리임을 유의).
    • CUID2-C1 의 "practically impossible to recover entropy" 주장을 뒷받침하는 공개 보안 분석 또는 감사 보고서.
    • CUID2 의 충돌 확률 수식 (24자 Base36 = ~124bit 엔트로피, 수식 검증 필요).
    • 다른 privacy 요구사항 문서(GDPR Article 25 / CCPA)에서 timestamp-free ID 를 명시적으로 요구하는지 여부.

메모 / Notes

  • 이 자료는 JavaScript 라이브러리의 README 임. ca-skeleton 은 Java/Spring Boot 기반이므로 Java 용 동등 구현(예: f4-cuid2, com.github.f4b6a3 계열 등)을 별도로 평가해야 함. 해당 Java 라이브러리는 이 README 에서 다루지 않음.
  • CUID2-C5 의 "passed all of our tests" 는 저자 자체 기준. 독립 재현 불가 → 비교 결론을 D1 결정의 주된 근거로 단독 사용 금지. RFC 9562 (UUID v7), ULID spec, NanoID README 와 병렬 검토 권고.
  • timestamp leak 이 실질적 위협인 시나리오: 의료 기록 ID (처방 시각 역산), 금융 거래 ID (주문 시각 → 전략 노출), 사용자 계정 ID (가입 순서 → early adopter 타깃). ca-skeleton 이 도메인 무관한 skeleton 이라면 CUID2 를 "opt-in" 로 두고 default 는 ULID/UUIDv7 로 결정하는 것도 trade-off 중 하나.
  • CUID2 가 "deliberately slower" (brute-force 방지 목적) 라고 설명하는 부분은 고빈도 ID 생성 시나리오에서 성능 bottleneck 가능성을 내포. render loop 같은 tight loop 에서 사용 금지는 README 가 명시.