[Next.js] νšŒμ›κ°€μž… ν›„ 둜그인 νŽ˜μ΄μ§€ 접속 μ•ˆ λ˜λŠ” 이슈

이슈 사항

νšŒμ› κ°€μž… 후에 둜그인 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λ„λ‘ ν–ˆλŠ”λ° 둜그인 νŽ˜μ΄μ§€ 이동 λ²„νŠΌμ„ 클릭해도 νŽ˜μ΄μ§€ 접속이 λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€. 둜그인 ν•œ μ‚¬λžŒμ€ νšŒμ›κ°€μž…κ³Ό 둜그인 νŽ˜μ΄μ§€ 접속을 λ§‰μ•„λ’€λŠ”λ° 이 λΆ€λΆ„μ—μ„œ λ­”κ°€ 잘λͺ»λœ 것 κ°™μ•˜λ‹€.

 

이슈 λ°œμƒ μ½”λ“œ

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { updateSession } from "./utils/supabase/middleware";
import { createClient } from "./utils/supabase/server";

export async function middleware(request: NextRequest) {
  await updateSession(request);

  const serverClient = createClient();

  const {
    data: { user }
  } = await serverClient.auth.getUser();

  const isLogin = !!user;

  if (isLogin && (request.nextUrl.pathname.startsWith("/login") || request.nextUrl.pathname.startsWith("/signUp"))) {
    return NextResponse.redirect(new URL("/", request.url));
  }

  if (!isLogin && request.nextUrl.pathname.startsWith("/myPage")) {
    return NextResponse.redirect(new URL("/", request.url));
  }

  return NextResponse.next();
}

/** μ–΄λ–€ νŽ˜μ΄μ§€μ—μ„œ 이 미듀웨어λ₯Ό μ‹€ν–‰ν• κ±°λ‹ˆ */
export const config = {
  matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)"]
};

 

await serverClient.auth.getUser() λ₯Ό 톡해 μ‚¬μš©μž 정보λ₯Ό μ‘°νšŒν•˜κ³  둜그인 λ˜μ–΄μžˆμœΌλ©΄, 둜그인 νŽ˜μ΄μ§€ 접속 μ‹œ ν™ˆμœΌλ‘œ μ΄λ™ν•˜λ„λ‘ ν–ˆλ‹€.

 

원인

μˆ˜νŒŒλ² μ΄μŠ€μ—μ„œλŠ” νšŒμ›κ°€μž…μ„ ν•˜λ©΄ μžλ™μœΌλ‘œ μ„Έμ…˜μ΄ λ°”λ‘œ μ €μž₯λ˜λ„λ‘ λ˜μ–΄μžˆλ‹€κ³ ν•œλ‹€.

 

νšŒμ›κ°€μž… ν›„ λ°”λ‘œ μ„Έμ…˜ 날리기

export async function signup(formData: User) {
  const supabase = createClient();

  const { data, error } = await supabase.auth.signUp({
    email: formData.email,
    password: formData.password,
    options: {
      data: {
        user_name: formData.name,
        nickname: formData.nickname
      }
    }
  });

  if (error) {
    return { error: error.message };
  }
  // νšŒμ›κ°€μž… ν›„ μ„Έμ…˜μ„ μ’…λ£Œν•˜μ—¬ μžλ™ μ„Έμ…˜ μ €μž₯ λ°©μ§€
  await supabase.auth.signOut();

  return { data };
}

signOut() λ©”μ„œλ“œλ₯Ό μš”μ²­ν•˜μ—¬ μ„Έμ…˜μ„ 없애주도둝 ν•˜μ˜€λ‹€.