Splync는 민감한 ID에 두 개의 식별자를 사용합니다
Splync의 데이터베이스에서는 모든 사용자와 모든 프로젝트가 UUID와 자동 증가 정수라는 두 개의 다른 ID로 식별됩니다.
자동 증가 정수는 대부분의 사람들이 익숙한 것으로, 1, 2, 3 등 순차적인 카운터입니다. Splync는 이러한 정수를 서버 데이터베이스 내부에서 대부분의 테이블을 조직하는 데 사용합니다. 이들은 간단하고, 빠르며, 조인에 효과적이기 때문입니다. 하지만 이 내부 번호를 앱에 노출하지는 않습니다. 예를 들어, 당신이 가입한 42번째 사용자라면, 데이터베이스 내부의 ID는 42일 것입니다. 그러나 당신의 iOS 앱은 "42"를 보지 못합니다. 대신, 앱은 당신을 나타내기 위해 UUID를 사용합니다. 프로젝트에도 동일한 접근을 적용합니다. 데이터베이스 내의 프로젝트 ID가 "7"일 수 있지만, 앱은 항상 긴 UUID로 이를 참조합니다.
UUID란 무엇인가요
UUID는 범용 고유 식별자(Universally Unique Identifier)의 약자입니다. Splync는 RFC 4122를 준수하는 버전 4, 변형 1 UUID를 사용합니다. 이는 무작위로 생성된 문자열로, 949ca11c-a6ed-48a3-b40a-fa9727494917과 같은 형태로 보입니다. UUID는 일반적으로 32개의 16진수 문자로 작성되며, 하이픈으로 구분된 5개의 섹션으로 나눠집니다. 이는 전 세계적으로 고유하게 설계되어, 서로 다른 서버나 데이터베이스 간 충돌이 발생하지 않도록 합니다. 수학적으로 가능한 조합은 약 16^32 = 2^128개입니다. 하지만 변형과 버전을 나타내는 6비트가 예약되어, 고유한 버전-4, 변형-1 UUID의 총 수는 약 2^122, 즉 약 5.3 x 10^36개로, 실질적으로 고유성을 보장하는 매우 큰 수치입니다.
1 / 5,300,000,000,000,000,000,000,000,000,000,000,000은 얼마나 작은가요
각 UUIDv4 쌍이 일치할 확률은 약 5.3 × 10^36분의 1입니다. 이 숫자는 너무 작아서 인간의 상상 속에서는 거의 존재하지 않는 것처럼 보입니다. 이를 상상해본다면, 47개의 주사위를 한 번에 굴리는 것을 생각해 보세요. 모든 주사위가 "1"을 보여주는 확률은 약 6^47분의 1, 즉 대략 3.7 × 10^36분의 1입니다. 이는 UUID 충돌과 동일한 수준입니다. 이제 지구상의 모든 사람, 약 80억 명이 매 밀리초마다 그 47개의 주사위를 굴린다고 상상해 보세요. 이는 약 2.5 × 10^32의 총 시도입니다. 이 모든 후에도, 누군가가 한 번에 47개의 주사위가 모두 1이 되는 확률은 여전히 만분의 1입니다. 두 개의 UUIDv4가 충돌하는 가능성은 이 정도로 희박합니다. 이는 단순히 "드문" 것이 아닙니다. 이는 우주적으로 터무니없는 일이므로, 수학자들이 커피를 쏟고 우주에 버그가 있는지 확인하게 될 정도의 우연입니다.
UUID 생성이 쉬운가요
처음에는 UUID 생성이 간단해 보일 수 있습니다. 결국 이는 무작위로 보이는 영숫자 문자열이기 때문입니다. 하지만 펜과 종이를 사용해 직접 작성해 보세요. 36개의 문자를 적을 수는 있겠지만, 이 작업을 수천 번 반복하면 명확한 패턴이 나타날 것입니다. 아마도 3이나 8 같은 특정 숫자를 선호하고 x 같은 글자는 거의 사용하지 않을 것입니다. 컴퓨터는 이러한 편향을 즉시 감지할 수 있습니다. 악의적인 해커는 당신의 습관을 분석하여 하루 만에 "무작위" 비밀 문자열을 좁힐 수 있습니다. 그런 다음, 컴퓨터를 사용하여 각 숫자를 생성하기 위해 rand()와 같은 클래식한 랜덤 함수를 호출한다고 해봅시다. 이는 더 나은 방법이지만, 충분하지 않습니다. 일반적인 프로그래밍 환경의 많은 "랜덤" 숫자 생성기는 의사 무작위로, 내부 시드에서 시작하는 예측 가능한 수학적 순서를 따릅니다. 누군가가 그 시드를 발견하거나 추측하면, 생성기가 생성한 모든 값을 재현할 수 있습니다.
UUID는 얼마나 완벽하게 무작위인가요
완벽한 무작위성은 실제로 존재하지 않습니다. 마치 완벽한 주사위가 없듯이, 완벽하게 무작위로 주사위를 던지는 것도 없습니다. 모든 물리적 또는 디지털 프로세스에는 일부 기본 규칙이 따라야 합니다. 그럼에도 불구하고 수학자와 엔지니어들은 진정한 무작위성에 최대한 가까운 알고리즘을 설계하기 위해 수십 년을 투자했습니다. Splync가 새로운 버전-4 UUID를 생성할 때, 단순히 주사위를 굴리듯 무작위로 숫자를 선택하지 않습니다. 운영 체제에 아주 작은 예측 불가능성을 요청합니다. 예를 들어, CPU가 작업을 마치는 정확한 순간, 하드웨어 내부의 미세한 전기적 잡음, 또는 메모리의 배경 시간 변동 등입니다. 이러한 엔트로피의 조각들이 모여 128비트의 데이터, 즉 길고 복잡한 0과 1의 연속체로 변환됩니다. 그 결과는 앱 사용자나 잠재적인 악의적 공격자가 추측하거나 반복하기 거의 불가능한 코드입니다.
Splync의 이중 식별자 접근법
Splync는 사용자 ID와 프로젝트 ID와 같은 민감한 식별자에 대해 UUID를 사용합니다. 이는 매우 무작위적이고 안전하기 때문입니다.
동시에, Splync는 서버 내부에서 이 UUID를 대량 데이터 셋에 대한 빠른 검색 및 분석을 위해 자동 증가 정수로 변환합니다. 이 이중 식별자 접근법은 외부의 프라이버시와 내부의 성능 간 균형을 이룹니다. Splync의 목표는 스트레스 없는, 간단하고 안전한 예산 추적 앱이 되는 것입니다. 보이는 UI 뒤에서 우리는 계속해서 아키텍처를 개선하여 매끄럽고 안전하며 조용히 똑똑하게 유지합니다.