UUIDはRESTを殺した

프로필

2025年04月21日

462 0

UUIDはRESTを殺した。

コーディングテストの課題を、インメモリ方式で実装していた。
要件に沿ってまずは実装してみて、「実際にこのサービスを作るとしたらどうするか?」を考えるのがテーマだった。

FastAPIもSQLAlchemyも使わない。データベースも無し。
ただの純粋なPythonでロジックだけを書く状況で、
僕は自然と customer_id_seq += 1 という、オートインクリメントのような仕組みを真似してIDを割り振っていた。

そのとき、GPTがこう言ってきた。

🤖 実務的な感覚で言えば
  • 実際のサービスではUUIDが使われたり、
  • ULIDやSnowflake IDのような時系列で並びやすい一意なIDを使ったりします。
  • 今のように連番のint型IDを真似るのは、インメモリシミュレーションでは一般的な手法です。

「真似る」という表現に対しては何も思わなかった。事実だから。
本番環境で作るなら、僕はMySQLを使うし、もちろんAUTO_INCREMENTでPKを管理する。
つまり、これは「真似」で間違いない。

引っかかったのはその次の一文だった。

“実際のサービスではUUIDを使うことが多い…”

えっ、本当に?なぜ?
それって本当にセキュリティのため?構造的な理由があるから?
そして何より、UUIDをそのままURIにぶち込む設計って、本当に美しいのか?

この問いからすべてが始まった。
僕はUUIDという存在に、正面から向き合うことにした。


UUIDはセキュリティなのか?

まずこの問いから始めよう。
UUIDを使う理由として「セキュリティ」を挙げる人が多い。

/users/42 よりも /users/8c12e401-ef14.../profile のように、
パス自体を予測しづらくすることで安全性が上がる、という理屈。

でも言いたいのはこれだ。
URIのセキュリティは、難読化ではなく認可によって担保されるべきだ。

仮にUUIDを総当りして、実在するIDにたどり着いたとしよう。
そのリクエストが、認証も無しに通ってしまったとしたら?

それはUUIDの問題ではなく、
セキュリティ設計の破綻だ。

UUIDは決してセキュリティではない。
ただの「当てづらい名札」にすぎない。


UUIDは、URIに載せるには美しくない

UUIDをURIに含めたとき、僕が感じるのはこうだ。

「あー……クソだなこれ。」

RESTfulなURIというのは、人間が読める言語であるべきだ。
/users/42/profile は秩序があり、明快で、意味を持っている。
(ちなみに僕のブログもまだRESTfulじゃないけど、
実際には https://cliche.life/profile/cliche というURL。意味的には同じ構造だ。

それに対して、/users/8c12e401-ef14.../profile
「機械が出力したゴミのような文字列」にしか見えない。

可読性ゼロ。
ソートもできない。
推測も不可能。
人間が扱うインターフェースとして、破綻している。


たまにあるだろう?
友達からURLが送られてきて、「すべて表示」を押さないと展開できない、
無駄に長すぎるリンクを見たこと。

例を挙げよう。

厳密にはこれはUUIDじゃない。
UTMパラメータやトラッキングタグ、商品名まで混ぜ込んだマーケティング用URLだ。
でも、「人間が読めない設計」という点ではUUIDと全く同じだ。

改めて、ヨドバシには深くお詫び申し上げたい。

RESTの哲学とは、URIを通じてリソースの構造を明示することだった。
UUIDはその秩序をバッサリと断ち切る。

RESTは死んだ。
残ったのは、ただのランダムトークン付きのRPCだ。


UUIDはゴミなのか?

いいや、絶対に違う。

UUIDは必要だ。
特に分散システムや、クライアント側でのID生成、オフライン状態での一意性担保には最適だ。
それは否定しない。

ただ、僕が言いたいのはこうだ。

UUIDをセキュリティに使うな。
UUIDを設計の「顔」にするな。
そして何より、
UUIDはRESTfulじゃない。

URIは人間が読むべきだ。
それがRESTの出発点であり、僕が設計を始めた理由でもある。


僕が理解できない構造には、価値を感じない

これはUUID批判じゃない。
僕が技術とどう向き合っているか、という姿勢の話だ。

僕は、複雑なものが嫌いだ。
自分が作った構造は、自分自身が理解できなきゃ意味がない。

それが設計の基本であり、責任の始まりだ。

最近はノーコードでアプリを作り、ボタン一つでデプロイし、
コードが書けなくても収益化できるという話が多い。

でも僕はいつもこう思う。

「自分が理解できないシステムは、自分のものじゃない。」

それはただの借り物の構造物でしかない。
その中で、僕は一行も手を加えられないユーザーに過ぎない。


結論

UUIDはセキュリティではない。
URIは人間が読めることが大事だ。
僕はいまでも profile/{username} を使う。

それが人間にとって理解しやすい構造であり、
僕自身が作った秩序だから。

RESTful?いいよね。
でもそれも手段であって、絶対的な正義ではない。

設計は、
動く構造の上にしか、美しさは成り立たない。


RESTfulなURIとHTTPメソッドを整えていくうちに、
HTMLフォームではDELETEもPATCHも使えないという現実を思い知った。

RESTfulが理想なら、
僕の現実は、Swaggerで一つ一つ動作確認している世界だ。

URIが美しくあってほしい。
でも何より大事なのは、
僕がそのURIを理解できること。

それが僕の哲学であり、
その哲学は、今日も profile/{username} に息づいている。

#UUID #RESTful #개발 철학

コメント 0件

コメントを投稿するにはログインが必要です