ADR-007: UUID Reference IDs Over Auto-Increment Primary Keys in APIs¶
- Date: 2026-08-05
- Status: Accepted
- Phase: Phase 2E
Context & Problem Statement¶
Exposing auto-increment database primary keys (Long userId) in external REST URLs (e.g. /api/v1/users/1) introduces significant security vulnerabilities:
- Resource Enumeration Attacks: Attackers can sequentially query
/users/1,/users/2,/users/3to scrape all system user profiles. - Business Metric Leakage: Competitors can determine total registered user growth rates by observing sequential ID progression over time.
- Internal Key Coupling: Exposing internal database sequence keys couples external client contracts directly to database storage strategies.
Considered Options¶
- Expose Auto-Increment Long Primary Keys (
userId): Simple, but vulnerable to enumeration attacks and leaks business growth metrics. - Expose Friendly Handles Only (
upiId): Human-readable (shashank@kotak), but handles can change over time as users re-link bank accounts. - Dual Identification Strategy (Internal
userId, ExternalreferenceIdUUID): RetainLong userIdinternally for fast database foreign key joins and indexing, but assign a non-enumerableUUID referenceIdfor all API responses and URL routing.
Decision Outcome¶
Chosen Option: Dual Identification Strategy (Internal userId, External referenceId UUID)
Rationale¶
- Security & Privacy: Cryptographically pseudo-random UUID v4 strings prevent resource enumeration attacks and hide user creation counts.
- Domain Flexibility:
upiIdremains the friendly human-readable handle (shashank@kotak), whilereferenceIdserves as the immutable internal system reference. - Performance: High-performance SQL joins continue to utilize numeric
BIGINTprimary/foreign keys (user_id), avoiding string join performance overhead in PostgreSQL.
Consequences¶
- Positive: Complete insulation against resource enumeration attacks, non-leaky API contracts, optimized database joins.
- Negative / Trade-offs: Entities require a
@PrePersisthook or column default to generate UUIDs upon creation. - Risks & Mitigations: Ensure secondary unique index (
idx_users_reference_id) is maintained onreferenceId.