v4와 v7 중 무엇을 쓸까
둘 다 충돌 걱정 없이 쓸 수 있는 128비트 식별자입니다. 차이는 정렬 가능 여부입니다.
| v4 (무작위) | v7 (시간순) | |
|---|---|---|
| 구성 | 122비트 전부 난수 | 앞 48비트가 밀리초 시각 + 나머지 난수 |
| 정렬 | 불가능 | 문자열 정렬 = 생성 시각 순 |
| DB 인덱스 | 삽입 위치가 흩어져 인덱스가 조각남 | 끝에 차곡차곡 쌓임 |
| 노출 정보 | 없음 | 생성 시각이 드러남 |
DB 기본키로 쓸 거라면 v7이 낫습니다. v4를 기본키로 쓰면 새 행이 인덱스 아무 데나 꽂혀서, 데이터가 쌓일수록 쓰기가 눈에 띄게 느려집니다. 반대로 공개 URL에 노출되는 토큰이라면 생성 시각을 흘리지 않는 v4가 맞습니다.
중복될 가능성
v4는 122비트가 난수입니다. 초당 10억 개를 100년 동안 만들어도 충돌 확률이 무시할 만한 수준입니다. 실무에서 UUID 충돌을 걱정할 필요는 없습니다.
단, 난수의 품질이 전제입니다. 이 도구는 브라우저의 암호학적 난수
(crypto.getRandomValues)를 씁니다. Math.random()으로 만든 UUID는
예측 가능하므로 토큰이나 비밀번호 재설정 링크에 쓰면 안 됩니다.
형식
표준 표기는 소문자에 하이픈 4개입니다(8-4-4-4-12). 대문자와 중괄호
({...})는 마이크로소프트 계열에서 GUID를 표기하던 방식이고, 하이픈 없는 32자는
저장 공간을 아낄 때 씁니다. 셋 다 같은 값이므로 시스템 간에 주고받을 때 형식만 맞춰 주면 됩니다.
UUID와 GUID는 다른가요?
같습니다. 마이크로소프트가 부르는 이름이 GUID일 뿐입니다.
v1은 왜 없나요?
v1은 네트워크 카드의 MAC 주소를 값에 넣습니다. 기기를 식별할 수 있게 되어 개인정보 문제가 있고, 브라우저에서는 MAC 주소를 알 수도 없습니다. 시간순이 필요하면 v7을 쓰세요 — v1을 대체하려고 만든 것입니다.