회원 테이블의 PK를 1, 2, 3 순서로 넣으면 URL에 /users/3이 노출된다. 전체 회원이 몇 명인지, 내가 몇 번째 가입자인지 추측할 수 있다. UUID를 쓰면 /users/550e8400-e29b-41d4-a716-446655440000처럼 의미 없는 식별자가 되어 이런 문제가 사라진다.
UUID의 구조
UUID(Universally Unique Identifier)는 128비트 길이의 고유 식별자다. 하이픈으로 구분된 32개의 16진수 문자로 표현된다.
550e8400-e29b-41d4-a716-446655440000
├── 8자리 ── 4자리 ── 4자리 ── 4자리 ── 12자리 ──┤
이론상 생성 가능한 UUID의 수는 2의 122승(약 5.3 × 10의 36승)개다. 우연히 같은 값이 나올 확률은 사실상 0에 수렴한다.
UUID 버전별 차이
| 버전 | 생성 방식 | 특징 |
|---|---|---|
| v1 | 타임스탬프 + MAC 주소 | 순서 보장, 하드웨어 정보 노출 위험 |
| v3 | 이름 기반 (MD5 해시) | 같은 입력이면 같은 UUID 생성 |
| v4 | 랜덤 생성 | 가장 널리 사용, 완전 무작위 |
| v5 | 이름 기반 (SHA-1 해시) | v3보다 충돌 저항성이 높음 |
| v7 | 타임스탬프 + 랜덤 (2022년 추가) | 시간순 정렬 가능, DB 인덱스에 유리 |
실무에서 가장 많이 쓰이는 건 v4다. 생성 시 외부 정보(시간, MAC 주소)에 의존하지 않고 순수 랜덤이라 간단하면서 안전하다.
UUID를 쓰는 실무 사례
- 분산 시스템 — 여러 서버에서 동시에 ID를 생성해도 충돌하지 않는다. 중앙 서버에 ID를 요청할 필요가 없어 병목이 줄어든다.
- API 리소스 식별 — URL에 auto_increment ID를 노출하면 보안 취약점이 될 수 있다. UUID로 대체하면 추측이 불가능하다.
- 파일명·세션 ID — 중복 없는 고유 값이 필요한 모든 곳에 사용 가능하다.
UUID 빠르게 생성하기
코드에서는 각 언어별 라이브러리(uuid npm 패키지, Python의 uuid4(), Java의 UUID.randomUUID())를 쓴다. 코드 바깥에서 테스트 데이터용 UUID가 필요하거나 여러 개를 한 번에 만들어야 할 때는 UUID 생성기에서 개수와 형식을 지정해서 대량 생성한 뒤 파일로 다운로드하는 게 빠르다. 하이픈 제거, 대문자 변환, 중괄호 형식(GUID) 등 옵션도 지원한다.
auto_increment가 편하긴 하지만, 서비스 규모가 커지거나 보안이 중요해지면 UUID 전환을 고려할 시점이 온다. 미리 구조를 알아두면 전환 시 삽질을 줄일 수 있다.