데이터베이스에 사용자를 추가하는데, ID를 1, 2, 3으로 순서대로 매기면 보안상 문제가 생길 수 있다. URL에 /user/3이라고 치면 다른 사용자 정보에 접근할 수 있기 때문이다. 그래서 예측할 수 없는 고유 ID가 필요하고, 이때 쓰는 게 UUID다.
UUID 구조 이해하기
UUID(Universally Unique Identifier)는 128비트(32자리 16진수) 식별자다. 형식은 이렇다.
550e8400-e29b-41d4-a716-446655440000
│ │ │ │ │
8자리 4자리 4자리 4자리 12자리
하이픈으로 구분된 5개 그룹, 총 36자(하이픈 포함)로 구성된다. v4 기준으로 122비트가 랜덤 값이고, 나머지 6비트는 버전과 변형 정보를 담는다.
UUID 버전별 차이
| 버전 | 생성 방식 | 특징 |
|---|---|---|
| v1 | 시간 + MAC 주소 | 시간순 정렬 가능, MAC 주소 노출 위험 |
| v3 | 네임스페이스 + MD5 | 같은 입력에 같은 UUID 출력 |
| v4 | 완전 랜덤 | 가장 많이 쓰임, 충돌 확률 극히 낮음 |
| v5 | 네임스페이스 + SHA-1 | v3의 보안 강화 버전 |
| v7 | 시간 기반 + 랜덤 | 시간순 정렬 가능, DB 인덱스 친화적 |
현재 실무에서 가장 많이 쓰이는 건 v4다. 외부 정보에 의존하지 않고 난수만으로 생성하기 때문에 구현이 단순하고 보안 측면에서도 깔끔하다.
충돌(같은 UUID가 두 번 나올) 확률은?
UUID v4의 가능한 조합 수는 약 5.3 × 10³⁶개다. 매초 10억 개씩 생성해도 중복이 나올 확률이 50%가 되려면 약 86년이 걸린다. 사실상 충돌은 걱정하지 않아도 되는 수준이다.
UUID를 어디에 쓰나
- 데이터베이스 기본키: 순차 ID 대신 UUID를 쓰면 ID 추측 공격을 방지할 수 있다.
- 분산 시스템: 여러 서버에서 동시에 ID를 생성해도 중복될 위험이 없다. 중앙 서버에 번호를 요청할 필요가 없다.
- API 리소스 식별:
/api/orders/550e8400-e29b-41d4-a716-446655440000 - 파일명: 업로드된 파일에 UUID를 붙이면 이름 충돌을 방지할 수 있다.
- 세션/토큰: 사용자 세션 ID나 일회용 토큰으로 활용한다.
프로젝트에서 테스트용 UUID가 여러 개 필요하거나 특정 형식(하이픈 제거, 대문자 등)이 필요한 경우, UUID 생성기에서 최대 1,000개까지 한 번에 만들 수 있다. 텍스트 파일로 다운로드도 되니 대량으로 필요할 때 편하다.
TIP UUID를 DB 기본키로 쓸 때 주의할 점이 있다. v4는 완전 랜덤이라 B-Tree 인덱스에서 삽입 성능이 떨어질 수 있다. 대량 쓰기가 많은 시스템이라면 시간 기반 정렬이 가능한 v7이나 ULID를 고려해보는 것도 방법이다.
고유 ID가 필요한 곳에 UUID를 쓰면 중복 걱정 없이 시스템을 설계할 수 있다. 개발자라면 한 번쯤 정리해둘 가치가 있는 개념이다.