uuidの生成と使い方 【CakePHP4】

uuidとは?

CakePHP公式サイトには、以下のように記載されています。

UUID メソッドは RFC 4122 準拠のユニークな識別子を生成するのに使います。 UUID は 485fc381-e790-47a3-9794-1337c0a8fe68 というフォーマットの 128 ビットの文字列です。

つまりuuidとは、乱数を用いて生成された、8桁-4桁-4桁-12桁の文字列です。

これを用いれば、ほぼ確実に「世界でたったひとつの文字列」を作ることができるそうです。

下記の記事によれば、重複が発生する確率は限りなく低いとのこと。

世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか
オンライン対戦システムやランキングシステムの都合などで「世界中で唯一の値である識別子」をサーバーに接続せずに作成する必要がある場合があり、そうした場合に活用されるのが「UUID」です。そのUUIDの性質について、エンジニアのアリアマン・シャーダさんが解説しています。

※以下、↑の記事からの抜粋

100年間ずっと毎秒10億個のUUIDを作成した場合でも重複するUUIDが生成される可能性は約50%

uuidを生成する

CakePHPではuuidを生成するメソッドが用意されています。

//SanplesController.php
<?php
・・・省略
use Cake\Utility\Text;

class SamplesController extends AppController
{
      public function test()
      {
              //uuidを生成する
              $uuid = Text::uuid();
     
      }
・・・省略

これだけのコードでuuidを生成することができます。

例えば、以下のような文字列が生成されます。
「bdfcdf7b-328a-4b5d-b103-5b783ec26737」

使い方の事例:urlとして利用する

uuidの一般的な利用方法として、「urlにて利用する」というものがあります。

個別データを絞り込むための情報として、uuidを利用するのです。

例えば、usersテーブルにuuidというカラムを作成し、uuidをユーザごとに登録します。

そして、以下のようなurlでユーザ情報を表示します。

hoge.piyo/users/bdfcdf7b-328a-4b5d-b103-5b783ec26737
※uuidが「bdfcdf7b-328a-4b5d-b103-5b783ec26737」のユーザ情報を表示する例です。

このようなuuidを用いたurlから、他ユーザのurlを推測することはかなり難しいため、セキュリティ的に望ましいと言えます。

これについては、以降の「望ましくない例」を見るとイメージがしやすいでしょう。

※望ましくない例:urlにidを利用する

例えば、下記のurlで、id=15のユーザ情報を表示するとします。

hoge.piyo/users/15

このような設計の問題点として、urlが非常に類推しやすいことが挙げられます。

末尾の数値を適当に入れ替えるだけで、他のユーザのユーザ情報が簡単に閲覧できてしまう可能性があるわけです。
※例えば15→30にしたらid=30のユーザの情報が閲覧できてしまう可能性があります。

もちろん、ログイン判定や本人判定も別途行えばセキュリティー対策は可能ですが、urlが推測しやすければそれだけ悪意のある攻撃も容易になってしまいます。

参考

・CakePHP公式:Text

・Gigazin:世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか

コメント

タイトルとURLをコピーしました