Dev Study
NestJS コース

23. CORS と Helmet

ブラウザには同一オリジンポリシーという制約があり、あるオリジン(例: https://app.example.com)で読み込んだページから別オリジンの API を呼ぶことは既定で制限されます。フロントエンドと API のドメインが異なる構成では、API 側が「このオリジンからのアクセスを許可する」と明示する必要があり、これが CORS です。NestJS では main.ts で app.enableCors() を呼ぶだけで有効になり、許可するオリジンを指定できます。

Helmet は、レスポンスにセキュリティ関連の HTTP ヘッダをまとめて付与するミドルウェアです。helmet パッケージを app.use(helmet()) で適用すると、クリックジャッキングや MIME スニッフィングを防ぐヘッダなどが自動で設定されます。実務ではこの2つを本番公開前のチェックリストに入れておくのが定番です。

つまずきポイントは、CORS をブラウザ以外でも効くアクセス制御だと誤解することです。CORS はあくまでブラウザが課す制約で、curl やサーバー間通信には効きません。本当のアクセス制御は前のレッスンで学んだ認証・認可で行い、CORS は「どのフロントから呼ばれてよいか」を制御するもの、と役割を切り分けて理解しましょう。

サンプルコード(フレームワーク環境が必要なため表示のみ)

// main.ts — CORS と Helmet をアプリ全体に適用
import { NestFactory } from "@nestjs/core";
import helmet from "helmet";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // 許可するオリジンを明示(ブラウザからの別オリジンアクセス制御)
  app.enableCors({ origin: "https://app.example.com" });

  // セキュリティ関連の HTTP ヘッダをまとめて付与
  app.use(helmet());

  await app.listen(3000);
}
bootstrap();
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗