UUID를 단순히 유니크 값이라고 생각해왔는데 얼마나 유니크하고 정말 중복될 확률이 없는지 알아보겠습니다.
UUID란?
UUID(universally unique identifier)란, 범용 고유 식별자로 네트워크 상에서 서로 모르는 개체들을 식별하고 구별하기 위해 개발주체가 스스로 이름을 짓도록 하되 고유성을 충족할 수 있는 방법입니다.
총 36개 문자(32개 문자와 4개의 하이픈, 128bit)로 된 8-4-4-4-12라는 5개의 그룹을 하이픈으로 구분합니다.
- 예) 550e8400-e29b-41d4-a716-446655440000
- 중간에 4는 버전을 나타냅니다.
버전
- v1 : timestamp + MAC 주소
- v2 : timestamp + MAC 주소 + DCE 보안
- v3 : name-based + MD5 해시
- v4 : 랜덤
- v5 : name-based + SHA-1 해시
보통 디바이스 MAC 주소를 이용한 버전 1과 순수 랜덤 난수로 발생시킨 버전 4가 많이 사용되는데, UUID가 충돌될 가능성은 과연 없는 것일까?
버전 1의 경우 같은 컴퓨터에서 아주아주 우연히 같은 nanosecond에 UUID가 생성되더라도 Uniquifier(14bit)가 랜덤 한 값으로 생성되기 때문에 충분히 안전합니다. 누군가 악의적으로 MAC 주소와 컴퓨터 시간을 조작하지 않는 한, 정상적인 서버 환경에서는 걱정할 필요가 없습니다. 다만 UUID1으로 생성된 값이 생성시간, MAC 주소 정보를 내포하고 있기 때문에 보안의 관점에서 유의해야 합니다.
버전 4는 초당 10억 개의 UUID를 약 85년 동안 생성해야 충돌이 한번 날까 말까 한다고 합니다. 이는 전 세계의 사람들이 각자 6억 개의 UUID를 보유했을 때라고 합니다. 단순히 확률적인 값에 비유하자면 길가다 운석 맞을 확률과 같습니다.
import java.util.UUID;
public String getRandomUUID() {
return UUID.randomUUID();
}
정리
UUID1은 UUID4에 비해 중복 가능성이 낮은 UUID를 생성할 수 있지만, UUID에 생성된 시각과 MAC 주소 정보를 내포하기 때문에 보안 관점에서 유의해야 합니다.
UUID4는 충분히 안전하게 UUID를 생성하며, 중복될 수 있는 통계적 가능성 역시 극히 희박하기 때문에 중복 가능성을 걱정할 필요는 없습니다.
다만 확률이 존재한다는 점에서 "만약에"라는 가정에서 자유롭지 못합니다. 그래서 UUID에 다른 문자열을 추가하여 사용하기도 합니다.
[Reference]
https://ko.wikipedia.org/wiki/%EB%B2%94%EC%9A%A9_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90
https://www.rfc-editor.org/rfc/rfc4122.html#section-4.1.3
https://en.wikipedia.org/wiki/Universally_unique_identifier
https://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html
댓글