テナント分離#
テナント分離の方法#
マルチテナントSaaSにおいて、テナントごとにデータを分離する方法は主に3つある
アプリケーションの実行環境ごと完全に分離する
データベースのみをインスタンスやスキーマで分離する
データベースのインスタンスやスキーマはマルチテナントとして、テーブル内のテナントIDで分離する
上のものほど安全に分離できるが、リソース効率が悪くなる。
Row Level Security (RLS)#
Row Level Security (RLS)は、テーブル内の行へのアクセスを制御する機能。
RLS を利用すると、SELECT 文などに暗黙的な WHERE 句 (where tenant_id = xxx
) が追加されたような挙動が実現できる。
注意点#
パフォーマンスがやや悪くなる
コネクション管理が煩雑になる
current_user
ではなくcurrent_setting
をポリシーに使うことでコネクション管理が複雑にならないらしいPostgreSQL の行レベルのセキュリティを備えたマルチテナントデータの分離 | Amazon Web Services ブログ
参考
PostgreSQLのRow Level Securityを検証する
MySQLはRLSをサポートしていないらしい。
「MySQLでマルチテナントSaaSをやるとうっかりミスで会社が潰れます。(技術選定の失敗 2年間を振り返る TypeScript,Hono,Nest.js,React,GraphQL)」
マルチテナントSaaSのテナント分離をRow-Level Securityに移行した - Sansan Tech Blog