users 테이블에 있는 기존 행 하나하나가 Clerk에게는 낯선 존재가 됩니다. 새 계정은 첫 로그인 시 생성되고, 그 계정들은 과거 데이터와 전혀 일치하지 않으며, 기존 고객들은 마치 계정을 “잃어버린” 것처럼 보이게 됩니다.
실제로 제대로 처리해야 할 것은 딱 두 가지뿐입니다.
이 페이지는 커스텀 인증 솔루션(자체 사용자 테이블, 비밀번호 해싱, 세션 등)에서 Clerk Auth로 마이그레이션하는 경우만 다룹니다. Replit Auth에서 Clerk Auth로 앱을 이전하는 가이드는 아닙니다 — 해당 마이그레이션 경로에 대한 공식 가이드는 곧 제공될 예정입니다.새 앱을 시작하는 경우라면 Clerk Auth 개요를 참고하세요 — 마이그레이션이 필요하지 않습니다.
1. 기존 사용자를 Clerk로 가져오기
앱의 모든 활성 사용자는 Clerk Auth가 라이브로 전환되기 전에 Clerk 사용자로 존재해야 합니다. 각 가져오기에는 최소한 다음이 포함되어야 합니다.- 이메일(필수)
- 사용 가능한 프로필 메타데이터: 이름, 인증 상태, Auth 패널에 표시하고 싶은 그 외의 정보
- 비밀번호 다이제스트: 사용자의 기존 비밀번호 해시
- 비밀번호 해셔: 해당 해시의 알고리즘/형식, Clerk가 요구하는 정확한 형태
bcrypt, scrypt_firebase, argon2i, pbkdf2_sha256 등)를 가지고 있습니다. 전체 목록과 각각에 필요한 정확한 다이제스트 형식은 Clerk Create User API 레퍼런스에서 확인하세요.
이 단계는 한 줄짜리 프롬프트로는 부족합니다. 마이그레이션을 담당하는 Agent는 현재 코드베이스에서 비밀번호가 어떻게 해싱되는지에 대한 철저한 이해가 필요합니다 — 어떤 라이브러리를 사용하는지, 어떤 매개변수(cost factor, salt 구조, pepper 등)를 사용하는지, 그리고 그것이 Clerk가 지원하는 해셔 중 어느 것에 매핑되는지 알아야 합니다. 잘 작성된 프롬프트는 다음과 비슷한 형태입니다.
2. Clerk 사용자를 기존 사용자 ID로 다시 연결하기
가져온 사용자가 로그인하면, 인증된 모든 요청에는 Clerk ID가 포함됩니다. 서버는 그 ID를users 테이블의 행으로 다시 매핑해야 합니다 — 그렇지 않으면 Clerk 사용자 ID가 기존 외래 키(orders.user_id, documents.owner_id 등)와 전혀 일치하지 않게 되고, 과거 데이터가 사라진 것처럼 보이게 됩니다.
Replit이 관리하는 Clerk를 사용하면 이 작업이 간단해집니다. 사용자를 가져올 때 기존 ID를 Clerk 사용자의 externalId로 지정하면, 그 값은 자동으로 세션 클레임에 sessionClaims.userId로 기록됩니다. 미들웨어는 원본 Clerk 사용자 ID보다 이 값을 우선적으로 사용하기만 하면 됩니다.
- 가져온 사용자는
sessionClaims.userId를 통해 기존users.id로 매핑됩니다 — 모든 과거 데이터가 그대로 유지됩니다. - 완전히 새로운 사용자(전환 이후에 가입했고
externalId가 없는 사용자)는auth.userId(그들의 Clerk 사용자 ID)로 대체됩니다. 이런 새 행에는 Clerk 사용자 ID를 기본 키로 사용하거나, 첫 로그인 시 행을 생성하고 다시 연결하세요.
이제 끝났습니다
그 외의 모든 것 — 기존 인증을 병렬로 계속 실행하기, 실제 계정을 대상으로 드라이런 실행하기, 전환 후 중복 사용자 생성 모니터링하기, 기존 시스템 폐기하기 — 는 표준적인 마이그레이션 위생 관리이며 Clerk Auth에만 특별히 해당되는 것은 아닙니다.추가 자료
- Clerk Auth 개요 — Replit에서 Clerk Auth가 작동하는 방식
- Clerk: Create User API — 지원되는 비밀번호 해셔와 다이제스트 형식