UUID가 RESTful을 죽였다

프로필

2025년 04월 21일

78 0

🤖 실무 감각적으로 보면... 부터 시작된 작은 의문

코딩테스트 과제를 인메모리 방식으로 구현하고 있었다. 일단은 요구사항에 맞춰서 구현을 해보고, "실제로 내가 이걸 구현한다면 어떻게 접근할까?"가 주제였다. FastAPI도, SQLAlchemy도, DB도 없는 상태. 그냥 순수 Python으로 로직만 짜는 상황이었고,  난 자연스럽게 PK를 customer_id_seq += 1 같은 방식으로 Auto-Increment를 흉내내고 있었다.

그때 GPT가 이런 말을 던졌다.

🤖 실무 감각적으로 보면  
  • 실제 서비스에서는 UUID를 사용하거나  
  • ULID, Snowflake ID처럼 시간 정렬 가능한 고유 ID를 쓰는 경우도 있지만  
  • 지금처럼 단순히 수치 증가하는 int형 ID를 흉내 내는 건 인메모리 시뮬레이션에서 가장 흔한 방식입니다.

여기서 난 “흉내 낸다”는 말에 의문을 품은 게 아니다.  그건 맞는 말이다.  
이걸 실제 서비스로 만든다면 난 MySQL을 쓸 테고, 그럼 당연히 PK에 AUTO_INCREMENT를 썼을 것이다. 그러니까 엄밀히 말하면 이건 흉내가 맞다.

내가 걸린 건 그 다음 문장이었다.

“실제 서비스에서는 UUID를 사용하거나…”

…진짜 실무에서 그런가? 왜? 그게 정말 보안 때문일까? 아니면 구조적 이유가 있어서? 그리고... UUID를 URI에 그대로 박는 게 정말 아름다운 설계일까?

그 의문이 시작이었다. 그 순간부터, 난 UUID라는 녀석과 정면으로 마주보기 시작했다.


UUID는 보안인가?

이 질문부터 시작해보자. 많은 사람들이 UUID를 쓰는 이유 중 하나로 "보안"을 얘기한다. 예측 가능한 ID(/users/42)보다는, /users/8c12e401-ef14.../profile처럼 경로 자체를 숨기는 게 안전하다는 논리. 하지만 URI에 대한 보안은 난독화가 아니라 권한 검증에서 출발해야 한다.

만약 누군가 브루트포스로 실존하는 UUID를 맞췄다고 해보자. 그리고 그 UUID에 인증 없이 접근이 가능했다면?

그건 UUID가 문제가 아니라,  
보안 설계를 망친 거다.

UUID는 절대 보안이 아니다. 그저 “맞추기 어려울 뿐인 이름표”일 뿐이다.


UUID는 URI에 들어가기엔 아름답지 않다

UUID를 URI에 넣었을 때, 나는 이런 생각이 든다:

“아... 시발... 이건 뭐지...”

RESTful URI는 인간이 읽을 수 있는 언어여야 한다. /users/42/profile은 질서 있고 명시적이다.  
(물론 내 블로그는 아직 RESTful도 아니고, 실제로는 https://cliche.life/profile/cliche 이런 상태지만, 의미상 같은 구조인 건 맞다.)

그에 반해 /users/8c12e401-ef14.../profile기계가 만든 쓰레기 문자열처럼 보인다.
그건 가독성도 없고, 정렬도 안 되고, 추론도 불가능하다. 가끔가다 그런 경험이 있지 않은가? 친구가 메신저로 링크를 보내왔는데 모두 보기를 눌러야만 겨우 펼쳐지는 쓰잘데기 없이 긴 URI를 본 적.

엄밀히 말하면 이건 UUID는 아니다. UTM 파라미터와 트래킹 태그, 상품명까지 다 끼얹은 마케팅 URL이다. 하지만 “인간이 읽을 수 없는 설계”라는 관점에서 보면 똑같다.
다시 한 번, 요도바시에게는 심심한 사과를 드린다.

RESTful의 철학은 URI를 통해 자원의 구조를 드러내는 것인데, UUID는 그 질서를 단칼에 끊어버린다.

REST는 끝났고,  
남은 건 그냥 랜덤 토큰으로 주소 붙인 RPC일 뿐이다.


그럼 UUID는 쓰레기인가?

아니, 절대 아니다. UUID는 필요하다. 특히 분산 시스템, 오프라인 생성, 클라이언트측 ID 등에선 최적이다. 그건 인정한다. 하지만 내가 말하고 싶은건?

UUID를 보안으로 쓰지 말자.  
UUID를 설계의 전면에 내세우지 말자.  
그리고 무엇보다,  
UUID는 RESTful하지 않다.

URI는 인간이 읽어야 한다. 그게 REST의 출발점이었고, 내가 이 일을 시작했던 이유이기도 하다.


내가 이해할 수 없다면,

그건 내게 아무런 가치가 없는 게 아닐까? 이건 단순히 UUID에 대한 비판이 아니다. 이건 내가 기술을 대할 때의 태도에 대한 이야기다. 나는 복잡한 걸 싫어한다. 내가 만든 구조는 내가 이해할 수 있어야 한다. 그게 설계의 기본이고, 책임의 출발점이다.

요즘엔 노코드로 웹앱을 만들고, 버튼 하나로 배포하고, 코딩을 전혀 몰라도 수익화를 할 수 있다는둥의 글이 많다.
하지만 나는 항상 이렇게 느낀다

“내가 이해하지 못하는 시스템은, 내 것이 아니다.”

그건 그냥 빌려쓴 구조물이고,  
그 안에서 나는 단 한 줄도 고칠 수 없는 유저일 뿐이다.


결론

UUID는 보안이 아니다. 그리고 URI는 인간이 읽을 수 있어야 한다. 나는 지금도 profile/{username}를 쓴다.

그게 인간이 이해할 수 있는 구조고, 내 손으로 만든 질서니까.
RESTful? 좋지. 하지만 그것도 결국 수단일 뿐, 절대 진리는 아니다.

결국 설계는 돌아가는 구조 위에서만 아름다울 수 있다.


그렇게 RESTful한 URI와 메서드를 정리해두고, HTML에는 DELETE, PATCH도 못 쓰는 거지같은 구조라는 걸 깨달았다.

RESTful이 이상이라면, 지금 내 현실은 Swagger로 한 땀 한 땀 테스트하는 세계다.

URI가 아름다울 수 있다면 좋겠다. 하지만 가장 중요한 건, 내가 그 URI를 이해할 수 있어야 한다는 것.
그게 내 철학이고, 그 철학은 오늘도 profile/{username}에서 숨 쉬고 있다.

#UUID #RESTful #개발 철학

댓글 개

댓글을 작성하려면 로그인이 필요합니다