バックエンド エンジニアとして、私たちは多くの場合、それぞれ固有の ID を必要とする多数のリソース、ユーザー、エンティティを拡張して処理できるシステムを構築する任務を負っています。多くの場合、連続した ID (1、2、3 など) を使用するのが簡単な解決策のように思えますが、アプリケーションが成長し、分散システム間でスケールするにつれて、これはすぐに問題になる可能性があります。ここで、UUID (Universally Unique Identifiers) が登場します。
このブログ投稿では、次のことを検討します:
UUID (Universally Unique Identifier) は、コンピューター システム内の情報を一意に識別するために使用される 128 ビットの番号です。これはグローバルに一意になるように設計されており、異なるシステムで個別に生成された UUID が競合しないことを意味します。
UUID は次のようになります:
66e69275-c6bc-800c-90a6-2f41cb991502
32 個の 16 進数で構成され、8-4-4-4-12 の形式でハイフンで区切られた 5 つのグループに表示されます。
分散システムのデータベース キー: 異なるデータベースまたはマイクロサービスが相互に通信せずに一意の ID を生成する必要があるシステムでは、UUID によって一意性が保証されます。たとえば、分散型電子商取引プラットフォームでは、各サービスが注文 ID またはトランザクション ID を個別に生成し、UUID によって衝突が回避されます。
セッション ID: UUID は、Web アプリケーションでユーザー セッションを識別するために一般的に使用されます。これらは、機密データや予測可能なデータを漏らすことなくセッション情報を維持する必要がある場合に特に役立ちます。
ファイルまたはリソースの識別子: さまざまなプラットフォームやデータベースにまたがるファイル、ドキュメント、またはリソースを追跡する必要がある場合、各リソースに UUID を割り当てることで、危険を冒すことなく簡単に検索できます。重複しています。
API と外部参照: API で連続した ID または簡単に推測できる ID (例: user/1、user/2) を公開すると、プライバシーの脆弱性が発生する可能性があります。 UUID (例: user/66e69275-c6bc-800c-90a6-2f41cb991502) を使用すると、ユーザーが自分に属さないリソースを推測してアクセスする可能性が低くなります。
Python の uuid ライブラリを使用すると、UUID の生成と管理が簡単になります。方法は次のとおりです:
import uuid # Generate a UUID generated_uuid = uuid.uuid4() print(f"Generated UUID: {generated_uuid}")
uuid4() 関数は、ランダムまたは疑似乱数に基づいてランダムな UUID を生成します。これは、Web 開発で使用される最も一般的なバリアントです。
PostgreSQL などのデータベースを使用する場合、UUID を主キーとして使用するのが一般的です。 SQLAlchemy を使用して Python で設定する方法は次のとおりです:
from sqlalchemy import Column, String from sqlalchemy.dialects.postgresql import UUID import uuid from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) username = Column(String, nullable=False) # This will generate a UUID primary key for each new user.
この例では、id フィールドを UUID として定義し、分散データベース間でも他のレコードと競合しない一意の識別子を各ユーザーが持つようにします。
連続 ID または自動インクリメント ID を優先して UUID を無視すると、いくつかのリスクが生じる可能性があります。
セキュリティの脆弱性: 連続 ID は予測可能であるため、攻撃者がレコードを列挙して機密データを発見することが容易になります。たとえば、ユーザー ID が連続している場合、攻撃者は他のユーザー ID を推測して、不正なアカウントにアクセスしようとする可能性があります。
データ衝突: 分散システムでは、自動インクリメント整数に依存すると、特に複数のサービスまたはデータベースが中央調整なしで ID を生成している場合に ID 衝突が発生する可能性があります。
データの移行とマージの問題: データベースを結合したり、システム間でデータを移行したりする場合、一意でない連続 ID があると競合が発生する可能性があります。 UUID は一意性を保証することでこれらの問題を回避します。
UUID を文字列として保存する: よくある間違いは、UUID を文字列として保存することです。これにより、スペースが無駄になり、特に大規模なデータベースでクエリが遅くなる可能性があります。 PostgreSQL などの最新のデータベースのほとんどには、UUID を効率的に保存するネイティブ UUID タイプがあります。
間違っている:
CREATE TABLE users ( id VARCHAR(36) PRIMARY KEY );
右:
CREATE TABLE users ( id UUID PRIMARY KEY );
正しい UUID バージョンを使用していない: UUID にはいくつかのバージョン (例: uuid1()、uuid3()、uuid4()、uuid5()) があり、それぞれ特定の用途に適しています。ケース。 uuid4() は、乱数に基づいて、Web アプリケーションで一意の ID を生成するために最も一般的に使用されます。使用しているバージョンと、それがニーズに合うかどうかに注意してください。
衝突の可能性を無視する: UUID は一意になるように設計されていますが、衝突の可能性は非常に低いです。ほとんどのアプリケーションでは、リスクは無視できますが、数十億の UUID を生成している場合、または非常に機密性の高い環境で動作している場合は、衝突検出を実装する必要があります。
外部参照に UUID を使用する: URL または API で ID を公開する場合は、連続する ID よりも UUID を優先します。これによりセキュリティが強化され、ユーザーがリソース ID を予測することが困難になります。
UUID をネイティブ形式で保存する: データベースのネイティブ UUID タイプを使用して、文字列の代わりに UUID を保存します。これにより、ストレージ容量が削減され、クエリのパフォーマンスが向上します。
正しい UUID バージョンの選択: ほとんどの場合、Web アプリケーションで一意の識別子を生成するには、uuid4() (ランダムベースの UUID) が最適な選択です。ただし、決定論的に生成された UUID が必要な場合は、uuid3() または uuid5() (名前空間ベースの UUID) を検討してください。
UUID を検証する: ユーザー入力から UUID を受け入れるときは、処理する前に必ず UUID が適切にフォーマットされていることを検証してください。 Python では、UUID オブジェクトを使用して文字列の有効性をチェックできます。
def is_valid_uuid(uuid_to_test, version=4): try: uuid_obj = uuid.UUID(uuid_to_test, version=version) return str(uuid_obj) == uuid_to_test except ValueError: return False # Example usage print(is_valid_uuid("66e69275-c6bc-800c-90a6-2f41cb991502")) # True print(is_valid_uuid("invalid-uuid-string")) # False
UUID は、分散システム内で一意の識別子を生成し、Web アプリケーションのセキュリティを確保するための強力なツールです。これらは、データベース移行中のデータ衝突、予測可能な ID 攻撃、ID 競合などの問題を回避するのに役立ちます。 UUID のベスト プラクティスを理解して従うことで、より堅牢でスケーラブルで安全なバックエンド システムを構築できます。
必ず適切な UUID バージョンを使用し、データベースに正しく保存し、潜在的なリスクに注意してください。これらのヒントを活用すれば、プロジェクトで UUID を効果的に処理できるようになります!
UUID に関する質問や追加のヒントがある場合は、お気軽に以下にコメントしてください。コーディングを楽しんでください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3