본문 바로가기

UUID vs 자동증가 ID 비교 - 성능, 보안, 확장성으로 본 기본키 선택 가이드

데이터베이스를 설계할 때 기본키로 자동증가 정수를 쓸지 UUID를 쓸지 고민되시나요. 성능과 저장 공간, 보안, 분산 환경까지 실제 차이를 비교해 상황별 최적의 선택을 정리했습니다.


UUID vs 자동증가 ID 비교 - 성능, 보안, 확장성으로 본 기본키 선택 가이드

데이터베이스 테이블을 처음 설계할 때 누구나 한 번은 멈칫합니다. 기본키를 그냥 자동증가 정수로 둘지, 아니면 UUID를 쓸지 결정해야 하기 때문입니다. 작은 프로젝트라면 별 차이가 없어 보이지만, 데이터가 수백만 건으로 늘어나거나 서버를 여러 대로 나누는 순간 이 선택의 무게가 확 달라집니다.

둘 다 행을 고유하게 식별한다는 목적은 같습니다. 하지만 저장 방식, 성능, 보안, 확장성에서 분명한 차이가 있습니다. 하나씩 짚어보겠습니다.

자동증가 ID와 UUID, 무엇이 다른가

자동증가 ID는 1, 2, 3처럼 순차적으로 증가하는 정수입니다. MySQL의 AUTO_INCREMENT, PostgreSQL의 SERIAL이 대표적입니다. 데이터베이스가 새 행을 넣을 때마다 직전 값에 1을 더해 자동으로 채워줍니다.

UUID(Universally Unique Identifier)는 128비트 크기의 식별자입니다. 550e8400-e29b-41d4-a716-446655440000처럼 하이픈으로 구분된 36자 문자열로 표현됩니다. 사실상 중복될 확률이 0에 가까워 어디서 생성하든 겹치지 않습니다.

UUID에도 버전이 있다

  • v1: 타임스탬프와 네트워크 노드 정보(MAC 주소)를 조합. 생성 시각 추적이 가능
  • v4: 122비트가 완전 무작위. 가장 널리 쓰이지만 정렬이 안 됨
  • v7: 앞부분에 타임스탬프를 넣어 시간순 정렬이 가능. 인덱스 친화적이라 최근 주목받는 버전

성능과 저장 공간 비교

가장 큰 실질적 차이는 인덱스 성능입니다. 자동증가 ID는 항상 마지막에 값이 추가되므로 B-Tree 인덱스의 끝부분에만 데이터가 쌓입니다. 페이지 분할이 거의 없어 삽입이 빠릅니다.

반면 UUID v4는 값이 무작위라 인덱스 곳곳에 흩어져 삽입됩니다. 이 과정에서 페이지 분할과 단편화가 발생해 쓰기 성능이 떨어지고 인덱스 크기도 커집니다. v7이 등장한 이유가 바로 이 문제를 풀기 위해서입니다.

비교 항목자동증가 IDUUID (v4)
저장 크기4~8바이트 (INT/BIGINT)16바이트(BINARY) / 36바이트(문자열)
생성 위치DB 서버애플리케이션 등 어디서나
인덱스 정렬순차적, 효율적무작위, 단편화 발생
추측 가능성높음 (다음 값 예측 가능)거의 불가능
가독성좋음나쁨
참고: UUID를 VARCHAR(36) 문자열로 저장하면 16바이트 정수의 두 배가 넘는 공간을 차지합니다. MySQL에서는 BINARY(16)으로 저장하면 공간을 절반 이하로 줄일 수 있습니다.

보안과 정보 노출 측면

자동증가 ID의 가장 큰 약점은 예측 가능성입니다. URL이 /users/1024라면 누구나 /users/1025를 시도해볼 수 있습니다. 권한 검증이 허술하면 다른 사용자의 데이터에 접근하는 IDOR 취약점으로 이어집니다.

또한 순차 ID는 사업 규모를 그대로 노출합니다. 주문 번호가 order/3201이면 경쟁사가 대략적인 누적 주문량을 짐작할 수 있습니다. UUID는 무작위라 이런 추론이 불가능합니다.

식별자를 외부에 그대로 드러내는 순간, 그 식별자는 단순한 번호가 아니라 정보가 됩니다.

이 때문에 외부에 노출되는 링크는 식별자를 가리는 경우가 많습니다. 미투 단축URL 같은 단축 서비스가 긴 주소를 짧은 무작위 키로 바꿔주는 것도 같은 맥락입니다. 원본 자원의 구조를 숨기면서 공유는 간편해집니다.

분산 시스템에서의 차이

서버가 한 대일 때는 자동증가가 편합니다. 하지만 데이터베이스를 여러 대로 샤딩하거나, 여러 서비스가 동시에 데이터를 만들면 문제가 생깁니다. 각 DB가 1번부터 번호를 매기면 ID가 충돌하기 때문입니다.

UUID는 중앙 조율 없이 어디서든 고유한 값을 만들 수 있습니다. 애플리케이션 코드, 모바일 기기, 다른 마이크로서비스 어디서 생성해도 겹치지 않습니다. DB에 저장하기 전에 ID를 미리 알 수 있다는 점도 큰 장점입니다.

팁: 분산 환경에서 특정 데이터를 어느 노드가 만들었는지 추적할 때는 생성 로그를 함께 남기세요. 접속 출처를 확인해야 한다면 IP 주소 조회 같은 도구로 로그에 남은 IP를 빠르게 확인할 수 있습니다.

어떤 상황에 무엇을 선택할까

  • 자동증가 ID 추천: 단일 DB, 내부 관리용 테이블, 최고의 쓰기 성능이 필요할 때
  • UUID 추천: 분산/샤딩 환경, 외부에 노출하는 식별자, 클라이언트에서 ID를 먼저 만들어야 할 때, 데이터 병합이 잦을 때

실무에서는 둘을 섞기도 합니다. 내부 기본키는 BIGINT 자동증가로 두어 성능을 챙기고, 외부에 노출하는 식별자만 UUID로 따로 두는 방식입니다. 정렬 성능이 중요하면서 UUID의 장점도 원한다면 v7을 검토할 가치가 있습니다.

핵심은 두 가지입니다. 첫째, 외부에 노출되는 식별자는 순차 정수를 피하세요. 둘째, 분산 확장 계획이 있다면 처음부터 UUID(가능하면 v7)를 고려하는 편이 나중의 마이그레이션 비용을 줄여줍니다.

3일 무료체험큰손탐지기, 지금 바로 시작하세요

설치 없이 웹에서 바로 사용 가능 · PC & 모바일 지원

무료체험 시작
카카오톡 상담