로그인 버튼을 눌러도 로그인이 안 됐다 — 인증 시스템 갈아탄 삽질기
로그인 → 대시보드 → 로그인 → 대시보드 → 로그인...
로그인 버튼을 눌렀어요. 대시보드로 넘어가나 싶더니, 바로 로그인 화면으로 돌아왔습니다. 다시 로그인. 또 돌아옴. 새로고침. 시크릿 모드. 캐시 삭제. 전부 소용없었어요.
무한 루프.원인 — 문지기가 두 명이었다
비유하면 이런 상황이었어요:
회사에 출입문이 하나인데, 문지기가 두 명 서있었습니다. 문지기 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군데에서 세션 확인 중 |
| 제약조건 | 없음 | 기존 사용자 유지, 서비스 중단 최소화 |
| 결과 | 현관문만 바꿈 | 단계별 전환 계획 |
고치면 또 터지는 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줄 삭감 |
배운 것 — "절반만 바뀐 상태"가 가장 위험하다
이 삽질에서 배운 건: