로그인 버튼을 눌러도 로그인이 안 됐다 — 인증 시스템 갈아탄 삽질기

문제 해결 노트··13분 읽기·
NextAuth에서 Supabase Auth 마이그레이션 — 무한 루프 해결기

로그인 → 대시보드 → 로그인 → 대시보드 → 로그인...

로그인 버튼을 눌렀어요. 대시보드로 넘어가나 싶더니, 바로 로그인 화면으로 돌아왔습니다. 다시 로그인. 또 돌아옴. 새로고침. 시크릿 모드. 캐시 삭제. 전부 소용없었어요.

무한 루프.

원인 — 문지기가 두 명이었다

비유하면 이런 상황이었어요:

회사에 출입문이 하나인데, 문지기가 두 명 서있었습니다. 문지기 A(NextAuth)한테 사원증을 보여주고 들어갔는데, 안에서 문지기 B(Supabase Auth)가 "저는 그 사원증 모르는데요?"라면서 다시 밖으로 내보내는 거예요. 밖에 나가면 문지기 A가 "어? 방금 들어갔잖아, 다시 들어가세요" → 무한 반복.

Echo Mail을 처음 만들 때 AI한테 "로그인 기능 만들어줘"라고 하니까 NextAuth라는 인증 도구를 사용했어요. 나중에 데이터베이스를 Supabase로 옮겼는데, Supabase에도 자체 인증 시스템이 있거든요. 결국 인증 시스템이 두 개 동시에 돌아가는 상태가 된 겁니다.

"바꿔줘" 한 마디의 결과

NextAuth 지우고 Supabase Auth 쓰게 해줘.

AI가 로그인 화면은 바꿔줬는데, 로그인 후 "이 사람 진짜 로그인한 거 맞아?"를 확인하는 내부 코드는 여전히 NextAuth를 쓰고 있었어요. 현관문만 바꾸고 내부 잠금장치는 그대로 둔 셈.

프롬프트를 바꿨더니 — 계획이 먼저 나왔다

당신은 인증 시스템 전문가입니다.
NextAuth에서 Supabase Auth로 바꾸는 계획을 세워주세요.

[현재 상태]
- 로그인 화면: NextAuth 사용 중
- 로그인 확인 코드: 약 10군데에서 NextAuth 세션 확인 중
- 출입 통제: NextAuth 기반
- 데이터베이스: 이미 Supabase 사용 중

[제약조건]
- 기존 사용자 정보 유지
- 바꾸는 동안 서비스 중단 최소화

각 단계에서 어떤 파일을 바꿔야 하는지, 테스트 방법도 알려주세요.
비교 "바꿔줘" 바꾼 프롬프트
역할 부여 없음 "인증 시스템 전문가"
현재 어디서 쓰이는지 없음 10군데에서 세션 확인 중
제약조건 없음 기존 사용자 유지, 서비스 중단 최소화
결과 현관문만 바꿈 단계별 전환 계획
"바꿔줘"가 아니라 "계획 세워줘"로 바꾼 게 핵심이었어요. AI가 "어디서 NextAuth를 쓰고 있는지"를 전부 파악하고, 순서대로 교체하는 계획을 짜줬거든요.

고치면 또 터지는 4단계

1단계: 로그인 확인 코드 교체 → "소속 회사를 찾을 수 없습니다"

로그인 확인 코드를 바꿨더니, 이번에는 "소속 회사를 찾을 수 없습니다" 에러. NextAuth는 사용자 정보를 자기만의 방식으로 저장했는데, Supabase Auth는 다른 방식을 써요. 중간 연결 고리를 새로 만들어야 했습니다.

로그인은 되는데 "소속 회사를 찾을 수 없습니다" 에러가 납니다.
NextAuth의 사용자 테이블과 Supabase Auth의 사용자 테이블이 다릅니다.
Supabase Auth 사용자 ID로 소속 회사를 찾는 코드로 바꿔주세요.

2단계: 무한 루프 해결 → 또 다른 무한 루프

첫 번째 무한 루프(문지기 문제)를 고쳤더니, 두 번째 무한 루프가 있었어요. 로그인 성공 후 "설정 페이지로 가세요"라고 보내는데, 설정 페이지 주소가 /auth/setup-pending이라 — "아직 로그인 안 했네? 로그인으로 보내야지" 판단이 또 발동.

무한 루프가 또 발생합니다.
로그인 성공 후 /auth/setup-pending으로 보내는데,
이 경로도 /auth/로 시작해서 "미로그인"으로 판단됩니다.

/auth/setup-pending은 로그인 확인에서 제외해주세요.

한 줄 예외 추가로 해결.

3단계: NextAuth 완전 제거 → 295줄 삭제의 쾌감

무한 루프가 해결되니 나머지는 비교적 수월했어요. NextAuth 관련 코드를 전부 삭제했는데 — 295줄이 사라졌습니다. 두 개의 인증 시스템이 하나로 합쳐지니까 코드가 오히려 줄어든 거예요.

4단계: 기존 사용자의 대시보드가 비었다

가장 찾기 어려웠던 버그. 로그인은 되는데 대시보드가 텅 비어있는 사용자가 있었어요.

원인: 새로운 인증 시스템에서 가입하면 자동으로 "소속 회사"가 만들어지는데, 이전에 가입한 기존 사용자는 이 자동 생성 장치가 배포되기 전에 가입했으니까 소속 회사가 없었습니다.

수동으로 기존 사용자들의 소속 회사를 생성해서 해결.

한 달 동안 바뀐 것

항목 전 (NextAuth) 후 (Supabase Auth)
인증 도구 NextAuth + 별도 어댑터 Supabase 내장 인증
사원증(세션) NextAuth 전용 쿠키 Supabase 전용 쿠키
문지기 수 2명 (충돌) 1명 (통합)
보안 연동 DB 보안과 별개 DB 보안과 자동 연동
코드량 많음 295줄 삭감

배운 것 — "절반만 바뀐 상태"가 가장 위험하다

이 삽질에서 배운 건:

  • 인증 시스템은 "전부 아니면 전무"입니다. 현관문만 바꾸고 내부 잠금은 그대로 두면, 문지기 두 명이 싸우면서 아무도 못 들어가는 상태가 됩니다.
  • "바꿔줘"가 아니라 "계획 세워줘"로 시작하세요. 인증은 로그인 화면뿐 아니라 API, 출입 통제, 사용자 정보 연결 등 여러 곳에 퍼져있어요. AI한테 "어디서 쓰이는지 전부 파악하고 순서대로 바꿔줘"라고 해야 합니다.
  • 무한 루프는 에러 메시지가 없습니다. 에러가 뜨면 검색이라도 하는데, 무한 루프는 화면만 왔다 갔다 할 뿐 뭐가 문제인지 힌트가 없어요. AI한테 "현재 상태 + 증상 + 원인 추정"을 최대한 구체적으로 알려줘야 합니다.
  • 기존 사용자를 잊지 마세요. 새 시스템은 새 사용자에게는 잘 동작하는데, 이전에 가입한 사용자에게는 빠진 데이터가 있을 수 있어요.
  • 공유

    댓글