📫

ID生成場所についての検討

2022/04/03に公開

IDの生成箇所による効果について考えたことのメモ

クライアントサイド生成

  • POSTリクエストを投げる前にIDを生成する
  • オートインクリメントは不可能
    • uuidのようなランダムなIDを生成する必要があり
    • もしくはユーザーに指定してもらう(Emailアドレスなど)

メリット

  • POST時の冪等性の担保が簡単
    • 必ず同じIDになるため

デメリット

  • IDの生成知識がクライアントサイドに

サーバーサイド生成

  • POSTリクエストを受け取ったあとで、DBに生成する前に生成する
  • オートインクリメントは不可能

メリット

  • IDの生成に関しての知識は不要
    • IDの型は知識としては必要になる

デメリット

  • ダブルコミット対策は別途必要

データベース生成

  • 一般的にデータベースのAutoIncrementによりIDを生成する
    • mongodbの場合はObjectID
  • データベースによっては機能が実装されていないケースもある

メリット

  • 生成について深く考える必要が無い
  • 一意性の担保の仕組みを構築しなくて良い
    • DB側で一意性を担保してくれる

デメリット

  • オートインクリメントの場合はユーザーにIDを推定されやすいため、攻撃の足がかりにされうる

まとめ

クライアントサイド サーバーサイド データベース
一意性の担保 必要 必要 不要
ダブルコミット対策 不要 必要 必要
ID生成の知識 クライアントに漏洩 サーバーに閉じる サーバーに閉じる

Discussion