ℹ️ About UUID

UUID (Universally Unique Identifier) is a 128-bit identifier that is unique across space and time. UUIDs are commonly used in distributed systems and databases to ensure uniqueness.

Version 4 (Random): Generated using random or pseudo-random numbers. This is the most commonly used version.
Format: 8-4-4-4-12 hexadecimal digits (e.g., 550e8400-e29b-41d4-a716-446655440000)

📖 UUID란?

🔤 UUID (Universally Unique Identifier)

UUID는 전 세계적으로 고유한 식별자를 생성하기 위한 표준 방식입니다. GUID(Globally Unique Identifier)라고도 불리며, 중앙 집중식 관리 없이도 서로 다른 시스템에서 생성한 ID가 충돌하지 않도록 설계되었습니다. 128비트(16바이트) 숫자로 구성되며, 일반적으로 36자의 16진수 문자열로 표현됩니다.

UUID 예시:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
6ba7b810-9dad-11d1-80b4-00c04fd430c8

💡 UUID 사용 사례

  • 데이터베이스 Primary Key: 여러 데이터베이스 간 데이터 병합 시 ID 충돌 방지
  • 분산 시스템: 마이크로서비스 아키텍처에서 고유한 트랜잭션 ID 생성
  • 파일 및 세션 식별: 임시 파일명, 사용자 세션 토큰 생성
  • API 요청 추적: 요청/응답 추적을 위한 고유 Request ID
  • 클라이언트 측 ID 생성: 서버 호출 없이 클라이언트에서 즉시 ID 생성
  • 보안 토큰: 비밀번호 재설정 링크, 이메일 인증 토큰 등

🔧 사용 방법

  1. 버전 선택: 용도에 맞는 UUID 버전 선택 (일반적으로 v4 추천)
  2. 생성 버튼 클릭: 'Generate UUID' 버튼을 클릭하여 새로운 UUID 생성
  3. 대량 생성: 한 번에 여러 개의 UUID가 필요한 경우 수량 설정
  4. 복사: 생성된 UUID를 클릭하거나 복사 버튼으로 클립보드에 복사
  5. 형식 선택: 하이픈 포함/제외, 대소문자 선택 가능

🔢 UUID 버전

Version 1 (Time-based)
  • 생성 방식: 타임스탬프 + MAC 주소
  • 장점: 시간 순서대로 정렬 가능, 생성 시간 추적 가능
  • 단점: MAC 주소 노출로 인한 개인정보 문제
  • 용도: 시간 순서가 중요한 로깅, 이벤트 추적
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Version 3 (Name-based MD5)
  • 생성 방식: 네임스페이스 + 이름의 MD5 해시
  • 특징: 동일한 입력 → 항상 동일한 UUID
  • 단점: MD5 알고리즘 취약점
  • 용도: 레거시 시스템 호환성
Version 4 (Random) ⭐ 가장 많이 사용
  • 생성 방식: 완전한 난수(랜덤) 기반
  • 장점: 예측 불가능, 개인정보 노출 없음, 구현 간단
  • 충돌 확률: 사실상 0에 가까움 (2^122개 가능)
  • 용도: 대부분의 일반적인 용도 (데이터베이스 키, 세션 ID 등)
f47ac10b-58cc-4372-a567-0e02b2c3d479
Version 5 (Name-based SHA-1)
  • 생성 방식: 네임스페이스 + 이름의 SHA-1 해시
  • 특징: v3의 개선 버전 (더 안전한 해시 알고리즘)
  • 장점: 결정론적(동일 입력 → 동일 출력), MD5보다 안전
  • 용도: URL을 UUID로 변환, 재현 가능한 ID 생성

📐 UUID 형식

표준 형식 (RFC 4122):
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

8자-4자-4자-4자-12자 = 총 36자 (하이픈 포함)
32자 (하이픈 제외)

M: 버전 번호 (1, 3, 4, 5)
N: Variant (8, 9, A, B 중 하나)
구체적 예시 분석:
f47ac10b-58cc-4372-a567-0e02b2c3d479
         ↑
      버전 4 (Random UUID)

f47ac10b-58cc-4372-a567-0e02b2c3d479
              ↑
           Variant bits
다양한 표기 형식:
  • 표준 (하이픈 포함):550e8400-e29b-41d4-a716-446655440000
  • 압축 (하이픈 제외): 550e8400e29b41d4a716446655440000
  • 대문자: 550E8400-E29B-41D4-A716-446655440000
  • 중괄호 (Microsoft):{550e8400-e29b-41d4-a716-446655440000}
  • URN 형식:urn:uuid:550e8400-e29b-41d4-a716-446655440000

⚡ UUID의 특징과 장점

🌍 전역 고유성

중앙 관리 없이도 전 세계 어디서든 생성한 UUID가 충돌하지 않습니다.

🔒 예측 불가능

v4 UUID는 암호학적으로 안전한 난수 생성기를 사용하여 예측이 불가능합니다.

⚡ 분산 생성

각 클라이언트나 서버가 독립적으로 ID를 생성할 수 있어 병목 현상이 없습니다.

📊 대규모 확장

2^128개의 가능한 값으로 사실상 무한대의 고유 ID 생성 가능합니다.

🔗 URL 안전

특수 문자 없이 16진수만 사용하여 URL에 안전하게 포함할 수 있습니다.

🌐 표준화

RFC 4122 표준으로 모든 프로그래밍 언어와 플랫폼에서 지원됩니다.

💻 프로그래밍 언어별 UUID 생성

JavaScript / Node.js:
// 브라우저 (crypto API 사용)
const uuid = crypto.randomUUID();

// Node.js (crypto 모듈)
const crypto = require('crypto');
const uuid = crypto.randomUUID();

// uuid 패키지 사용
import { v4 as uuidv4 } from 'uuid';
const uuid = uuidv4();
console.log(uuid); // '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
Python:
import uuid

# v4 (Random)
random_uuid = uuid.uuid4()
print(random_uuid)  # f47ac10b-58cc-4372-a567-0e02b2c3d479

# v1 (Time-based)
time_uuid = uuid.uuid1()

# v5 (Name-based SHA-1)
namespace = uuid.NAMESPACE_DNS
name_uuid = uuid.uuid5(namespace, 'example.com')

# 문자열로 변환
uuid_str = str(random_uuid)
Java:
import java.util.UUID;

// v4 (Random)
UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

// v3 (Name-based MD5)
UUID nameBased = UUID.nameUUIDFromBytes("example".getBytes());

// 하이픈 제거
String compact = uuid.toString().replace("-", "");
C# (.NET):
using System;

// 새로운 GUID 생성
Guid guid = Guid.NewGuid();
Console.WriteLine(guid.ToString());

// 다양한 형식
string format1 = guid.ToString("D"); // 하이픈 포함
string format2 = guid.ToString("N"); // 하이픈 제외
string format3 = guid.ToString("B"); // {중괄호} 포함
PHP:
<?php
// uniqid() - 완벽한 UUID는 아니지만 간단한 용도
$id = uniqid('', true);

// 완전한 UUID v4 생성 함수
function guidv4() {
    $data = random_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

echo guidv4();
?>
Go:
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // v4 생성
    id := uuid.New()
    fmt.Println(id.String())

    // Parse
    parsed, err := uuid.Parse("f47ac10b-58cc-4372-a567-0e02b2c3d479")
}
SQL (PostgreSQL):
-- UUID 타입 컬럼 생성
CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name VARCHAR(100)
);

-- UUID 생성
SELECT gen_random_uuid();

-- UUID 삽입
INSERT INTO users (id, name) VALUES (gen_random_uuid(), 'John Doe');

❓ 자주 묻는 질문 (FAQ)

Q: UUID가 정말 중복되지 않나요?

A: 이론적으로는 중복 가능하지만, 실제로는 사실상 불가능합니다. UUID v4의 경우 2^122개(약 5.3×10^36개)의 고유한 값을 생성할 수 있어, 1조 개의 UUID를 매초 생성해도 100억 년 동안 충돌 확률이 50%에 도달하지 않습니다.

Q: UUID를 데이터베이스 Primary Key로 사용해도 되나요?

A: 가능하지만 장단점이 있습니다. 장점: 분산 시스템에서 충돌 없이 ID 생성, 병합 시 편리, 예측 불가능. 단점: 정수형 ID보다 저장 공간 많이 사용(16바이트 vs 4-8바이트), 인덱스 성능 저하 가능, 사람이 읽기 어려움. B-Tree 인덱스 성능을 위해 UUIDv1이나 ULID 같은 시간 순서 기반 대안을 고려할 수 있습니다.

Q: UUID와 GUID의 차이는 무엇인가요?

A: 본질적으로 같은 개념입니다. UUID는 IETF RFC 4122 표준 용어이고, GUID는 Microsoft에서 사용하는 용어입니다. Microsoft의 GUID 구현은 UUID 표준을 따르므로 호환됩니다.

Q: 어떤 UUID 버전을 사용해야 하나요?

A: 대부분의 경우 Version 4 (Random)를 권장합니다. 구현이 간단하고, 개인정보 노출이 없으며, 예측 불가능합니다. 시간 순서가 중요하다면 v1, 동일한 입력에서 동일한 UUID가 필요하다면 v5를 고려하세요.

Q: UUID를 암호화 키로 사용할 수 있나요?

A: 권장하지 않습니다. UUID v4는 128비트의 엔트로피를 가지지만, 일부 비트가 버전/variant 정보로 고정되어 있어 실제 엔트로피는 약 122비트입니다. 암호화 키로는 별도의 암호학적으로 안전한 난수 생성기(CSPRNG)를 사용하세요.

Q: UUID의 크기가 부담스러운데 대안이 있나요?

A: 네, 여러 대안이 있습니다. ULID(Universally Unique Lexicographically Sortable Identifier)는 26자로 더 짧고 시간 순서대로 정렬됩니다. NanoID는 21자로 더욱 짧습니다. Short UUID는 Base62 인코딩으로 22자로 축약할 수 있습니다. 용도에 맞게 선택하세요.

Q: 클라이언트에서 생성한 UUID를 신뢰해도 되나요?

A: 보안에 민감한 경우 주의가 필요합니다. 악의적인 클라이언트가 동일한 UUID를 반복 전송하거나 다른 사용자의 UUID를 도용할 수 있습니다. 중요한 경우 서버에서 UUID를 생성하거나, 클라이언트 UUID를 참조용으로만 사용하고 서버에서 추가 검증을 수행하세요.

💡 UUID 사용 팁과 모범 사례

  • 버전 선택: 특별한 이유가 없다면 v4 사용 권장
  • 데이터베이스 저장: 문자열 대신 BINARY(16) 또는 UUID 타입으로 저장하여 공간 절약
  • 인덱스 최적화: MySQL/MariaDB에서는 UUID_TO_BIN()과 BIN_TO_UUID() 함수 활용
  • URL 사용: 하이픈을 제거하여 더 짧은 URL 생성 가능
  • 로깅: 분산 시스템에서 요청 추적 시 UUID를 Request ID로 사용
  • 순서 필요 시: 시간 순서가 중요하다면 UUIDv1이나 ULID 고려
  • 대소문자: RFC 표준은 소문자 권장, 대소문자 구분 없이 처리하도록 구현
  • 검증: 입력된 UUID가 올바른 형식인지 정규식으로 검증
  • nil UUID: 00000000-0000-0000-0000-000000000000는 특수 목적으로 예약

⚠️ 주의사항

  • UUID v1은 MAC 주소를 포함하므로 개인정보 노출 우려가 있습니다
  • UUID를 비밀번호나 암호화 키로 사용하지 마세요
  • 사용자에게 보여지는 ID로는 부적합합니다 (긴 문자열, 가독성 낮음)
  • 정수형 자동 증가 ID에 비해 인덱스 조각화(fragmentation) 발생 가능
  • Math.random()이나 약한 난수 생성기로 UUID를 생성하지 마세요 (crypto 사용)
  • 데이터베이스에서 VARCHAR로 저장 시 공간 낭비 - UUID 타입 또는 BINARY 사용 권장
  • 대량 데이터 처리 시 UUID 파싱/변환 오버헤드 고려

📊 UUID vs 다른 ID 생성 방식 비교

방식장점단점적합한 용도
UUID v4전역 고유성, 분산 생성, 예측 불가크기 큼, 순서 없음, 가독성 낮음분산 시스템, API 토큰
Auto Increment작은 크기, 순서 보장, 인덱스 효율분산 환경 부적합, 예측 가능단일 DB, 내부 ID
Snowflake ID시간 순서, 작은 크기(64bit)시계 동기화 필요, 구현 복잡Twitter, 대규모 분산 시스템
ULID시간 순서, UUID보다 짧음UUID만큼 널리 지원되지 않음시간 순서가 중요한 로그
NanoID매우 짧음(21자), URL 안전전역 고유성 보장 낮음URL 단축, 짧은 참조 코드