관리 메뉴

공부 기록장 💻

[Java] UUID를 이용한 짧은 8자리 회원 고유 ID 생성하기 (추천인 코드) 본문

# Develop/Project

[Java] UUID를 이용한 짧은 8자리 회원 고유 ID 생성하기 (추천인 코드)

dream_for 2023. 4. 17. 01:36

 

유저 서비스 개발을 시작하기에 앞서 고민 시작.. 회원별 고유 ID를 어떤 방식으로 만들까?

 
최근 졸업 프로젝트로 작은 유저 모바일 앱 서비스를 개발하기 시작했다.
회원이 최초 가입 시 각 회원에게 부여할 고유 ID 값을 생성해야 하는데, 이 고유 ID 값을 어떻게 생성하느냐에 대한 고민을 하기 시작했다.
 
우선 생성하려고 하는 회원별 고유 ID 값의 역할부터 정의를 내려보자면, 많이들 서비스에서 사용해봤을 만한 "추천인 코드" 의 역할과 비슷하다.
추천인 코드처럼 각 유저를 식별하는 이 고유 ID값을 이용해 타 회원을 검색하고 친구를 맺게 하는데 사용할 문자열이다. 
모바일 기반 플랫폼이기 때문에 회원이 주로 email 인증을 통한 회원 가입과 password를 통한 최초 로그인을 주로 하게 되기 때문에, 회원을 각자 식별할 수 있는 ID 값이 필요했다.
 
현재 여러 플랫폼에서 사용되고 있는 "추천인 코드"의 역할이라 할 수 있다.

커플 문답 "썸원"에서 사용되고 있는 커플 코드 (각 유저 식별)

 
 

UUID 활용하기

무작위 랜덤 문자열 값을 만드는 것보다 보다 더 나은 방법이 없을까? 고민을 하게 되었다.
찾아보니 UUID (Universally Unique Identifier) 라는 것이 존재했다.
주로 범용 고유 식별자를 의미하며, 중복이 되지 않는 유일한 값을 구성하고자 할 때 주로 사용되며
세션의 식별자, 쿠키 값, 무작위 DB 키로 사용된다고 한다.
본래 UUID는 16바이트(총 128비트) 형태의 구조를 가지며, 총 길이는 36자리이다. 
4개의 하이픈을 포함해 총 32개의 16진수 문자열로 구성되어 있으며 다음과 같은 형태를 띈다.
 

 
해당 UUID를 발급하는 시간을 비트단위로, 그리고 MAC Address 노드 까지 포함하여 
고유 ID를 발급하기 때문에 정말 방대한 양의 데이터들까지 식별이 가능하다. 
즉... UUID 값은 중복되거나 충돌될 확률이 매우 낮다.
 
그러나 위의 36자리를 작은 토이프로젝트로 사용하기에는 너무 길다. 메모리 낭비라는 생각이 들었다.
그래서 위와 같은 방식으로 발급한 UUID를 줄이는 방법으로 회원의 고유 ID값을 만들어보고자 했다.
 

 

 

UUID를 8자리로 줄여보자!

그래서 이 긴 UUID를 짧게 줄이면서도 고유 값을 유지하기 위한 방법으로 다음의 방식을 사용했다.
 

1. 문자열로 변환한 UUID를 UTF-8 기반으로 인코딩된 바이트 배열로 변환
2. 해시 함수(SHA-256)를 이용하여 바이트로 변환
3. 변환한 바이트에 대해 앞 4글자의 각 바이트를 2자리의 16진수 문자열로  저장
4. 총 8자리의 고유 값 생성 

 
여기서 사용한 해시 함수 SHA-256는 발급된 고유한 UUID를 256비트, 32개의 16진수의 해시 값으로 변환하는 역할을 한다. 보안성이 우수한 편이고, 그리 길지 않은 비트로 변환하기 때문에 해당 해시 함수를 선정하게 되었다.
 
SHA-256를 사용하기 위해서는, Java에서 제공하는 MessageDigest 클래스의 생성자에 "SHA-256"를 적용하여 인스턴스를 생성하여 활용하였다.
 

package com.cos.security1.UserRepositoryTest.UUID;

import org.junit.jupiter.api.Test;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

public class CreateUuid {

    @Test
    void createShortUuid(){
        for (int i=0;i<10;i++) {
            String uuidString = UUID.randomUUID().toString();
            System.out.print(uuidString + " -> ");
            byte[] uuidStringBytes = uuidString.getBytes(StandardCharsets.UTF_8);
            byte[] hashBytes;

            try{
                MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
                hashBytes = messageDigest.digest(uuidStringBytes);
            }catch (NoSuchAlgorithmException e){
                throw new RuntimeException(e);
            }

            StringBuilder sb = new StringBuilder();
            for (int j=0;j<4;j++){
                sb.append(String.format("%02x", hashBytes[j]));
            }
            System.out.println(sb.toString());
        }
    }
}

 
그래서 결과로 도출해낸 8자리의 회원 고유 ID 값은 다음과 같다!
유저 생성 시 위의 방식으로 회원 고유 값을 부여하여 친구 맺기 기능의 고유 코드로 적용할 예정이다:)
 

728x90
반응형
Comments