Node.js

[Node.js] UUID 생성하기

itaeiou 2021. 11. 10. 18:19
반응형

UUID 란?

UUID는 Universally Unique IDentifier의 약어로 범용 고유 식별자 라는 의미입니다.

RFC4122에 명시된 네트워크 상에서 교유성이 보장되는 id를 위한 표준 규약입니다.

 

DB를 다룰 때 PK를 주로 auto increment 값으로 사용하지만

URL이나 화면상에 노출 시키면 크롤링이나 인젝션 공격에 취약하다는 단점이 있습니다.

 

때문에 public한 화면단에서는 ramdom 한 UUID를 사용하는 것을 권장합니다.

 

UUID는 16진수 8자리-4자리-4자리-4자리-12자리 패턴으로 표현됩니다.

// UUID 패턴 예시
1604b772-adc0-4212-8a90-81186c57f598

 

UUID로 표현할 수 있는 객체의 갯수는 최대 340,282,366,920,938,463,463,374,607,431,768,211,456개 이며, 중복될 확률이 매우매우매우 낮다고 합니다.

 

종류

UUID 종류에는 크게 4가지가 있습니다.

  • v1: 타임스탬프(시간) 기준
  • v3: MD5 해시 기준
  • v4: 랜덤값 기반
  • v5: SHA-1 해시 기준

랜덤값 기반으로 생성되는 v4가 가장 많이 사용되고, 다음으로는 시간 기준인 v1이 많이 사용됩니다.

 

사용법

설치

# npm
npm install uuid

# yarn
yarn add uuid

# v4 만 설치
npm install uuid4

ES6 이상

import { v4 } from 'uuid';

// 기본 설정으로 생성
v4();

//설정을 붙여서 생성
let options = {
    random: // 16개의 랜덤 바이트값
    rng: // random 변수를 대체할 16개의 랜덤 바이트값을 반환하는 함수
}
v4(options);

ES5 이하

const { v4 } = require('uuid');

// 기본 설정으로 생성
v4();

//설정을 붙여서 생성
let options = {
    random: // 16개의 랜덤 바이트값
    rng: // random 변수를 대체할 16개의 랜덤 바이트값을 반환하는 함수
}
v4(options);

 

Index UUID

UUID를 그대로 id로 사용한다면 한가지 문제점이 있습니다.

UUID값는 16진수의 문자열과 '-'으로 이루어져 있기 때문에, string 형태로 저장됩니다.

하지만 DB에서 string 데이터를 인덱싱하면, 인덱스도 비정상적으로 커지며 검색 성능도 많이 떨어지게 됩니다.

 

아래 링크에 UUID 값을 인덱싱 가능하고 순서를 보장받는 체계로 변경하는 방법이 자세하게 설명되어있습니다.

https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

 

Storing UUID Values in MySQL

Karthik Appigatla revisits a post Peter Zaitsev wrote on UUIDs (Universal Unique IDs), rearranging the timestamp and talks about storing UUID Values.

www.percona.com

 

요약하면 1-2-3-4-5 의 구조를 32145 로 변경하면 어느정도 보장받는 수 체계로 변환할 수 있다는 것입니다.

JS 코드로 작성하면 아래와 같이 사용할 수 있습니다.

const { v4 } = require('uuid');

const uuid = () => {
    const tokens = v4().split('-')
    return tokens[2] + tokens[1] + tokens[0] + tokens[3] + tokens[4];
}

uuid();
반응형