ホームページ  >  記事  >  バックエンド開発  >  UUID を理解する: ジュ​​ニア開発者のためのバックエンド エンジニア ガイド

UUID を理解する: ジュ​​ニア開発者のためのバックエンド エンジニア ガイド

DDD
DDDオリジナル
2024-09-18 17:37:03859ブラウズ

Understanding UUIDs: A Backend Engineer’s Guide for Junior Developers

導入

バックエンド エンジニアとして、私たちは多くの場合、それぞれ固有の ID を必要とする多数のリソース、ユーザー、エンティティを拡張して処理できるシステムを構築する任務を負っています。多くの場合、連続した ID (1、2、3 など) を使用するのが簡単な解決策のように思えますが、アプリケーションが成長し、分散システム間でスケールするにつれて、これはすぐに問題になる可能性があります。ここで UUID (Universally Unique Identifiers) が登場します。

このブログ投稿では、以下について説明します。

  • UUID とは
  • UUID の実際の使用例
  • Python で UUID を実装する方法
  • UUID を無視するリスク
  • UUID を使用する際のよくある間違い
  • UUID を使用するためのベスト プラクティス

UUIDとは何ですか?

UUID (Universally Unique Identifier) は、コンピューター システム内の情報を一意に識別するために使用される 128 ビットの番号です。これはグローバルに一意になるように設計されており、異なるシステムで個別に生成された UUID が競合しないことを意味します。

UUID は次のようになります:

66e69275-c6bc-800c-90a6-2f41cb991502

32 の 16 進数で構成され、8-4-4-4-12 の形式でハイフンで区切られた 5 つのグループに表示されます。

UUID の実世界の使用例

  1. 分散システムのデータベース キー: 異なるデータベースまたはマイクロサービスが相互に通信せずに一意の ID を生成する必要があるシステムでは、UUID によって一意性が保証されます。たとえば、分散型電子商取引プラットフォームでは、各サービスが注文 ID またはトランザクション ID を個別に生成し、UUID によって衝突が回避されます。

  2. セッション ID: UUID は、Web アプリケーションでユーザー セッションを識別するために一般的に使用されます。これらは、機密データや予測可能なデータを漏らすことなくセッション情報を維持する必要がある場合に特に役立ちます。

  3. ファイルまたはリソースの識別子: さまざまなプラットフォームやデータベースにまたがるファイル、ドキュメント、またはリソースを追跡する必要がある場合、UUID を各リソースに割り当てることで、危険を冒すことなく簡単に検索できます。重複しています。

  4. API と外部参照: API で連続した ID または簡単に推測できる ID (例: user/1、user/2) を公開すると、プライバシーの脆弱性が発生する可能性があります。 UUID (例: user/66e69275-c6bc-800c-90a6-2f41cb991502) を使用すると、ユーザーが自分に属さないリソースを推測してアクセスする可能性が減ります。

Python での UUID の実装

Python の uuid ライブラリを使用すると、UUID の生成と管理が簡単になります。その方法は次のとおりです:

import uuid

# Generate a UUID
generated_uuid = uuid.uuid4()
print(f"Generated UUID: {generated_uuid}")

uuid4() 関数は、ランダムまたは疑似乱数に基づいてランダムな UUID を生成します。これは、Web 開発で使用される最も一般的なバリアントです。

例: データベースの主キーとして UUID を使用する

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 として定義し、分散データベース間でも他のレコードと競合しない一意の識別子を各ユーザーが持つようにします。

UUIDを無視することのリスク

連続 ID または自動インクリメント ID を優先して UUID を無視すると、いくつかのリスクが生じる可能性があります。

  1. セキュリティの脆弱性: 連続 ID は予測可能であるため、攻撃者がレコードを列挙して機密データを発見することが容易になります。たとえば、ユーザー ID が連続している場合、攻撃者は他のユーザー ID を推測して、未承認のアカウントにアクセスしようとする可能性があります。

  2. データの衝突: 分散システムでは、自動インクリメント整数に依存すると、特に複数のサービスまたはデータベースが中央調整なしで ID を生成している場合に、ID の衝突が発生する可能性があります。

  3. データの移行とマージの問題: データベースを結合したり、システム間でデータを移行したりする場合、一意でない連続 ID があると競合が発生する可能性があります。 UUID は一意性を保証することでこれらの問題を回避します。

UUID使用時のよくある間違い

  1. UUID を文字列として保存する: よくある間違いは、UUID を文字列として保存することです。これにより、スペースが無駄になり、特に大規模なデータベースでクエリが遅くなる可能性があります。 PostgreSQL などの最新のデータベースには、UUID を効率的に保存するネイティブ UUID タイプがあります。

    間違っています:

    CREATE TABLE users (
        id VARCHAR(36) PRIMARY KEY
    );
    

    :

    CREATE TABLE users (
        id UUID PRIMARY KEY
    );
    
  2. Not Using the Correct UUID Version: There are several versions of UUIDs (e.g., uuid1(), uuid3(), uuid4(), uuid5()), each suited to specific use cases. uuid4(), based on random numbers, is the most commonly used for generating unique IDs in web applications. Be mindful of which version you’re using and whether it fits your needs.

  3. Ignoring Collision Possibilities: While UUIDs are designed to be unique, there’s a very small chance of collision. For most applications, the risk is negligible, but if you’re generating billions of UUIDs or operating in highly sensitive environments, you should implement collision detection.

Best Practices for Using UUIDs

  1. Use UUIDs for External References: When exposing IDs in URLs or APIs, prefer UUIDs to sequential IDs. This enhances security and makes it harder for users to predict resource IDs.

  2. Store UUIDs in Native Formats: Use the database's native UUID type to store UUIDs instead of strings. This reduces storage space and improves query performance.

  3. Choose the Right UUID Version: In most cases, uuid4() (random-based UUID) is the best choice for generating unique identifiers in web applications. However, if you need deterministically generated UUIDs, you might consider uuid3() or uuid5() (namespace-based UUIDs).

  4. Validate UUIDs: When accepting UUIDs from user input, always validate them to ensure they are properly formatted before processing. In Python, you can use UUID objects to check the validity of a string.

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

Conclusion

UUIDs are powerful tools for generating unique identifiers in distributed systems and ensuring security in web applications. They help you avoid issues like data collisions, predictable ID attacks, and ID conflicts during database migrations. By understanding and following best practices for UUIDs, you can build more robust, scalable, and secure backend systems.

Remember to use the appropriate UUID version, store them correctly in your databases, and be mindful of their potential risks. With these tips, you’ll be well-equipped to handle UUIDs effectively in your projects!


Feel free to comment below if you have any questions or additional tips about UUIDs! Happy coding!

以上がUUID を理解する: ジュ​​ニア開発者のためのバックエンド エンジニア ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。