← 전체 글로 돌아가기

Next.js

Next.js 미들웨어 로그인 리다이렉트가 반복될 때 쿠키 경로부터 확인한 기록

로그인은 성공했는데 관리자와 로그인 화면을 왕복하던 문제를 쿠키 Path와 matcher 기준으로 좁힌 기록입니다.

로그인 실패처럼 보인 증상

관리자 로그인 API는 200을 돌려주는데 브라우저가 /admin/admin/login을 계속 왕복했다. 처음에는 JWT 검증을 의심했다. Network 탭을 보니 307 뒤에 이어진 /admin 요청에는 쿠키가 없었다. 응답 본문보다 요청별 Cookie 헤더를 비교한 것이 전환점이었다.

쿠키는 만들어졌지만 보내지지 않았다

테스트 중 로그인 API 쿠키를 /api 아래에서만 보내도록 설정해 둔 상태였다. API에는 맞지만 페이지 요청에는 맞지 않는 Path였다.

response.cookies.set('admin_session', token, {
  httpOnly: true,
  path: '/',
  sameSite: 'lax',
  secure: process.env.NODE_ENV === 'production',
})

/admin에서 세션을 읽어야 한다면 Path도 /여야 한다. /admin/login도 보호 matcher에 포함된다는 점도 헷갈렸다. 토큰이 없을 때 로그인 페이지를 다시 로그인 페이지로 보내지 않도록 예외가 필요하다.

const isLogin = request.nextUrl.pathname === '/admin/login'
if (!token && !isLogin) {
  return NextResponse.redirect(new URL('/admin/login', request.url))
}

다음 확인 순서

  • Set-Cookie의 Path, Secure, SameSite를 실제 응답에서 본다.
  • 보호 페이지 요청에 Cookie 헤더가 있는지 확인한다.
  • 쿠키를 지운 브라우저와 이미 로그인한 브라우저를 모두 시험한다.

인증 로직 전체를 고치기 전에 브라우저가 쿠키를 어느 경로에 보내는지 보는 편이 빠른 수정 기준이었다.