📫
ID生成場所についての検討
IDの生成箇所による効果について考えたことのメモ
クライアントサイド生成
- POSTリクエストを投げる前にIDを生成する
- オートインクリメントは不可能
- uuidのようなランダムなIDを生成する必要があり
- もしくはユーザーに指定してもらう(Emailアドレスなど)
メリット
- POST時の冪等性の担保が簡単
- 必ず同じIDになるため
デメリット
- IDの生成知識がクライアントサイドに
サーバーサイド生成
- POSTリクエストを受け取ったあとで、DBに生成する前に生成する
- オートインクリメントは不可能
メリット
- IDの生成に関しての知識は不要
- IDの型は知識としては必要になる
デメリット
- ダブルコミット対策は別途必要
データベース生成
- 一般的にデータベースのAutoIncrementによりIDを生成する
- mongodbの場合はObjectID
- データベースによっては機能が実装されていないケースもある
メリット
- 生成について深く考える必要が無い
- 一意性の担保の仕組みを構築しなくて良い
- DB側で一意性を担保してくれる
デメリット
- オートインクリメントの場合はユーザーにIDを推定されやすいため、攻撃の足がかりにされうる
まとめ
クライアントサイド | サーバーサイド | データベース | |
---|---|---|---|
一意性の担保 | 必要 | 必要 | 不要 |
ダブルコミット対策 | 不要 | 必要 | 必要 |
ID生成の知識 | クライアントに漏洩 | サーバーに閉じる | サーバーに閉じる |
Discussion