NanoID 생성기

Generate tiny URL-safe unique IDs with customizable alphabet

알파벳

크기

개수

생성 버튼을 클릭하여 NanoID를 만드세요

NanoID란 무엇인가요?

NanoID는 작고, 빠르고, URL 안전한 무작위 ID 생성기입니다. 기본적으로 64자 알파벳(A-Za-z0-9_-)을 사용하여 21자 문자열을 생성하고 약 126비트의 엔트로피를 제공합니다——UUID v4의 122비트에 필적하지만 더 짧은 문자열입니다.

NanoID는 타임스탬프나 구조화된 데이터를 내장하지 않습니다. 모든 ID는 운영 체제의 암호학적으로 안전한 난수 생성기(브라우저의 crypto.getRandomValues(), Node.js의 crypto.randomBytes())에서 생성된 순수 무작위입니다.

NanoID 대 UUID v4

NanoID와 UUID v4는 모두 CSPRNG로 지원되는 무작위 ID 생성기입니다. 형식, 길이, 생태계 지원이 다릅니다:

속성NanoID(기본값)UUID v4
형식URL 안전 영숫자 + _-하이픈 16진
길이21자(기본값)36자
엔트로피~126비트122비트
URL 안전예——인코딩 불필요예(하이픈 포함)
알파벳64자(A-Za-z0-9_-)16자(0-9a-f)
의존성npm 패키지 필요네이티브(crypto.randomUUID)
사용자 정의 가능예——길이 및 알파벳아니오
표준없음(커뮤니티 라이브러리)RFC 4122 / RFC 9562

외부 시스템과의 상호 운용성이 중요할 때——네이티브 UUID 열을 가진 데이터베이스, UUID 형식을 기대하는 API, UUID를 파싱하는 로깅 인프라——UUID v4를 선택하세요. 더 짧은 ID를 원하고 전체 스택을 제어할 때 NanoID를 선택하세요.

크기별 충돌 확률

NanoID의 충돌 확률은 ID 길이와 생성 속도에 따라 다릅니다. 다음 표는 기본 64자 알파벳을 사용합니다:

크기(자)가능한 ID 수충돌 안전성
664약 1/45억——수천 개의 ID에 안전
864약 1/4.5조——수백만 개의 ID에 안전
1164약 1/2.8경——수십억 개의 ID에 안전
1664약 1/1.2 × 10^19——수조 개의 ID에 안전
2164약 1/10^30——수백 년 동안 하루 1000억 ID에 안전
3264UUID v4에 필적(122비트)
3636UUID v4 초과

기본 21자 크기는 UUID v4의 충돌 저항성(~126비트)에 맞추면서 41% 더 짧게 선택되었습니다. 대부분의 애플리케이션에서 21자가 올바른 선택입니다.

사용자 정의 알파벳

NanoID의 알파벳은 완전히 사용자 정의 가능합니다. 라이브러리는 알파벳으로 고유한 문자의 임의 문자열을 허용하고 해당 문자만 사용하여 ID를 생성합니다:

숫자만A-Za-z0-9_-
SMS 코드나 PIN 스타일 식별자에 유용한 모든 숫자 ID에 '0123456789'를 사용합니다.
소문자 16진A-Za-z0-9
UUID 하이픈 형식 없이 압축 16진 문자열에 '0123456789abcdef'를 사용합니다.
사람이 읽기 쉬운0-9a-f
사용자가 수동으로 입력해야 할 수 있는 ID를 위해 시각적으로 모호한 문자(0, O, 1, I, l)를 제외합니다.
사용자 정의 도메인0-9
애플리케이션에 적합한 임의의 문자 집합을 사용합니다——예: 발음 가능한 ID를 위해 모음+자음만.

중요: nanoid/non-secure는 비보안 민감 애플리케이션(예: UI 요소 ID)에만 사용하세요. 추측할 수 없어야 하는 ID에는 항상 기본 보안 임포트를 사용하세요.

NanoID가 무작위성을 생성하는 방법

NanoID는 운영 체제의 암호학적으로 안전한 의사 난수 생성기(CSPRNG)를 사용합니다. 브라우저에서는 crypto.getRandomValues(); Node.js에서는 crypto.randomFillSync(). 이는 TLS 세션 키에 사용되는 것과 동일한 엔트로피 소스입니다——Math.random()보다 훨씬 강합니다.

거부 샘플링(모듈로 편향 방지)

무작위 문자를 생성하는 단순한 접근법은: 무작위 바이트(0-255)를 취하고 byte % alphabetSize를 계산하는 것입니다. 알파벳 크기가 256을 균등하게 나누지 않을 때 모듈로 편향을 유발합니다——일부 문자가 다른 것보다 약간 더 자주 나타납니다.

NanoID는 거부 샘플링을 사용하여 이 편향을 제거합니다:

  1. 알파벳 크기를 커버하는 최소 2의 거듭제곱 마스크를 결정합니다(예: 64자 알파벳의 경우 마스크는 63 = 0b00111111)
  2. 무작위 바이트를 생성하고 마스크를 적용합니다: byte & mask
  3. 마스크된 값이 알파벳 범위 내에 있으면 사용합니다. 그렇지 않으면 버리고 다시 시도합니다.

이는 일부 무작위 바이트가 버려지지만 결과는 알파벳에 대한 완전히 균일한 분포입니다——어떤 문자도 다른 것보다 더 가능성이 높지 않습니다.

How the algorithm works — step by step
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

환경 지원

Browser
최신 브라우저(Chrome 37+, Firefox 34+, Safari 7+)——crypto.getRandomValues() 사용
Node.js 14+
Node.js 14.18+——crypto.randomFillSync() 사용
Deno
Deno——crypto.getRandomValues() 사용
Bun
React Native——expo-crypto 또는 react-native-get-random-values 폴리필 사용
Edge / Cloudflare Workers
Edge 런타임(Cloudflare Workers, Vercel Edge)——Web Crypto API 사용 가능
React Native
Bun——네이티브 암호화 지원

코드 예제

JavaScript / TypeScript

JavaScript
// npm i nanoid
import { nanoid } from 'nanoid'
nanoid()          // → "V1StGXR8_Z5jdHi6B-myT" (21 chars, URL-safe)
nanoid(8)         // → "Uakgb_J5" (custom size)

// Custom alphabet
import { customAlphabet } from 'nanoid'
const hexId  = customAlphabet('0123456789abcdef', 16)
hexId()       // → "4f3a1b8c9d2e0f7a"

const numId  = customAlphabet('0123456789', 8)
numId()       // → "30812894"

브라우저(CDN)

NanoID는 CDN 임포트를 통해 브라우저에서 직접 사용할 수 있습니다. 빠른 프로토타이핑에 빌드 단계가 필요 없습니다.

JavaScript
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

Python

Python
# pip install nanoid
from nanoid import generate

generate()              # → "V1StGXR8_Z5jdHi6B-myT"
generate(size=8)        # → "Uakgb_J5"
generate('0123456789abcdef', 16)  # custom alphabet + size

Node.js(CommonJS)

JavaScript
// Node.js — stdlib only, no npm needed
const { randomFillSync } = require('crypto')

function nanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = randomFillSync(Buffer.alloc(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) { id += alphabet[idx]; if (id.length === size) break }
    }
  }
  return id
}

자주 묻는 질문

NanoID는 암호학적으로 안전한가요?
예——기본 임포트를 사용할 때 NanoID는 OS 수준 CSPRNG(브라우저의 crypto.getRandomValues, Node.js의 crypto.randomFillSync)를 사용하여 ID를 생성합니다. 이는 암호화 키 생성에 사용되는 것과 동일한 엔트로피 소스입니다. NanoID 값은 세션 토큰, API 키 및 기타 보안에 민감한 식별자로 적합합니다.
NanoID를 데이터베이스 기본 키로 사용할 수 있나요?
예. NanoID 문자열은 URL 안전하고 CHAR 또는 VARCHAR 열로 저장할 수 있습니다. 그러나 NanoID에는 타임스탬프 구성 요소가 없어 ID를 생성 순서로 정렬할 수 없습니다——높은 삽입 속도에서 UUID v4와 유사한 B-tree 인덱스 단편화가 발생합니다. 시간 순서 기본 키에는 대신 ULID 또는 UUID v7을 사용하세요.
NanoID는 crypto.randomUUID()와 어떻게 비교되나요?
둘 다 CSPRNG를 사용하고 강한 무작위성을 제공합니다. crypto.randomUUID()는 네이티브(의존성 없음)로 36자 하이픈 UUID v4 문자열을 생성하며 데이터베이스와 API에서 보편적으로 인식됩니다. NanoID는 npm 패키지가 필요하지만 더 짧은 문자열(기본 21자)을 생성하고 알파벳이 사용자 정의 가능합니다.
매우 짧은 NanoID를 사용하면 어떻게 되나요?
짧은 ID(예: 6-8자)는 충돌 확률이 상당히 높습니다. 기본 64자 알파벳의 6자 NanoID는 약 680억 개의 가능한 값만 있습니다——수천 개의 ID에 적합하지만 이후 충돌 위험이 무시할 수 없게 됩니다.
npm 없이 브라우저에서 NanoID를 사용할 수 있나요?
예. NanoID는 CDN(jsDelivr 또는 esm.sh 등)에서 ESM 임포트를 지원합니다. type="module"인 script 태그에서 브라우저에 임포트합니다. 이는 빠른 프로토타이핑에 유용하지만 프로덕션에는 권장되지 않습니다.
NanoID는 모든 환경에서 작동하나요?
NanoID는 모든 최신 브라우저, Node.js, Deno, Bun, Cloudflare Workers 및 Vercel Edge Functions에서 작동합니다. React Native의 경우 getRandomValues 폴리필(react-native-get-random-values)이 필요합니다. 라이브러리는 환경에 구애받지 않도록 설계되어 사용 가능한 암호화 API를 자동으로 감지합니다.