데이터베이스에 새 사용자를 등록할 때 ID를 1, 2, 3으로 순서대로 매기면 간단하지만, 서버가 여러 대이거나 외부에 노출되는 URL이면 문제가 된다. 순차 ID는 다음 번호를 예측할 수 있고, 전체 데이터 건수도 드러난다. UUID는 이런 문제를 해결하기 위해 만들어진 고유 식별자다.
UUID 구조
UUID(Universally Unique Identifier)는 128비트(16바이트)의 숫자로, 보통 이런 형태로 표기한다.
550e8400-e29b-41d4-a716-446655440000
32자리 16진수를 하이픈으로 4구간(8-4-4-4-12)으로 나눈 것이다. 총 조합 가능한 수가 약 3.4 × 10³⁸개에 달해서 사실상 중복이 발생하지 않는다.
UUID 버전별 차이
| 버전 | 생성 방식 | 특징 |
|---|---|---|
| v1 | 타임스탬프 + MAC 주소 | 생성 시간 추적 가능, MAC 주소 노출 위험 |
| v3 | 네임스페이스 + MD5 해시 | 같은 입력이면 같은 UUID 생성 |
| v4 | 완전 무작위 | 가장 널리 사용, 충돌 확률 극히 낮음 |
| v5 | 네임스페이스 + SHA-1 해시 | v3의 보안 강화 버전 |
| v7 | 타임스탬프 + 랜덤 | 시간순 정렬 가능, 최신 표준 |
실무에서 가장 많이 쓰이는 건 v4다. 완전 무작위 생성이라 MAC 주소 같은 개인 정보가 포함되지 않고, 구현도 간단하다.
충돌 확률, 걱정할 수준인가
UUID v4의 가능한 조합 수는 약 5.3 × 10³⁶개다. 매초 10억 개씩 생성해도 중복이 발생할 확률이 50%가 되려면 약 85년이 걸린다. 일반적인 서비스에서는 사실상 충돌이 불가능한 수준이다.
참고 UUID의 충돌 확률을 "생일 문제(Birthday Problem)"로 계산하면, 10³⁸ 공간에서 충돌 확률 50%에 도달하려면 약 2.7 × 10¹⁸개를 생성해야 한다.
UUID를 쓰는 곳
- 데이터베이스 Primary Key: 분산 환경에서 서버 간 ID 충돌 없이 독립적으로 생성 가능
- API 리소스 식별:
/users/550e8400-e29b-41d4...형태로 순차 번호 대신 사용 - 파일명/세션 ID: 업로드 파일명 충돌 방지, 브라우저 세션 식별
- 메시지 큐: 카프카, RabbitMQ 등에서 메시지 고유 식별
- 로그 추적: 요청마다 UUID를 붙여서 분산 시스템 로그를 추적
UUID 생성 방법
코드로 생성
// JavaScript (Node.js)
const { v4: uuidv4 } = require('uuid');
console.log(uuidv4());
// Python
import uuid
print(uuid.uuid4())
빠르게 생성
테스트 데이터가 필요하거나 수십 개를 한 번에 만들어야 할 때는 코드를 짜는 것보다 UUID 생성기가 빠르다. 한 번에 최대 1,000개까지 대량 생성되고, 하이픈 제거, 중괄호 형식, URN 형식 등 원하는 포맷을 골라서 복사하거나 텍스트 파일로 다운로드할 수 있다.
UUID는 "전 세계에서 유일한 ID"를 보장하는 가장 간단한 방법이다. 데이터베이스 설계나 API 설계에서 한 번 정하면 바꾸기 어려운 부분이니까, 순차 ID와 UUID의 장단점을 비교한 뒤 선택하는 게 좋다.