UUID 생성기 (v4)

브라우저에서 암호학적으로 안전한 난수 소스를 사용해 버전 4 UUID를 하나 또는 여러 개 생성합니다 — 서버로 전송되는 데이터는 전혀 없습니다.

조회수 1,032회

v4 UUID를 고유하게 만드는 요소

UUID(범용 고유 식별자)는 128비트 숫자로, 관례적으로 16진수 8-4-4-4-12 형태의 36자로 표기됩니다. 예를 들면 f47ac10b-58cc-4372-a567-0e02b2c3d479와 같습니다. 이 128비트 중, 이 생성기가 만드는 방식인 버전 4는 122비트를 암호학적으로 안전한 난수 생성기의 출력으로 채웁니다. 나머지 6비트는 전혀 무작위가 아닙니다. 이는 UUID를 버전 4로 식별하고 그 "변형(variant)"을 표시하는 고정된 표식으로, 이 때문에 두 번째 하이픈 바로 다음 문자는 항상 4이며, 다음 그룹의 첫 문자는 항상 8, 9, a, b 중 하나입니다.

122개의 무작위 비트는 엄청나게 큰 공간입니다. 2^122가지, 약 5.3×10^36가지 값이 가능합니다. 이를 구체적으로 설명하면, 지구상의 모든 기기가 초당 10억 개의 UUID를 계속해서 생성하더라도, 단 한 번의 우연한 중복이 발생할 확률이 50%에 도달하기까지는 수백억 년에 달하는 총 생성 시간이 필요합니다. 이것이 바로 분산 시스템 — 서로 조율 없이 수백 대의 독립된 서버에서 운영되는 서비스들 — 이 각자 자신의 UUID를 로컬에서 발급하면서도 중앙 registry를 확인하지 않고 두 값이 결코 충돌하지 않을 것이라 신뢰할 수 있는 이유입니다. 이것이 바로 이 형식의 전체적인 목적입니다. 데이터베이스 조회 없이 고유한 식별을 가능하게 하는 것입니다.

여기서의 생성은 전적으로 브라우저 안에서 Web Crypto API의 crypto.randomUUID() 함수를 사용해 이루어집니다 — 브라우저가 보안에 민감한 작업에 사용하는 것과 동일한 암호학적 난수 소스입니다. 아무것도 서버로 전송되지 않고, 어떤 시드도 기록되지 않으며, 생성하는 각 UUID는 다른 모든 UUID와 독립적입니다.

UUID를 사용하기 전에 알아야 할 것

v4만 있는 것이 아닙니다. v1과 v6은 타임스탬프와 생성한 기기의 네트워크 주소를 담아 정렬 가능하게 만들지만, 언제 어디서 생성되었는지에 대한 정보도 함께 유출합니다. v5는 제공한 이름을 해시하여 동일한 입력에 대해 매번 동일한 UUID를 생성합니다 — 무작위가 아니라 결정론적인 식별자가 필요할 때 유용합니다. 더 새로운 표준인 v7은 타임스탬프 접두어와 무작위 비트를 결합하여 고유성과 자연스러운 시간순 정렬을 동시에 제공합니다. 단순히 무작위이고, 추측 불가능하며, 충돌 없는 식별자가 필요하고 시간이나 이름을 인코딩할 필요가 없다면 v4가 여전히 올바른 기본 선택입니다.

실무적으로 유의할 점이 하나 있습니다. v4 값은 완전히 무작위이기 때문에 이를 데이터베이스 기본 키로 사용하면 B-트리로 인덱싱된 테이블에서 삽입 성능이 저하될 수 있습니다. 새 행이 인덱스의 한쪽 끝에 깔끔하게 추가되는 대신 인덱스 전체에 걸쳐 예측 불가능한 위치에 놓이기 때문입니다. 대규모에서 삽입 처리량이 중요하다면, UUIDv7이나 ULID 같은 시간순 정렬 대안이 동일한 128비트 고유성 보장을 유지하면서도 인덱스 친화적입니다.

자주 묻는 질문

생성된 두 UUID가 충돌할 수 있나요?

이론적으로는 가능하지만 실제로는 거의 일어나지 않습니다. 2^122가지 경우의 수에서 초당 10억 개의 UUID를 85년간 생성해도 단 한 번 충돌할 확률은 약 50%에 불과합니다. 전 세계 시스템이 이 사실에 의존하고 있습니다.

UUID를 데이터베이스 기본 키로 사용해도 되나요?

분산 생성과 추측 불가능한 ID에는 강점이 있지만, 무작위 v4는 B-트리 인덱스를 조각냅니다. 삽입 성능이 중요하다면 시간순으로 정렬되는 UUIDv7이나 ULID를 검토해 보십시오 — 크기는 같고 인덱스 친화적입니다.

v4만 있는 건가요?

아니요 — v1/v6은 타임스탬프와 MAC 주소를 담고, v5는 이름을 해시하여 항상 같은 결과를 내며, v7은 타임스탬프와 무작위성을 결합한 더 새로운 형식입니다. 그냥 무작위 고유 ID가 필요하다면 v4가 기본 선택지입니다.

v4 UUID의 고정 비트는 무엇을 위한 것인가요?

128비트 중 122비트만 무작위입니다. 나머지 6비트는 형식 자체를 표시하기 위해 예약되어 있습니다 — 한 니블은 "버전 4"임을 나타내도록 고정되고, 다른 하나는 "변형"을 표시하기 위해 소수의 값(8, 9, a, b)으로 제한됩니다. 이 때문에 몇 개를 생성하든 모든 v4 UUID는 두 번째 하이픈 바로 다음에 4를 가집니다.

UUID를 비밀번호 재설정 링크 같은 보안 토큰으로 사용할 수 있나요?

v4 UUID는 암호학적으로 안전한 난수 소스에서 생성되므로 추측하는 것은 현실적이지 않습니다 — 하지만 설계 목적은 기밀성이 아니라 고유성입니다. 보안이 민감한 용도에는 UUID 단독에 의존하기보다 적절한 만료 시간, 일회용 처리, 서버 측 검증을 함께 적용하십시오.

댓글

아직 댓글이 없습니다 — 첫 댓글을 남겨보세요!

비슷한 도구