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 헤더가 있는지 확인한다.
- 쿠키를 지운 브라우저와 이미 로그인한 브라우저를 모두 시험한다.
인증 로직 전체를 고치기 전에 브라우저가 쿠키를 어느 경로에 보내는지 보는 편이 빠른 수정 기준이었다.