Server API Strategy
Overview
サーバーサイドAPIの設計において、ルーティング方式(パスベース vs サブドメインベース)の選択は、アプリケーションの構造やセキュリティ、拡張性に大きな影響を与えます。
NestJS はどちらの方式もサポートしており、ユースケースに応じた選択が可能です。
パスベース vs サブドメインベースの違い
| 項目 | パスベース(例: /api/admin/xxx) | サブドメインベース(例: admin.example.com) |
|---|---|---|
| URL構造 | 1つのドメイン下に全て存在 | ドメイン自体が役割で分かれる |
| クライアントの認知 | 同じアプリとして見える | 別アプリのように見せられる |
| Cookie/セッションの分離 | 共有される | ドメイン単位で独立可能 |
| マルチテナント設計 | /t/:id/ 等のルート構成 | :tenant.example.com の構成 |
| CDN/SSLの設定柔軟性 | 単一で管理しやすい | サブドメインごとに設定可能 |
| 導入難易度 | 低い(導入しやすい) | DNS設定や証明書の対応が必要 |
NestJSでの実装例
パスベースルーティング
@Controller('admin')
export class AdminController {
@Get('dashboard')
getDashboard() {
return 'admin dashboard';
}
}
サブドメインルーティング
@Controller({ host: 'admin.example.com' })
export class AdminSubdomainController {
@Get()
index(): string {
return 'Admin page';
}
}
⚠️ Fastifyアダプターではサブドメインルーティングはサポートされていないため、Expressアダプターの使用が必要です。
推奨戦略と判断軸
- 単一アプリケーションで管理したい場合 → パスベース
- ロールやユースケースで分離したい場合 → サブドメインベース
- SaaSで顧客ごとにURLを分けたい場合 → サブドメイン or ハイブリッド
まとめ
ルーティング方式は単なるURLの違いにとどまらず、アプリの構成、運用、ユーザー体験全体に関わる設計選択です。NestJSではどちらも柔軟に対応できるため、要件に応じた最適な方式を選びましょう。