...
UUID 란?
UUID는 Universally Unique IDentifier의 약자로, 전세계에 하나밖에 없는 ID라는 뜻이다.
이런 ID는 고유하기 때문에 서버에서 사용자들에 UUID를 붙여서 구분하는 등 여러 방면에서 유용하게 쓰일 수 있다.
예를들어, 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개 이며,
중복될 확률이 로또에 연속으로 두번 1등으로 당첨될 확률보다 낮다고 하니 값이 겹치는 걱정은 안해도 된다.
UUID 모듈
모듈 설치
# npm
npm install uuid
# v4 만 설치
npm install uuid4
# yarn
yarn add uuid
UUID에는 생성 방법이 버젼별로 여러가지 있다.
- v1: 타임스탬프(시간) 기준으로 생성
- v3: MD5 해시 기준으로 생성
- v4: 랜덤값을 기반으로 생성
- v5: SHA-1 해시 기준으로 생성
위의 생성방법들 중 마음에 드는 것을 골라서 사용하면 된다.
보통 v4가 무난하다.
v1(타임스탬프 기반) UUID 생성
import { v1 } from 'uuid';
//기본 설정으로 생성
console.log(v1());
//설정을 붙여서 생성
let options = {
node: // 바이트값 6개
clockseq: // 클럭 시퀀스 (0 - 0x3fff 사이 값)
msecs: // 밀리초
nsecs: // 나노초
random: // 16개의 랜덤 바이트값
rng: // random 변수를 대체할 16개의 랜덤 바이트값을 반환하는 함수
}
console.log(v1(options));
v3(MD5 기반) UUID 생성
참고로 RFC 표준에 따르면 하위호환같은 사유가 아니라면 v3보다는 v5를 사용하는걸 추천한다.
import { v3 } from 'uuid';
//v5는 네임스페이스라는 값과 해싱할 값으로 UUID를 만든다.
//그래서 네임스페이스로 사용할 UUID 값이 필요하다.
console.log(v3('해싱할 값', '1a30bae5-e589-47b1-9e77-a7da2cdbc2b8'));
//해싱할 값이 URL이나 도메인인 경우 미리 만들어진 네임스페이스를 활용하면 된다.
//해싱할 값이 도메인인 경우
console.log(v3('www.google.com'), v3.DNS);
//해싱할 값이 URL인 경우
console.log(v3('https://www.google.com'), v3.URL);
v4(랜덤값 기반) UUID 생성
import { v4 } from 'uuid';
//기본 설정으로 생성
console.log(v4());
//설정을 붙여서 생성
let options = {
random: // 16개의 랜덤 바이트값
rng: // random 변수를 대체할 16개의 랜덤 바이트값을 반환하는 함수
}
console.log(v4(options));
v5(SHA-1 기반) UUID 생성
import { v5 } from 'uuid';
//v5는 네임스페이스라는 값과 해싱할 값으로 UUID를 만든다.
//그래서 네임스페이스로 사용할 UUID 값이 필요하다.
console.log(v5('해싱할 값', '1a30bae5-e589-47b1-9e77-a7da2cdbc2b8'));
//해싱할 값이 URL이나 도메인인 경우 미리 만들어진 네임스페이스를 활용하면 된다.
//해싱할 값이 도메인인 경우
console.log(v5('www.google.com'), v5.DNS);
//해싱할 값이 URL인 경우
console.log(v5('https://www.google.com'), v5.URL);
데이터베이스 Index UUID
UUID를 그대로 데이터베이스 테이블 id로 사용한다면 한가지 문제점이 있다.
UUID값는 16진수의 문자열과 '-'으로 이루어져 있기 때문에, string 형태로 저장된다.
하지만 DB에서 string 데이터를 인덱싱하면, 인덱스도 비정상적으로 커지며 검색 성능도 많이 떨어지게 된다.
따라서, UUID 값을 인덱싱 가능하고 순서를 보장받는 체계로 변경하는 방법이 있다
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();
세션 아이디 UUID
세션 ID를 발급해야 할 때, uuid를 제공해서 사용할 수 도 있다.
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: true, // 수정된 적 없는 세션이라도 한번 발급된 세션은 저장 허용. 경쟁조건을 일으킬 수 있음
rolling: true, // 새로고침이 발생할 때마다 세션 refresh
saveUninitialized: true, // 초기화되지 않은 세션, 생성되었으나 한번도 수정되지 않은 세션을 저장할 것인지
cookie: {
maxAge: 60 * 60 * 1000,
},
genid: uuidv4, // UUIDv4를 이용해 session id 생성
}),
);
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.