CS

[CS] UUID v4 vs v7

kahnco 2025. 4. 17. 11:06
반응형

개요

보편적으로 고유한 식별자(Universally Unique Identifiers, UUIDs)는 컴퓨터 시스템 전반에 걸쳐 정보를 고유하게 식별하는 데 필수적인 128비트 숫자입니다. 분산 시스템과 데이터베이스에서 정보의 무결성을 보장하는 데 중요한 역할을 하며, 현대 컴퓨팅 환경에서 그 중요성은 날로 증가하고 있습니다. 다양한 UUID 버전 중에서 버전 4는 오랫동안 널리 사용되어 왔지만, 최근에는 시간 기반 정렬 기능을 갖춘 버전 7이 등장하여 주목받고 있습니다. 애플리케이션의 특정 요구 사항에 따라 적절한 UUID 버전을 선택하는 것은 매우 중요하며, 이를 위해서는 각 버전의 특징과 장단점에 대한 깊이 있는 이해가 필요합니다.

https://www.cockroachlabs.com/blog/what-is-a-uuid/

 

What is a UUID, and what is it used for?

You need to identify your database rows somehow. Calling them row 1, row 2, etc. comes with some hidden hazards. There's a better way: UUIDs.

www.cockroachlabs.com

https://www.rfc-editor.org/rfc/rfc9562.html

 

RFC 9562: Universally Unique IDentifiers (UUIDs)

The authors gratefully acknowledge the contributions of Rich Salz, Michael Mealling, Ben Campbell, Ben Ramsey, Fabio Lima, Gonzalo Salgueiro, Martin Thomson, Murray S. Kucherawy, Rick van Rein, Rob Wilton, Sean Leonard, Theodore Y. Ts'o, Robert Kieffer, Se

www.rfc-editor.org

https://datatracker.ietf.org/doc/html/rfc4122

 

RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace

This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally use

datatracker.ietf.org

 


성능 비교

1. 생성 속도

UUID v7은 UUID v4와 유사하거나 약간 느린 생성 속도를 보입니다. 일부 벤치마크에서는 UUID v7의 생성 속도가 UUID v4와 거의 동일하거나 약간 빠르다고 나타냅니다. Rust 기반 구현에서는 UUID v7 생성이 UUID v4보다 약 40% 느릴 수 있지만, 여전히 매우 빠른 수준입니다. Go 언어 기반 벤치마크에서는 UUID v7 생성이 UUID v4와 비슷한 성능을 보입니다.

https://ardentperf.com/2024/02/03/uuid-benchmark-war/

 

UUID Benchmark War

This month’s PGSQL Phriday #015 topic is about UUIDs, hosted by Lætitia Avrot. Lætitia has called for a debate. No, no, no. I say let’s have an all-out war. A benchmark war. I have deci…

ardentperf.com

 

2. 정렬 가능성 및 효율성

UUID v7의 가장 큰 성능 이점은 시간 기반 정렬 기능입니다. UUID v7의 처음 48비트는 생성 시간을 나타내는 Unix 에포크 타임스탬프(밀리초 단위)로 구성되어 있어, 시간 순서대로 정렬이 가능합니다. 이는 데이터베이스 인덱스에서 특히 중요합니다. 시간 순서대로 정렬된 UUID는 데이터베이스 인덱스의 지역성을 향상시켜 쓰기 성능을 최적화하고 인덱스 단편화를 줄입니다.

 

반면, UUID v4는 완전히 무작위로 생성되므로 순서가 없어 데이터베이스 인덱스 지역성이 떨어지고, 쓰기 작업이 많을 경우 성능 저하를 유발할 수 있습니다. 따라서 시간 기반 쿼리가 많거나 최근 데이터에 대한 접근 빈도가 높은 애플리케이션에서는 UUID v7이 UUID v4보다 훨씬 효율적인 성능을 제공할 수 있습니다.

https://uuid7.com/

 

UUIDv7 Benefits

UUIDv7: The Time-Sortable Identifier for Modern Databases The world of unique identifiers is vast, and UUIDs (Universally Unique Identifiers) have long held a prominent position due to their ability to uniquely identify information across distributed syste

uuid7.com


기술적 구조

1. UUID  v4

UUID 버전 4는 128비트 길이로, 32개의 16진수로 표현되며 8-4-4-4-12 패턴으로 하이픈으로 구분됩니다. 이 중 6비트는 버전(4)과 변형(일반적으로 RFC 4122)을 나타내는 데 사용됩니다. 나머지 122비트는 임의로 생성됩니다.

필드 길이(비트) 설명
random_a 48 임의 데이터 (옥텟 0-5)
ver 4 버전 필드 (0b0100, 4) (옥텟 6, 비트 48-51)
random_b 12 임의 데이터 (옥텟 6-7, 비트 52-63)
var 2 변형 필드 (0b10) (옥텟 8, 비트 64-65)
random_c 62 임의 데이터 (옥텟 8-15, 비트 66-127)

 

UUID v4의 세 번째 그룹의 첫 번째 문자는 항상 '4'이며, 네 번째 그룹의 첫 번째 문자는 '8', '9', 'a', 또는 'b' 중 하나입니다.

 

2. UUID v7

UUID 버전 7도 128비트 길이로, 표준 8-4-4-4-12 16진수 문자열 형식으로 표현됩니다. 주요 구성 요소는 다음과 같습니다:

필드 길이(비트) 설명
unix_ts_ms 48 빅 엔디안 Unix 에포크 타임스탬프 (1970년 1월 1일 00:00:00 UTC 이후 밀리초) (비트 0-47)
ver 4 버전 필드 (0b0111, 7) (비트 48-51)
rand_a 12 의사 난수 데이터 (고유성 제공). 서브 밀리초 정밀도 또는 단조 시퀀스 카운터 포함 가능 (비트 52-63)
var 2 변형 필드 (0b10) (비트 64-65)
rand_b 62 의사 난수 데이터 (고유성 보장). 단조 시퀀스 카운터 포함 가능 (비트 66-127)

 

UUID v7은 unix_ts_ms 필드를 통해 시간 순서대로 생성되므로, 데이터베이스 인덱스에서 효율적인 정렬 및 검색이 가능합니다.


보안성과 충돌 가능성

1. UUID v4

UUID 버전 4는 122비트의 임의성을 가지므로 충돌 가능성은 극히 낮습니다. 이론적으로 충돌이 발생할 수 있지만, 실제로는 매우 드뭅니다. 예를 들어, 매초 10억 개의 UUID를 생성한다고 해도 충돌이 발생할 확률은 매우 낮습니다. 그러나 사용되는 난수 생성기의 품질이 중요하며, 암호학적으로 안전한 PRNG(CSPRNG)를 사용하는 것이 권장됩니다. UUID v4는 무작위성으로 인해 생성 시간을 알 수 없어 세션 ID나 API 키와 같은 보안에 민감한 식별자에 적합합니다.

https://versprite.com/blog/universally-unique-identifiers/

 

Universally Unique IDentifiers (UUIDs) Are Yours Secure?

Secure your UUIDs (universally unique identifiers). What is UUID used for? Learn UUID versions and their significance in software development.

versprite.com

2. UUID v7

UUID 버전 7은 48비트 타임스탬프와 74비트의 임의 비트를 결합하여 고유성을 보장합니다. UUID v4에 비해 임의 비트 수가 적지만, 충돌 가능성은 여전히 매우 낮습니다. UUID v7의 타임스탬프는 생성 시간을 대략적으로 노출하므로, 보안상 민감한 정보가 ID에 포함될 경우 주의가 필요합니다. 그러나 데이터베이스 기본 키와 같이 순서 기반의 성능이 중요한 경우에는 UUID v7이 더 나은 선택일 수 있습니다.

https://uuid.ramsey.dev/en/stable/rfc4122/version7.html


요약

특징 UUID 버전 4 UUID 버전 7
기본 메커니즘 임의/의사 임의 숫자 생성 Unix Epoch 타임스탬프 + 임의 비트
타임스탬프 포함 아니요 예 (48비트 Unix 타임스탬프(밀리초))
정렬 가능성 본질적으로 순서 없음 시간 순서 (생성 시간별 정렬 가능)
데이터베이스 성능 낮은 인덱스 지역성 가능성 일반적으로 더 나은 인덱스 지역성 및 쓰기 성능
개인 정보 보호 영향 높음 (시간 정보 없음) 낮음 (대략적인 생성 시간 공개)
보안 (추측 가능성) 높음 (강력한 CSPRNG 사용 시) 일반적으로 좋음, 하지만 타임스탬프가 작은 공격 표면 제공 가능
엔트로피 (임의 비트) 122비트 74비트 (서브 밀리초 정밀도 포함 가능)
RFC 사양 RFC 4122 RFC 9562 (RFC 4122를 대체)
주요 사용 사례 범용, 보안에 민감한 ID 데이터베이스 기본 키, 시간 순서 식별자

 

UUID 버전 4는 강력한 개인 정보 보호 및 예측 불가능성이 필요한 보안에 민감한 애플리케이션에 적합합니다. 세션 토큰, API 키 및 기타 비밀과 같이 예측 불가능성이 주요 관심사인 보안 식별자에 적합합니다. 임의 인덱싱의 성능 영향이 미미하거나 다른 최적화 기술을 통해 관리할 수 있는 애플리케이션에서도 유용합니다. 버전 4에 크게 의존하는 레거시 시스템 또는 기존 표준과의 호환성이 주요 요구 사항인 경우에도 적합합니다.

 

반면에 UUID 버전 7은 시간 기반 정렬 및 향상된 인덱스 지역성이 더 나은 성능을 위해 바람직한 새로운 시스템의 데이터베이스 기본 키에 선호되는 선택입니다. 연대순 식별자 순서가 분석 및 쿼리에 유용한 로깅 시스템, 이벤트 추적 및 기타 애플리케이션에도 유용합니다. 시간 순서 ID는 UUIDv1의 개인 정보 보호 문제 없이 데이터 관리를 단순화하고 성능을 향상시킬 수 있는 분산 시스템에도 적합합니다. 향상된 특성으로 인해 이전 시간 기반 UUID(v1 및 v6)보다 일반적으로 권장되는 버전입니다.


결론

UUID 버전 4와 버전 7은 모두 고유 식별자를 제공하지만, 그 방식과 특징에는 뚜렷한 차이가 있습니다. 버전 4는 무작위성에 기반하여 높은 수준의 개인 정보 보호 및 예측 불가능성을 제공하므로 보안에 민감한 애플리케이션에 적합합니다. 반면 버전 7은 시간 기반 정렬 기능을 도입하여 데이터베이스 성능을 향상시키는 데 중점을 두어, 현대 데이터베이스 중심 애플리케이션에 매력적인 선택입니다. 따라서 개발자는 UUID 버전을 선택할 때 성능, 개인 정보 보호 및 시간 기반 정렬 필요성과 같은 애플리케이션의 특정 요구 사항을 신중하게 고려해야 합니다.

반응형