NextAuth 상태 전이

로그인 버튼은 콜백 주소를 들고 세션 판정 흐름으로 들어간다

useSession의 상태값은 화면 표시용 문구가 아니라 보호 라우트의 분기점이다. 로그인 시작, 제공자 콜백, 세션 쿠키 확인, 원래 페이지 복귀가 하나의 흐름으로 이어져야 한다.

보호 화면: /dashboard/settings
세션 없음 보호 라우트에서 막힌다 요청한 경로를 callbackUrl로 보존하고 로그인 화면으로 보낸다. callbackUrl=/dashboard/settings
로그인 시작 signIn이 인증 제공자로 보낸다 OAuth 또는 credentials 흐름에서 사용자를 확인한다. signIn(provider, { callbackUrl })
콜백 처리 NextAuth가 세션 근거를 만든다 토큰, 쿠키, 어댑터 저장소 중 설정한 방식으로 로그인 사실을 남긴다. /api/auth/callback/*
세션 확인 원래 화면으로 돌아간다 브라우저와 서버가 같은 세션을 보고 보호 화면을 렌더링한다. useSession() → authenticated
loading 임시 화면 세션 확인 중에는 보호 데이터를 요청하지 않고 자리 표시만 둔다.
unauthenticated 로그인 유도 현재 URL을 callbackUrl로 묶어 로그인 뒤 같은 작업으로 돌아오게 한다.
authenticated 권한 확인 후 렌더링 사용자 정보와 role을 확인해 화면과 서버 작업을 허용한다.
클라이언트 분기만으로 보호하지 않는다 중요 데이터는 서버 컴포넌트, 라우트 핸들러, 서버 액션에서 다시 세션을 확인한다.
callbackUrl은 신뢰 경계를 둔다 외부 사이트로 열리는 리다이렉트를 막고 허용된 내부 경로만 복귀시킨다.
signOut 뒤 캐시 상태를 정리한다 세션 종료 후 보호 화면 데이터가 남지 않도록 재검증과 이동 경로를 맞춘다.