자바스크립트로 UUID 생성하기
클라이언트나 서버를 가리지 않고 웹 개발을 할 때 랜덤 문자열 기반의 식별자가 많이 사용되고 있습니다. 전통적인 숫자 시퀀스 기반의 식별자를 사용하면 애플리케이션을 수평적으로 확장하기가 어렵고 보안적으로도 불리한 측면이 있기 때문입니다.
이번 포스팅에서는 대표적인 랜덤 문자열 기반의 식별자인 UUID를 자바스크립트로 생성하는 방법에 대해서 알아보겠습니다.
UUID란?
UUID(Universally Unique IDentifier)는 가장 대표적인 랜덤 문자열 기반의 식별자입니다. UUID는 16진수로 구성되며 128 비트, 즉 36 바이트 길이의 문자열로 아래와 같은 형태(8-4-4-4-12)를 띄게 됩니다.
7571e92b-f38b-4878-959c-f76ab9290ed8
c66e189f-9c16-4511-91fa-f0d05d12c2c9
0b868908-1882-4f85-8c4e-ec2d796784c8
a8feea41-fe2e-42db-975f-4eecd5b03813
6bdcbc81-63d7-4d77-8f0c-4b8e02caf1fe
UUID는 5가지 버전이 있지만 보안성이 가장 높은 v4가 가장 널리 사용되고 있습니다.
UUID v4가 만들 수 있는 조합의 수
UUID v4가 어떻게 충돌을 거의 일으키지 않는지 궁금하실 텐데요. 이를 이해하려면 한 자리에 들어갈 수 있는 후보 문자의 가짓수와 거기서 만들어낼 수 있는 조합의 수를 따져봐야 합니다.
UUID는 16진수로 구성되므로, 한 자리에 들어갈 수 있는 후보 문자는 다음과 같이 16가지입니다.
- 숫자 10자 (
0-9) - 영문 소문자 6자 (
a-f)
이렇게 한 자리에 들어갈 수 있는 후보 문자가 정확히 16가지, 다시 말해서 2의 4제곱이기 때문에 한 자리당 4비트의 정보를 담을 수 있는데요.
하이픈을 제외한 32자리로 식별자를 만들면 총 32 × 4 = 128비트가 됩니다.
다만, UUID v4 문자열을 자세히 들여다보면 두 자리에는 항상 정해진 값이 박혀 있는 것을 발견할 수 있는데요.
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
│ │
│ └─ y는 항상 8, 9, a, b 중 하나
└────── 항상 4
세 번째 그룹의 첫 글자가 항상 4인 이유는 “이 UUID가 4번째 버전(무작위 기반)으로 만들어졌다”는 것을 알리기 위해 버전 정보를 4비트로 박아두기 때문입니다.
네 번째 그룹의 첫 글자가 8, 9, a, b 중 하나로 한정되는 이유는 “이 UUID가 RFC 4122 표준을 따르고 있다”는 것을 알리기 위해 변형 정보를 2비트로 박아두기 때문입니다.
따라서 UUID v4의 128비트 중 4 + 2 = 6비트는 항상 같은 값이라 무작위성에 기여하지 않으므로, 실제 무작위성은 128 - 6 = 122비트입니다.
이를 바탕으로 UUID v4로 만들 수 있는 조합의 수는 다음과 같이 계산할 수 있는데요.
2^122 ≈ 5.32 × 10^36
이는 매우 큰 숫자라서 실용적으로 충돌을 걱정하지 않아도 될 정도입니다. 참고로 NanoID는 21자리만으로도 126비트의 무작위성을 제공하므로, UUID v4보다 길이는 짧으면서도 조합의 수는 약 16배 더 많습니다.
npm 패키지 사용
자바스크립트에서 UUID를 생성하기 위해서 예전부터 npm 패키지가 많이 사용되었습니다.
npm 저장소에서 검색해보면 uuid라는 패키지가 가장 다운로드 수가 많을 것입니다.
그럼, 터미널에서 npm 명령어로 uuid라는 패키지를 설치해볼까요?
$ npm install uuid
이제 uuid 패키지로 부터 v4()라는 함수를 불러온 후에 호출하면 UUID가 생성됩니다.
import { v4 as uuidv4 } from "uuid"; // ES Modules
// const { v4: uuidv4 } = require("uuid"); // CommonJS
const id = uuidv4();
console.log(id); // "69c52380-f123-4523-a0c8-4bc78319cf6b"
예제 코드는 아래에 올려두었니 필요하시다면 직접 실행해보시길 바랍니다.
웹 표준 API
Web 표준 API를 충실하게 구현하고 있는 모던 브라우저에서는 UUID 생성을 위해서 굳이 별도의 패키지를 설치하지 않아도 됩니다.
왜냐하면 Web Crypto API에서 UUID를 반환하는 randomUUID() 함수를 제공하고 있기 때문입니다.
const id = crypto.randomUUID();
console.log(id); // "cbfc904b-b898-4deb-b736-ba433489904c"
참고로 Web Crypto API의 randomUUID() 함수는 Node.js, Deno, Bun과 같은 서버 측 자바스크립트 런타임에서도 지원합니다.
마치며
지금까지 자바스크립트에서 UUID를 생성하는 두 가지 방법에 대해서 살펴보았습니다. UUID를 잘 활용하셔서 더욱 안전하고 신뢰성 높은 고유 식별자를 생성하실 수 있으셨으면 좋겠습니다.
최근에는 랜덤 문자열 기반의 고유 식별자로서 UUID보다 짧고 빠른 NanoID도 많이 사용되고 있습니다. NanoID에 대해서는 별도 포스팅에서 자세히 다루고 있으니 참고 바랍니다.
This work is licensed under
CC BY 4.0