UUIDはRESTを殺した
2025年04月21日
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} に息づいている。
カカオ
グーグル
ネイバー