범용 고유 식별자: 두 판 사이의 차이

Gaon12 (토론 / 기여)
버전 6, 7, 8 내용 보강
Gaon12 (토론 / 기여)
문서 최신화
1번째 줄: 1번째 줄:
== 개요 ==
== 개요 ==
UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 표준이다. UUID는 128비트 길이의 숫자이며, 주로 소프트웨어 시스템에서 객체, 엔티티 등을 고유하게 식별하기 위해 사용된다. UUID는 [https://datatracker.ietf.org/doc/html/rfc4122 RFC 4122 표준]에 정의되어 있으며, 다양한 버전과 생성 방법이 존재한다.
UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 '''RFC 9562'''로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다.:contentReference[oaicite:0]{index=0} 
 
UUID는 32자리 16진수 숫자를 <code>8-4-4-4-12</code> 형식으로 하이픈으로 구분하여 표현한다. 예) <code>123e4567-e89b-12d3-a456-426614174000</code>. 버전 7은 밀리초 단위 Unix 타임스탬프를 상위 48비트에 포함해 시간 순 정렬성을 대폭 향상시켰다.:contentReference[oaicite:1]{index=1}
UUID는 일반적으로 32자리의 16진수 숫자로 표현되며, 하이픈(-)으로 구분된 5개의 그룹으로 나뉜다. 예를 들어, <code>123e4567-e89b-12d3-a456-426614174000</code>와 같은 형태이다. 이 구조는 <code>8-4-4-4-12</code> 형태로 구성되어 있다.
 
또한 최근에는 UUID의 새로운 표준 제안으로써 버전 6, 7, 8 등이 포함된 [https://datatracker.ietf.org/doc/html/draft-ietf-uuidrev-rfc4122bis 개정판이 논의되고 있으며], 특히 버전 7은 밀리초 단위의 [[Unix 타임스탬프]] 기반으로 정렬이 용이하도록 설계되었다.


== 장단점 ==
== 장단점 ==
=== 장점 ===
=== 장점 ===
* '''전 세계적 고유성''': UUID는 분산 시스템에서 중복 없이 고유한 식별자를 생성할 수 있다.
* '''전 세계적 고유성''': 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.:contentReference[oaicite:2]{index=2}
* '''충돌 가능성 낮음''': 128비트 길이로 인해 충돌 가능성이 극히 낮다.
* '''충돌 가능성 낮음''': 2<sup>122</sup> (≈5.3 × 10<sup>36</sup>)개의 조합으로 충돌 확률이 극히 낮다.:contentReference[oaicite:3]{index=3}
* '''독립성''': UUID는 생성 시 외부 시스템이나 중앙 서버와의 통신 없이도 고유한 식별자를 만들 수 있다.
* '''독립성''': 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다.
* '''범용성''': 다양한 프로그래밍 언어와 플랫폼에서 UUID를 지원하며, 표준화된 형식을 가지고 있다.
* '''범용성''': 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.:contentReference[oaicite:4]{index=4}
* '''정렬성 향상''': 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.:contentReference[oaicite:5]{index=5}


=== 단점 ===
=== 단점 ===
* '''크기''': UUID는 128비트(16바이트) 길이로, 메모리와 저장 공간을 많이 차지할 수 있다. 특히 대규모 데이터베이스에서 인덱싱 성능에 영향을 미칠 수 있다.
* '''크기''': 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.:contentReference[oaicite:6]{index=6}
* '''가독성''': 인간이 읽기에는 길고 복잡하여 식별하기 어렵다.
* '''가독성''': 사람이 읽고 기억하기엔 복잡하다.
* '''정렬''': 기존 UUID는 생성 시점에 따라 순서가 보장되지 않기 때문에, 삽입 순서대로 정렬하거나 시간순 정렬을 원할 경우 부적합할 수 있다. 그러나 버전 1, 6, 7은 시간 정보를 포함하여 시간순 정렬이 가능하다.
* '''정렬''': 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.:contentReference[oaicite:7]{index=7}
* '''보안''': UUID 버전 1의 경우 MAC 주소와 타임스탬프를 포함하기 때문에 개인 정보가 의도치 않게 노출될 위험이 있다.
* '''보안''': 버전 1은 MAC 주소·시간 정보가 노출될 있다.:contentReference[oaicite:8]{index=8}


== 특징 ==
== 특징 ==
UUID는 다음과 같은 특징을 갖는다:
* '''고유성''': 전 세계적으로 유일하다.
* 고유성''': 각 UUID는 전 세계적으로 유일하다.
* '''확장성''': 네트워크 상태와 무관하게 생성 가능.
* 확장성''': 네트워크 환경과 무관하게 고유 식별자를 생성할 수 있다.
* '''독립적 생성''': 중앙 서버 없이 분산 환경에서 사용 가능.
* '''독립적 생성''': UUID는 독립적으로 생성할 수 있으며, 중앙 서버 없이도 분산 환경에서 사용이 가능하다.
* '''표준화''': RFC 9562로 상호 운용성 보장.:contentReference[oaicite:9]{index=9}
* 표준화''': RFC 4122 표준에 의해 정의되어 있어, 다양한 시스템과 플랫폼에서 일관성 있게 사용할 수 있다.
* '''다양한 버전''': 1 ~ 8 버전이 존재하며 용도별로 선택할 수 있다.:contentReference[oaicite:10]{index=10}
* 다양한 버전''': 다양한 생성 방법에 따라 여러 버전이 존재하며, 각각의 버전은 고유한 용도와 생성 방법을 갖는다.
* '''풍부한 라이브러리''': Python·Go·JavaScript 등에서 모듈 또는 패키지 형태로 제공된다.:contentReference[oaicite:11]{index=11}
* '''지원 라이브러리 풍부''': 대다수의 프로그래밍 언어 및 프레임워크에서 UUID 생성 함수를 기본 혹은 확장 라이브러리로 제공한다.


== UUID의 버전 ==
== UUID의 버전 ==
UUID는 전통적으로 다섯 가지 주요 버전이 존재했으며, 최근에는 새로운 버전 6, 7, 8이 제안되었다.
* '''버전 1 (타임스탬프 + MAC)''': 시간·MAC 기반, 개인 정보 노출 우려.:contentReference[oaicite:12]{index=12}
* '''버전 2 (DCE 보안)''': POSIX UID/GID 포함, 실무 사용 거의 없음.
* '''버전 3 (이름 기반 + MD5)''': 동일 입력에 동일 UUID 보장.
* '''버전 4 (난수 기반)''': 가장 널리 쓰이며 충돌 확률 매우 낮음.:contentReference[oaicite:13]{index=13}
* '''버전 5 (이름 기반 + SHA-1)''': v3과 같으나 해시 알고리즘만 SHA-1.:contentReference[oaicite:14]{index=14}
* '''버전 6 (시간순 정렬 강화)''': v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.:contentReference[oaicite:15]{index=15}
* '''버전 7 (Unix 에포크 밀리초)''': 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.:contentReference[oaicite:16]{index=16}
* '''버전 8 (사용자 정의)''': 응용 프로그램이 의미를 정의하는 커스텀 UUID.:contentReference[oaicite:17]{index=17}


=== 버전 1: 타임스탬프 기반 ===
== 주요 구현 및 채택 현황 ==
UUID 버전 1은 생성 시점의 시간과 공간(주로 MAC 주소)을 기반으로 UUID를 생성한다. 이 방식은 고유성이 보장되지만, 타임스탬프와 MAC 주소를 포함하기 때문에 개인 정보 유출의 가능성이 있다.
* '''PostgreSQL''' — <code>uuid_generate_v7()</code> 함수를 제공하는 확장 <code>pg_uuidv7</code>.:contentReference[oaicite:18]{index=18}
 
* '''Python''' — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.:contentReference[oaicite:19]{index=19}
=== 버전 2: DCE 보안 ===
* '''Go''' — <code>github.com/google/uuid</code> 및 <code>flexstack/uuid</code> 등이 v7을 지원한다.:contentReference[oaicite:20]{index=20}
UUID 버전 2는 DCE(Security Domain)의 보안 목적으로 사용된다. 버전 1과 유사하게 시간과 공간 기반으로 생성되지만, 추가적으로 POSIX UID/GID 정보를 포함한다. 실무에서는 거의 사용되지 않는다.
* '''Java''' — 표준 <code>java.util.UUID</code>는 v7을 아직 포함하지 않아 커뮤니티 논의가 활발하다.:contentReference[oaicite:21]{index=21}
 
* '''DuckDB''' — 1.3.0에서 v7 지원을 추가했으나 타임스탬프 호환성 이슈가 보고되었다.:contentReference[oaicite:22]{index=22}
=== 버전 3: 이름 기반(MD5 해시) ===
* 기타 언어들도 외부 라이브러리 형태로 빠르게 v7을 채택 중이다.:contentReference[oaicite:23]{index=23}
UUID 버전 3은 이름(Name)과 네임스페이스를 기반으로 MD5 해시를 사용해 UUID를 생성한다. 동일한 입력값에 대해 동일한 UUID를 보장한다.
 
=== 버전 4: 난수 기반 ===
UUID 버전 4는 난수를 기반으로 생성되며, 가장 일반적으로 사용된다. 난수 기반이므로 충돌 가능성이 매우 낮다.
 
=== 버전 5: 이름 기반(SHA-1 해시) ===
UUID 버전 5는 SHA-1 해시를 사용하며, 버전 3과 동일한 방식이지만 해시 알고리즘이 다르다.
 
=== (제안) 버전 6, 7, 8 ===
RFC 4122bis 문서에서 새롭게 제안된 UUID 버전 6, 7, 8은 다음과 같다:
 
* 버전 6: 기존 UUID 버전 1을 개선하여 시간순 정렬성을 강화.
* 버전 7: 밀리초 단위의 Unix 타임스탬프를 기반으로 정렬이 용이하게 설계.
* 버전 8: 새로운 사용자 정의 UUID 생성 방식을 포함.


== 충돌 확률 ==
== 충돌 확률 ==
UUID 버전 4의 충돌 확률은 극히 낮으며, <math>2^{122}</math> (약 <math>5.3 \times 10^{36}</math>)개의 가능한 UUID가 존재한다. 예를 들어, 초당 10억 개의 UUID를 100년 동안 생성해도 50% 충돌 확률에 도달하지 않는다.
버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.:contentReference[oaicite:24]{index=24}


== 결론 ==
== 결론 ==
UUID는 전 세계적으로 고유한 식별자를 생성하기 위한 표준으로, 다양한 시스템과 환경에서 널리 사용된다. 각 버전은 고유한 생성 방법과 용도를 가지며, 특정 상황에 맞는 UUID 버전을 선택하여 사용할 수 있다. 최신 표준에서 제안된 UUID 버전 6, 7, 8은 정렬성과 활용성을 강화하여 향후 더욱 널리 사용될 것으로 기대된다.
UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다.
 
<!-- 분류 -->
[[분류:컴퓨터 과학]] [[분류:소프트웨어 개발]] [[분류:식별자]] [[분류:데이터베이스]] [[분류:네트워크]] [[분류:확률]]

2025년 5월 23일 (금) 14:26 판

개요

UUID(Universally Unique Identifier)는 전 세계적으로 고유한 식별자를 만들기 위해 고안된 128비트 표준 식별자이다. 2005년의 RFC 4122가 2024년 5월 발표된 RFC 9562로 대체되며, 최신 규격에서 버전 6 · 7 · 8이 정식 표준에 포함되었다.:contentReference[oaicite:0]{index=0} UUID는 32자리 16진수 숫자를 8-4-4-4-12 형식으로 하이픈으로 구분하여 표현한다. 예) 123e4567-e89b-12d3-a456-426614174000. 버전 7은 밀리초 단위 Unix 타임스탬프를 상위 48비트에 포함해 시간 순 정렬성을 대폭 향상시켰다.:contentReference[oaicite:1]{index=1}

장단점

장점

  • 전 세계적 고유성: 분산 환경에서도 중복 없이 고유한 식별자를 생성할 수 있다.:contentReference[oaicite:2]{index=2}
  • 충돌 가능성 낮음: 2122 (≈5.3 × 1036)개의 조합으로 충돌 확률이 극히 낮다.:contentReference[oaicite:3]{index=3}
  • 독립성: 중앙 서버와 통신하지 않아도 식별자를 만들 수 있다.
  • 범용성: 대부분의 언어·플랫폼에서 기본 또는 외부 라이브러리로 지원한다.:contentReference[oaicite:4]{index=4}
  • 정렬성 향상: 버전 6·7은 시간 정보를 앞부분에 배치해 인덱스 지역성 문제를 완화한다.:contentReference[oaicite:5]{index=5}

단점

  • 크기: 16바이트이므로 대규모 DB 인덱스에는 부담이 될 수 있다.:contentReference[oaicite:6]{index=6}
  • 가독성: 사람이 읽고 기억하기엔 복잡하다.
  • 정렬: 난수 기반인 버전 4는 생성 순서가 무작위라 B-tree 인덱스 파편화가 심하다.:contentReference[oaicite:7]{index=7}
  • 보안: 버전 1은 MAC 주소·시간 정보가 노출될 수 있다.:contentReference[oaicite:8]{index=8}

특징

  • 고유성: 전 세계적으로 유일하다.
  • 확장성: 네트워크 상태와 무관하게 생성 가능.
  • 독립적 생성: 중앙 서버 없이 분산 환경에서 사용 가능.
  • 표준화: RFC 9562로 상호 운용성 보장.:contentReference[oaicite:9]{index=9}
  • 다양한 버전: 1 ~ 8 버전이 존재하며 용도별로 선택할 수 있다.:contentReference[oaicite:10]{index=10}
  • 풍부한 라이브러리: Python·Go·JavaScript 등에서 모듈 또는 패키지 형태로 제공된다.:contentReference[oaicite:11]{index=11}

UUID의 버전

  • 버전 1 (타임스탬프 + MAC): 시간·MAC 기반, 개인 정보 노출 우려.:contentReference[oaicite:12]{index=12}
  • 버전 2 (DCE 보안): POSIX UID/GID 포함, 실무 사용 거의 없음.
  • 버전 3 (이름 기반 + MD5): 동일 입력에 동일 UUID 보장.
  • 버전 4 (난수 기반): 가장 널리 쓰이며 충돌 확률 매우 낮음.:contentReference[oaicite:13]{index=13}
  • 버전 5 (이름 기반 + SHA-1): v3과 같으나 해시 알고리즘만 SHA-1.:contentReference[oaicite:14]{index=14}
  • 버전 6 (시간순 정렬 강화): v1의 한계를 보완해 상위비트에 big-endian 시간값 배치.:contentReference[oaicite:15]{index=15}
  • 버전 7 (Unix 에포크 밀리초): 48비트 타임스탬프 + 74비트 난수, 인덱스 친화적.:contentReference[oaicite:16]{index=16}
  • 버전 8 (사용자 정의): 응용 프로그램이 의미를 정의하는 커스텀 UUID.:contentReference[oaicite:17]{index=17}

주요 구현 및 채택 현황

  • PostgreSQLuuid_generate_v7() 함수를 제공하는 확장 pg_uuidv7.:contentReference[oaicite:18]{index=18}
  • Python — 표준 라이브러리는 v1·3·4·5만 지원하며, v7 추가 제안이 진행 중이다.:contentReference[oaicite:19]{index=19}
  • Gogithub.com/google/uuidflexstack/uuid 등이 v7을 지원한다.:contentReference[oaicite:20]{index=20}
  • Java — 표준 java.util.UUID는 v7을 아직 포함하지 않아 커뮤니티 논의가 활발하다.:contentReference[oaicite:21]{index=21}
  • DuckDB — 1.3.0에서 v7 지원을 추가했으나 타임스탬프 호환성 이슈가 보고되었다.:contentReference[oaicite:22]{index=22}
  • 기타 언어들도 외부 라이브러리 형태로 빠르게 v7을 채택 중이다.:contentReference[oaicite:23]{index=23}

충돌 확률

버전 4·6·7·8 모두 122비트 이상의 무작위 엔트로피를 갖는다. 초당 10억 개의 UUID를 100년간 생성해도 50% 충돌 확률에 도달하지 않는다.:contentReference[oaicite:24]{index=24}

결론

UUID는 여전히 분산 시스템에서 사실상 표준 식별자이며, RFC 9562 채택으로 버전 6·7·8이 공식화되어 정렬성과 활용성이 크게 개선되었다. 각 상황에 맞는 버전을 선택해 사용하면, 충돌 위험을 최소화하면서도 성능·보안·정렬성 요구 사항을 충족할 수 있다.