UUID

Pien·2023년 2월 25일
1
post-custom-banner

UUID(Universally Unique IDentifier)란 고유성이 보장되는 id를 만들기 위해 존재하는 표준 규약이며 우리말로 범용 고유 식별자 라고 부른다.

데이터베이스에서 데이터를 식별하기 위해선 Primary Key를 통해 데이터를 식별 하게 된다.
Primary Key를 숫자로 지정해 둔 경우, 각 테이블 마다 중복되는 Primary Key가 생기며, 데이터베이스에 대한 공격에도 취약하다.

UUID는 32개의 문자와 4개의 하이픈으로 구성된 문자열이며 8-4-4-4-12 개의 문자열로 이뤄져 있으며, 5가지 버전을 가지고 있다.

버전

  • 버전 1 (MAC 주소)
  • 버전2 (DCE 보안)
  • 버전3 (MD5 해시)
  • 버전4 (랜덤)
  • 버전5 (SHA-1 해시)

이 중 현재 1버전과 4버전을 보편적으로 사용 되고 있으며 두가지 버전에 대해 알아보자

UUID version 1

버전1의 경우 MAC주소와 타임스탬프를 기반으로 UUID를 생성해 준다. 동시간대에 생성했을때 앞의 8자리의 문자열만 바뀌는 것을 볼 수 있다. 각자 다른 컴퓨터가 같은 시간대에 UUID를 생성할 경우 MAC주소가 다르기 때문에 앞의 8자리 문자외에 다른 문자 또한 다른 UUID가 생성될 것이다.

UUID version 4

버전4의 경우 같은 시간대에 생성을 한 경우라도 모두 제각각 다른것을 볼 수 있다. 이는 보안 난수 생성기를 이용해 생성되었기 때문에 모두 다른 ID를 생성된다. 중간에 4 숫자가 고정적으로 박혀있는 자리가 보이는데 이는 버전을 나타내기 위한 표시다.
애플 또한 UUID 4버전을 통해 ID를 생성한다.

중복된 UUID가 생길 가능성?

랜덤된 값을 생성한다는 UUID는 이론상 중복값이 생성될 가능성이 존재 한다. 하지만 UUID의 총 생성 가능 갯수는 340,282,366,920,938,463,463,374,607,431,768,211,456개로 세는것 조차 벅차보인다.
중복된 값이 생길 확률을 계산해 보면 초당 10억개의 UUID를 100년 동안 생성했을 때 중복된 값이 생길 확률이 50%라고 한다 이처럼 UUID의 중복값을 걱정할 필요는 없다.

데이터베이스

UUID를 생성해서 사용한다는 건 결국 데이터베이스와 관련된 작업에 사용한다는 것이다. 데이터베이스에 UUID를 도입했을때 장점과 단점을 알아보자

장점

1. 보안이 안전

유저 삭제, 게시글 삭제 등의 API를 호출할 때 데이터베이스에 존재하는 PK값을 가지고 클라이언트가 API서버로 호출을 하게 된다. 이때 PK가 숫자로 되어 있을 경우 다른 유저나 게시글의 PK를 유추해 접근을 시도 할 수 있다.
하지만 UUID를 사용했을 경우 모든 PK는 유추가 불가능 하기 때문에 보안상에서 안전하다.

2. 연관관계의 데이터를 입력할 때

연관관계의 데이터를 같이 입력하게 된다면, 데이터 베이스에 저장된 PK의 값을 가지고 FK를 지정해서 입력해 줘야한다. ORM을 쓸경우 ORM이 알아서 맵핑해 주지만, ORM을 쓰지 못할 경우엔 입력된 데이터를 가지고 FK를 지정 해 줘야하는데, UUID를 사용할 경우, 서버에서 UUID를 생성 후 PK와 FK를 같이 지정해 입력 할 수 있다.

3. 데이터베이스의 데이터를 합칠 때

UUID를 사용한다는 것은 PK는 모두 고유한 값이라는 것이다. 이는 흩어져있는 데이터를 합칠때 데이터의 중복이나 충돌 없이 안전하게 데이터를 병합할수 있다.

단점

1. 운영 비용의 증가

UUID는 32자리 문자로 이루어져 있으며 몇번을 생성하는 똑같다. BIGINT PK와 비교해보면 더 많은 디스크를 차지하게 되고 인덱스의 크기가 커져 메모리 또한 많이 차지하게 된다.

2. 정렬이 힘들다.

UUID는 랜덤한 값이다 이를 정렬한다는것은 매우 어려워 별도의 인덱스나 생성시간에 따른 정렬을 따로 구현해야 한다.

3. 몇몇 데이터베이스는 기본기능으로 제공하지 않는다.

현재 가장 많이 사용하고 있는 데이터베이스인 MySQL의 경우, UUID의 자동생성을 기본적으로 제공하지 않는다. MySQL에서 사용할 경우, 함수를 직접 설정해서 UUID를 생성해야 한다.
PostgreSQL은 UUID의 자동생성을 지원하며, UUID를 사용할 경우 PostgreSQL을 사용해 보자

post-custom-banner

0개의 댓글