Newer
Older
client_dwatch / app / api / auth / logout / route.ts
/**
 * POST /api/auth/logout — `dwatch_session` cookie を削除する。
 *
 * ★このルートは認証が必要★(`isPublicPath()` に入れていない)。
 *   cookie を消すだけなので公開しても実害は薄いが、公開にする理由も無い。
 *   未認証で叩けば proxy が 401 を返し、その時点で cookie は無効なので目的は達している。
 */
import { NextResponse } from "next/server";
import {
  SESSION_COOKIE_NAME,
  SESSION_COOKIE_OPTIONS,
} from "@/lib/auth/cookie";
import { withRequestId } from "@/lib/logger";

export async function POST(request: Request) {
  return withRequestId(request, async () => {
    const response = new NextResponse(null, { status: 204 });
    // 発行時と同じ name / path / secure で消す(属性が違うと消えずに残る)。
    // ★`delete()` は内部で Max-Age=0 を出すが、これは「削除」であって
    //   「トークンに期限を付ける」ことではない(CLAUDE.md §7 の禁止事項に当たらない)★
    response.cookies.delete({
      name: SESSION_COOKIE_NAME,
      path: SESSION_COOKIE_OPTIONS.path,
      secure: SESSION_COOKIE_OPTIONS.secure,
      httpOnly: SESSION_COOKIE_OPTIONS.httpOnly,
      sameSite: SESSION_COOKIE_OPTIONS.sameSite,
    });
    return response;
  });
}