You are a developer, not a coder.

UUID (Universally Unique IDentifier)란? 본문

Backend-Languages/Java

UUID (Universally Unique IDentifier)란?

Mattmk 2020. 4. 29. 10:19
SMALL

1. UUID란

네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이다.

UUID는 Universally Unique IDentifier의 약어이고 범용 고유 식별자라고 한다.

주로 분산 컴퓨팅 환경에서 사용되는 식별자이다. 중앙관리시스템이 있는 환경이라면 각 세션에 일련번호를 부여해줌으로써 유일성을 보장할 수 있겠지만 중앙에서 관리되지 않는 분산 환경이라면 개별 시스템이 id를 발급하더라도 유일성이 보장되어야만 할 것이다. 이를 위해 탄생한 것이 범용고유식별자 UUID이다.

RFC 4122에 명시되어 있다.

 

UUID는 128비트의 숫자이며, 32자리의 16진수로 표현된다.

8자리-4자리-4자리-4자리-12자리 패턴으로 하이픈을 집어 넣어 5개의 그룹으로 구분한다.

 

이름 길이 (바이트) 길이 (16진수 숫자) 내용
time_low 4 8 시간의 low 32비트를 부여하는 정수
time_mid 2 4 시간의 middle 16비트를 부여하는 정수
time_hi_and_version 2 4 최상위 비트에서 4비트 "version", 그리고 시간의 high 12비트
clock_seq_hi_and_res clock_seq_low 2 4 최상위 비트에서 1-3비트, 그리고 13-15비트 클럭 시퀀스
node 6 12

48비트 노드 id

UUID 레코드 레이아웃

 

 

UUID패턴의 예시

550e8400-e29b-41d4-a716-446655440000

 

2. 종류

UUID버전은 1,3,4,5가 있다. 이중 가장 많이 쓰이는 버전은 1버전과 4버전이다.

1버전같은 경우, 타임스탬프를 기준으로 생성된다. (호스트 ID, 시퀀스 번호 및 현재 시각으로 UUID 발급)

4버전는 랜덤 생성 (무작위 UUID 생성) 이라고 생각하면 된다.

또한 3버전 MD5 (이름공간 식별자 [UUID] 및 이름 [문자열]의 해시기반), 5버전 SHA-1 (이름공간 식별자 [UUID] 및 이름 [문자열]의 해시기반)해쉬를 이용해 생성하는 방식이 있다.

 

※주로 1버전 보다는 4버전을 많이 사용한다.

애플에서도 UUID를 생성할때 4버전을 사용한다고 한다.

이는 1버전 같은 경우엔 호스트ID를 가지고 발급이 이루어 지기 때문에 어떻게 해서든 유출 가능성이 있어 랜덤생성으로 UUID를 발급받아 보안성을 높은것으로 추측이 된다.

 

3. JAVA에서의 UUID 사용

나는 JAVA개발자 이기 때문에 JAVA에서의 UUID 4버전을 이용하여 생성해 볼 것 이다.

 

UUID 4버전을 사용하기 위해 java.util.UUID (UUID 3버전, 4버전 지원) API를 사용할 것이다.

3버전을 사용하기 위해서는 nameUUIDFromBytes 사용

4버전을 사용하기 위해서는 randomUUID 사용

 

UUID값의 대시(-)을 제거해서 사용할 것이다.
이러한 이유는 대시가 값의 일부가 아니기 때문에 100% 안전하다는 보장과 대시를 넣을 경우 문자열의 값이
불필요하게 늘어나는 이유로 제거를 할 것이다.
물론, UUID에서 Return Value Check를 하는 Logic이 들어갈 경우에는 하지 말아야 되지만
UUID Check Logic을 사용할 것 같지 않아 선택한 것이다.

아래는 실제 Java에서 UUID를 생성할때의 Logic 이다.

UUID                   = <time_low> "-" <time_mid> "-"
                      <time_high_and_version> "-"
                      <variant_and_sequence> "-"
                      <node>
time_low               = 4*<hexOctet>
time_mid               = 2*<hexOctet>
time_high_and_version  = 2*<hexOctet>
variant_and_sequence   = 2*<hexOctet>
node                   = 6*<hexOctet>

 

/*
* Developer : Min-Kyu Matthew
* Context : UUID.v4 생성 및 대시제거 후 Return.
*/

public String uuidRandomCreate() {

	String resultUuid = "";

	try {
		UUID uuidTemp = UUID.randomUUID();
		resultUuid = uuidTemp.toString().replaceAll("-", "");
	}catch (Exception e) {
		// TODO: handle exception
		logger.error("uuidRandomCreate [error][e] ---> " + e);
		logger.error("uuidRandomCreate [error][e.getMessage()] ---> " + e.getMessage());
	}

	return resultUuid;
}

 

4. 참고

1. java.util.UUID API 사이트

https://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html

 

UUID (Java 2 Platform SE 5.0)

The timestamp value associated with this UUID. The 60 bit timestamp value is constructed from the time_low, time_mid, and time_hi fields of this UUID. The resulting timestamp is measured in 100-nanosecond units since midnight, October 15, 1582 UTC. The tim

docs.oracle.com

2. UUID의 하이픈을 제거하는것이 올바른 선택인 걸까

https://www.it-swarm.dev/ko/java/%EB%AC%B4%EC%9E%91%EC%9C%84%EB%A1%9C-%EC%83%9D%EC%84%B1-%EB%90%9C-uuid%EC%97%90%EC%84%9C-%EB%A5%BC-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B4-%EC%96%BC%EB%A7%88%EB%82%98-%EC%95%88%EC%A0%84%ED%95%A9%EB%8B%88%EA%B9%8C/805478961/

 

java — 무작위로 생성 된 UUID에서 "-"를 제거하는 것이 얼마나 안전합니까?

백악관에 전화하고 싶다고합시다. 전화 번호는 (202) 456-1111입니다. 전화 번호에서 대시와 괄호를 모두 삭제하면 2024561111이 남습니다.이 과정에서 아무런 정보도 잃지 않았습니다. 형식을 읽기 어려운 방식으로 변경했습니다. 전화에이 번호를 입력해도 전화 시스템은 여전히 ​​처음 3 자리가 지역 번호이고 다음 7 자리가 기본 번호임을 알고 있기 때문에 계속 전화를 겁니다. 같은 방식으로 UUID의 대시는 전화 번호의 추가 구두점과 같습니다.

www.it-swarm.dev

 

LIST

'Backend-Languages > Java' 카테고리의 다른 글

String, StringBuffer, StringBuilder에 대해서  (0) 2023.05.18
Java Map 반복(Iteration)시키는 3가지 방법  (0) 2023.05.18
subList 알맞게 사용하는 방법  (0) 2021.02.24
COLLECTIONS.EMPTY_LIST  (0) 2020.12.15
JSON Pasing Tip  (0) 2020.12.01
Comments