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 |
|
|
|
2026-05-31 |
official-doc / CUID2 — Secure Collision-Resistant ID Specification (paralleldrive)
Layer:
raw/— 외부 자료(공식 문서)의 원문 발췌·출처 기록. 검증된 요약은/ingest후wiki/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 가 명시.
Related / 관련
- 같은 주제 다른 raw 자료 (예정):
- raw/official-docs/rfc9562-uuid.md — UUID v7 (time-ordered, 48bit timestamp 평문 노출 확인용)
- raw/official-docs/ulid-spec.md — ULID spec (timestamp 영역 확인용)
- raw/official-docs/nanoid-spec.md — NanoID (CUID2-C5 비교 대상)
- raw/official-docs/rfc3986-uri-generic-syntax.md — CUID2-C3 charset RFC 3986 적합성 확인용
- 이 자료를 인용할 wiki 요약: wiki/concepts/resource-identifier-format (생성 시)