- Cognito
- REST
- javaIteration
- javamap반복
- 인스턴스
- 어노테이션
- AWS CloudFormation
- 차이점
- S3
- 자료구조
- db
- ELB
- Amazon
- instance
- Heap
- Iteration반복문
- 리눅스rabbitmq설치
- rabbitmq설치명령어
- redis
- cloudfront
- dynamodb
- spring
- jpa
- yumpackage
- CloudFormation
- AWS
- map
- list
- rabbitmq설치방법
- java
- Today
- Total
You are a developer, not a coder.
UUID (Universally Unique IDentifier)란? 본문
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
2. UUID의 하이픈을 제거하는것이 올바른 선택인 걸까
'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 |