본문 바로가기
카테고리 없음

UUID 개념 정리

by 오피스포디 2023. 12. 17.
반응형

UUID란

  • Universally Unique IDentifier 의 약자 : "범용 고유 식별자" 라고 번역합니다.
  • RFC 4122 표준으로 정의되어 있습니다 : RFC4122
  • UUID 버전마다 정의가 다르며, 1~5까지 현재 5개의 버전이 나와 있습니다.
  • 총 32자리의 16진수로 되어 있습니다.
  • 각 자리가 16진수 (= 4 bit = 1 nibble) 이므로, 비트로 환산하면 128 bit = 16 Byte 가 됩니다.
  • 구성은 5개의 서브 모듈로 되어 있고, 각 모듈은 8-4-4-4-12 개의 16진수로 구성됩니다. (예시. 550e8400-e29b-41d4-a716-446655440000)
  • 현재의 구성대로라면 서기 약 3400년 정도까지는 중복 없이 사용 가능하다고 합니다. (대략 1380년 정도 남았습니다.)

버전별 특징

버전 설명 특징
1 해당 버전은 “현재 시간”과 “랜덤한 MAC 주소”를 기반으로 생성됩니다. 유일성이 보장되지만 보안에 취약
2 해당 버전은 이전 버전 1과 유사하지만 시퀀스 번호 대신 POSIX UID(사용자 ID)를 사용하여 생성됩니다. 현재는 거의 사용하지 않습니다.
3 해당 버전은 해시 함수인 “MD5 해시”를 기반으로 이름과 네임스페이스에 대한 조합으로 생성됩니다. 암호화 해시 함수를 사용하여 생성하므로 보안성이 높음. 이름과 네임스페이스가 같으면 같은 UUID가 생성됩니다.
4 해당 버전은 “랜덤한 값”을 기반으로 생성됩니다. 보안성이 높고 생성속도가 빠릅니다.
5 해당 버전은 이전 버전 3과 유사하지만 “SHA-1 해시”를 사용하여 생성됩니다.  

구성

포맷

{time_low} - {time_mid} - {time-high-and-version} - {clock-seq-hi-and-reserved}{clock-seq-low} - {node}

레이아웃

0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
time-low
time-mid time-high-and-version
clk-seq-hi-and-reserved clk-seq-low node (0-1)
node (2-5)

레이아웃 별 상세 의미

각 자리의 뜻

Field Byte Number Note
time_low 0-3 The low field of the timestamp
time_mid 4-5 The middle field of the timestamp
time_high_and_version 6-7 the high field of the timestamp multiplexed with the version number
clock_seq_hi_and_reserved 8 The high field of the clock sequence multiplexed with the variant
clock_seq_low 9 The low fiel of the clock sequence
node 10-15 The spatially unique node identifier

타임스탬프

  • 타임스탬프는 총 60 bit 입니다.
  • UUID 버전 1은 UTC 1582.10.15 00:00:00.000 을 기준으로, 100 나노초 단위로 센 오프셋의 값을 수정하여 60비트를 만들어 냅니다.
  • UUID 버전 3/5 는 미리 정의된 몇가지 네임스페이스를 기준으로 이를 만들어내고, 변환하는 방법이 MD5와 SHA-1 해시로 다릅니다.
  • UUID 버전 4는 random 또는 pseudo-random 하게 이 바이트들을 생성해냅니다.
  • 만들어낸 60비트 숫자를 다음과 같이 할당합니다.
    • LSB 순으로 0-31 bit 는 time_low 에 할당
    • 32-47 비트는 time_mid 에 할당
    • 48-59는 time_high_and_version 의 LSB 순으로 할당

버전

  • 버전은 UUID 버전을 나타냅니다.
  • time_high_and_version 의 MSB 4비트에 할당됩니다.
  • 즉, 사람 눈으로 보기에는 3번째 서브 모듈의 첫번째 16진수는 UUID 버전입니다.
숫자 0 1 2 3 비고
0x1 0 0 0 1 버전 1
0x2 0 0 1 0 버전 2
0x3 0 0 1 1 버전 3
0x4 0 1 0 0 버전 4
0x5 0 1 0 1 버전 5

Clock Sequence

  • 클럭에다가 시퀀스라는 이름이 같이 있으니 뭔가 했으나, 그냥 랜덤 넘버를 나타냅니다. stack overflow에서는 "misleading name" 이라고 말하기도 합니다.
  • UUID 버전 1에서 이걸 왜 썼냐면, 첫 60 비트를 Timestamp를 이용했으니 혹시나 클럭에 따라 시간이 거꾸로 흐르게 설정되어 있을 경우 중복될 경우를 방지하기 위해서 추가적인 랜덤 넘버를 둔 것이라고 합니다.
  • UUID 버전 3/5 에서는 네임스페이스에서 생성한 랜덤 넘버 중 일부를 이 자리수에 채워넣습니다.
  • UUID 버전 4에서는 random 혹은 pseudo-random 넘버를 채워넣습니다.

Node

  • UUID 버전 1에서는 MAC주소로부터 생성한 값
  • UUID 버전 3/5에서는 마찬가지로 네임스페이스에서 생성한 랜덤 넘버 중 일부를 할당
  • UUID 버전 4에서도 역시 random 혹은 pseudo-random 넘버를 채워넣습니다.

결론적으로

  • UUID 버전 1에서는 각 자리수별 의미들이 각기 다르고, 시공간을 결합하여 유일성을 보장하고자 하는 의미가 컸으나
  • 보안에 취약하다는 단점이 있어 이를 보완하는 과정에서
  • 결국 UUID 버전 3/4/5로 가면서는 방식만 조금씩 다르지, 각 자리의 의미가 별 차이 없이 거의 랜덤 넘버로 생성된다는 특징이 있습니다.
  • 단, 버전에 관계없이 UUID의 3번째 서브모듈의 첫번째 16진수는 UUID의 버전을 가리킵니다. 예시는 아래와 같습니다.
Version Note Example
Version 1 MAC address & timestamp 550e8400-e29b-11ea-a716-446655440000
Version 3 MD5 hash & namespace f84118c2-56e0-3408-98d7-6d8360cd75e4
Version 4 Random 550e8400-e29b-41d4-a716-446655440000
Version 5 SHA-1 hash & namespace 66e3abd5-4b0a-5b3a-a73f-656bb7093d9c

 

UUID의 개념과 특징

반응형

댓글