짧은 UUID 개요
UUID는 36자인데, 그중 하이픈 4자와 16진수라는 표기 때문에 길이가 늘어난 것입니다. 같은 128비트를 Base64url로 인코딩하면 패딩 없이 22자로 줄어듭니다.
Base64url은 -와 _만 쓰기 때문에 URL 경로, 쿼리 문자열, 파일 이름에 넣어도 이스케이프가 필요 없습니다. 더 짧게 만들고 싶으면 12바이트(16자)나 8바이트(11자) 변형을 고르세요.
사용 방법
- 랜덤 바이트 수에서 크기를 고릅니다. 16바이트는 UUID와 같은 128비트입니다.
- 필요하면 개수를 설정합니다. 최대 1000개까지 가능합니다.
- 생성을 누릅니다.
- 전체 복사나 다운로드로 가져갑니다.
사용 사례
- URL 경로나 쿼리에 들어가는 리소스 식별자.
- 파일 이름이나 로그 키처럼 짧아야 하는 자리.
- 128비트는 과하고 64비트면 충분한 내부 식별자.
구조
16바이트를 Base64url로 인코딩하면 22자가 됩니다. 12바이트는 16자, 8바이트는 11자입니다. 패딩 문자는 붙지 않습니다.
짧은 UUID의 역할
| 옵션 | 사용 시점 |
|---|---|
짧은 UUID | 22자. URL과 파일 이름에 그대로 씁니다 |
UUID v4 | 36자지만 어떤 도구에서도 그대로 읽힙니다 |
형식 변환 | 이미 있는 UUID를 짧게 줄일 때 |
UUID 버전 한눈에 보기
| 버전 | 정렬 가능 | 값의 출처 | 적합한 용도 |
|---|---|---|---|
| v1 | 불가능 | 타임스탬프 + MAC 주소 | v1을 계속 쓰는 기존 시스템 |
| v3 | 불가능 | 이름의 MD5 해시 | MD5를 꼭 써야 하는 결정적 식별자 |
| v4 | 불가능 | 122비트 난수 | 대부분의 일반적인 고유 식별자 |
| v5 | 불가능 | 이름의 SHA-1 해시 | 같은 이름에서 항상 같은 식별자가 필요할 때 |
| v6 | 가능 | 재배열한 타임스탬프 | 난수성과 정렬을 함께 원할 때 |
| v7 | 가능 | 밀리초 단위 Unix 시간 | 데이터베이스 기본 키와 이벤트 식별자 |
| v8 | 불가능 | 사용자 정의 비트 레이아웃 | 사내 형식과 실험적 용도 |
일곱 버전 모두 128비트이고, 모두 같은 8-4-4-4-12 표기법으로 표현합니다. 차이는 각 비트가 무엇을 담는지뿐입니다.
코드 예제
javascript
const bytes = crypto.getRandomValues(new Uint8Array(16));
const short = btoa(String.fromCharCode(...bytes))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
python
import base64, os
short = base64.urlsafe_b64encode(os.urandom(16)).rstrip(b'=').decode()
java
byte[] bytes = new byte[16];
new java.security.SecureRandom().nextBytes(bytes);
String short = Base64.getUrlEncoder().withoutPadding()
.encodeToString(bytes);
csharp
var bytes = RandomNumberGenerator.GetBytes(16);
var shortId = Convert.ToBase64String(bytes)
.Replace('+', '-').Replace('/', '_').TrimEnd('=');
sql
-- PostgreSQL 13+
SELECT translate(encode(gen_random_bytes(16), 'base64'), '+/=', '-_');
자주 묻는 질문
짧은 UUID도 고유한가요?
16바이트를 쓰면 UUID와 같은 128비트이므로 고유성도 같습니다. 8바이트로 줄이면 64비트가 되어, 값이 많아질수록 겹칠 확률이 눈에 띄게 올라갑니다.
UUID 컬럼에 넣을 수 있나요?
값 자체는 바이트이므로 저장은 됩니다. 다만 UUID 타입으로 선언한 컬럼에 넣으려면 다시 128비트로 디코딩해야 버전과 변형 자리를 채울 수 있습니다.
URL에 넣어도 안전한가요?
안전합니다. Base64url은 -와 _만 쓰기 때문에 URL 경로와 쿼리 문자열에서 이스케이프가 필요 없습니다.