유틸리티

UUID란? 고유 ID가 필요한 이유와 생성 방법

데이터베이스에 새 사용자를 등록할 때 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의 장단점을 비교한 뒤 선택하는 게 좋다.