Firexport가이드
Firebase Authentication 사용자를 내보내는 방법
Firebase Authentication의 사용자(Users) 탭은 프로젝트의 모든 계정을 보여 주지만 내려받을 수는 없습니다. 탭에 있는 메뉴는 하나뿐이고, 그 안에는 비밀번호 해시 매개변수만 있습니다. 사용자를 파일로 꺼내는 방법은 세 가지입니다. 어느 것이 맞는지는 파일의 용도에 달려 있습니다. 읽고 공유하거나 메일을 보낼 목록인지, 다른 프로젝트로 옮기려는 것인지입니다.
2026년 10월 7일 업데이트. 방법 1의 확장 프로그램 Firexport는 저희가 만든 것입니다. 방법 2와 3에는 필요 없습니다.
짧은 답
| 1. 콘솔 + 확장 프로그램 | 2. Firebase CLI | 3. Admin SDK 스크립트 | |
|---|---|---|---|
| 준비 | Chrome 확장 프로그램 설치 | Node.js와 Firebase CLI | Node.js와 Google Cloud 사용자 인증 정보 |
| 형식 | 머리글 행이 있는 CSV 또는 JSON | 머리글 행이 없는 CSV 또는 JSON | 머리글 행이 있는 CSV(또는 코드가 쓰는 형식) |
| 시각 | 콘솔에 표시되는 날짜(Advanced는 ISO 8601) | 에포크 밀리초 | ISO 8601 |
| 커스텀 클레임 | Advanced에서 | 포함 | 포함 |
| 비밀번호 해시 | 전혀 읽지 않음 | 포함(편집자 또는 소유자 역할) | 제외 |
1. Firexport로 Firebase 콘솔에서 내보내기
Firebase 콘솔의 Authentication > 사용자(Users)는 사용자를 표로 한 페이지씩 보여 주지만, 그것을 내려받을 방법은 없습니다. Firexport는 그 표에 내보내기 버튼을 추가하는 무료 Chrome 확장 프로그램입니다.
- Chrome 웹 스토어에서 Firexport를 설치합니다.
- Firebase 콘솔에서 Authentication을 열고 사용자(Users) 탭으로 갑니다.
- 사용자 추가(Add user) 오른쪽의 내보내기를 클릭합니다. Firexport가 표의 모든 페이지를 훑어 CSV 파일 하나를 내려받습니다. JSON이 필요하면 버튼 옆의 ⋮ 메뉴를 열어 JSON 내보내기를 고릅니다.

파일에 들어가는 것:
- 무료 버전에서는 사용자마다 행 하나에
uid,identifier,disabled,providers,creationTime,lastSignInTime열. 콘솔에 보이는 표 그대로입니다. 날짜는 시각 없이 콘솔의 표시 형식이고, 제공업체는 Email이나 Google 같은 이름입니다. - 유료 플랜인 Firexport Advanced는 사용자마다 전체 레코드를 Admin SDK의 이름 그대로 씁니다:
email,emailVerified,displayName,phoneNumber,photoURL,providerData,customClaims,multiFactor, 그리고 ISO 8601(UTC)로 된 생성·로그인·토큰 시각. - 열 이름은 콘솔 언어와 상관없이 영어이므로, 어느 내보내기든 열이 같습니다.
비밀번호 해시는 전혀 읽지 않으며, 사용자 데이터는 브라우저를 벗어나지 않습니다. 파일은 브라우저 안에서 만들어지고 다운로드 폴더 말고는 어디로도 가지 않습니다. 이미 로그인한 콘솔 세션에서 동작하므로 준비할 서비스 계정 키도, CLI도 없습니다. Chrome과 다른 Chromium 기반 브라우저에서 동작합니다.
사용자 한 명씩 보기
사용자 한 명을 확인하려면 그 행에 마우스를 올립니다. 행의 동작 아이콘 맨 앞에 있는 사용자 정보 아이콘을 누르면 전체 레코드를 담은 카드가 열립니다. 표시 이름, 이메일 인증, 제공업체, 로그인·토큰 시각, 커스텀 클레임, 2단계 인증입니다. 카드의 복사 아이콘을 누르면 그 사용자가 JSON으로 클립보드에 복사됩니다. 둘 다 무료입니다.

CLI도 서비스 계정 키도 없이, Firebase 사용자를 콘솔에서 바로 내보내 보세요.
2. Firebase CLI로 내보내기
Firebase CLI의 auth:export 명령은 프로젝트의 모든 계정을 파일 하나로 내려받습니다. auth:import로 사용자를 다른 프로젝트에 옮기기 위한 명령이라 비밀번호 해시와 솔트가 들어갑니다. 그래서 이 파일은 그 자체로 인증 정보이기도 합니다. 공유 드라이브나 이메일에 올리지 마세요. 해시와 솔트 필드를 받으려면 프로젝트의 편집자 또는 소유자 역할이 있는 계정이 필요합니다.
npm install -g firebase-tools
firebase login
firebase auth:export users.json --project your-project-id- 형식은 파일 이름으로 정해집니다:
users.json또는users.csv. - CSV에는 머리글 행이 없습니다. 열은 정해진 순서로 나옵니다: UID, 이메일, 이메일 인증 여부, 비밀번호 해시, 솔트, 이름과 사진 URL, Google·Facebook·Twitter·GitHub마다 열 네 개씩, 그다음 생성 시각, 마지막 로그인 시각, 전화번호와 몇 가지 더. 전체 목록은 Google의 auth:export 참조 문서에 있습니다. 시각은 에포크 밀리초입니다.
- JSON은 API의 이름을 그대로 씁니다:
localId,createdAt,lastSignedInAt,providerUserInfo, 그리고 커스텀 클레임을 담은customAttributes(JSON 문자열). - 비밀번호는 Firebase의 scrypt로 해시된 것만 내보내집니다. 다른 알고리즘으로 가져온 뒤 한 번도 로그인하지 않은 사용자는 해시와 솔트 필드가 비어 있습니다.
사용자를 옮기려면 원래 프로젝트의 해시 매개변수를 넣어 파일을 다른 프로젝트로 가져옵니다(Authentication > 사용자 > ⋮ > 비밀번호 해시 매개변수(Password hash parameters)). 사용자는 UID를 그대로 유지하고 같은 비밀번호로 로그인할 수 있습니다.
firebase auth:import users.json --project new-project-id \
--hash-algo=SCRYPT --hash-key=BASE64_SIGNER_KEY --salt-separator=BASE64_SALT_SEPARATOR \
--rounds=ROUNDS --mem-cost=MEM_COST3. Admin SDK 스크립트로 내보내기
열 구성을 직접 정하거나 내보내기를 일정에 따라 돌리고 싶다면, Firebase Admin SDK를 쓰는 짧은 Node.js 스크립트면 됩니다. 모든 사용자를 나열해 머리글 행이 있는 CSV로 씁니다. 사용자를 읽을 수 있는 계정이 필요합니다. 프로젝트 소유자나 편집자, 또는 Firebase Authentication 뷰어 역할입니다.
- SDK 설치:
npm install firebase-admin - 로컬 사용자 인증 정보로 로그인:
gcloud auth application-default login. 서버에서는 대신GOOGLE_APPLICATION_CREDENTIALS가 서비스 계정 키를 가리키게 합니다. - 아래 스크립트를
export-users.mjs로 저장하고your-project-id를 바꾼 뒤node export-users.mjs를 실행합니다.
// Usage: node export-users.mjs → writes users.csv
import { writeFileSync } from 'node:fs';
import { initializeApp } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';
initializeApp({ projectId: 'your-project-id' });
const auth = getAuth();
// listUsers returns at most 1,000 users per call, so follow the page token to the end.
const users = [];
let pageToken;
do {
const page = await auth.listUsers(1000, pageToken);
users.push(...page.users);
pageToken = page.pageToken;
} while (pageToken);
// One row per user. Times become ISO 8601. Password hashes are left out: this is a user list, not a backup.
const iso = (time) => (time ? new Date(time).toISOString() : '');
const rows = users.map((user) => ({
uid: user.uid,
email: user.email,
emailVerified: user.emailVerified,
displayName: user.displayName,
phoneNumber: user.phoneNumber,
disabled: user.disabled,
providers: user.providerData.map((provider) => provider.providerId).join(' '),
creationTime: iso(user.metadata.creationTime),
lastSignInTime: iso(user.metadata.lastSignInTime),
customClaims: user.customClaims ? JSON.stringify(user.customClaims) : '',
}));
// Quote any cell with a comma, a quote or a line break.
function cell(value) {
const text = value === undefined || value === null ? '' : String(value);
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
}
const columns = ['uid', 'email', 'emailVerified', 'displayName', 'phoneNumber', 'disabled',
'providers', 'creationTime', 'lastSignInTime', 'customClaims'];
const lines = [columns, ...rows.map((row) => columns.map((column) => row[column]))];
// The byte order mark at the start makes Excel read names in any language correctly.
writeFileSync('users.csv', '' + lines.map((line) => line.map(cell).join(',')).join('\r\n'));
console.log(`Wrote ${rows.length} users to users.csv`);- API가 “requires a quota project”라며 호출이 실패하면
gcloud auth application-default set-quota-project your-project-id를 실행한 뒤 다시 시도하세요. listUsers는 가입일 순이 아니라 UID 순으로 사용자를 돌려줍니다. 가입일 순이 필요하면 행을 정렬하세요.- SDK는
firebaseauth.configs.getHashConfig권한이 있는 계정에만 비밀번호 해시를 돌려주며, 이 스크립트는 어느 쪽이든 해시를 넣지 않습니다. 비밀번호까지 옮기려면 방법 2를 쓰세요.
FAQ
Firebase 콘솔에서 Authentication 사용자를 내보낼 수 있나요?
아니요. 사용자(Users) 탭에는 검색창, 사용자 추가(Add user), 새로고침 버튼, 그리고 비밀번호 해시 매개변수(Password hash parameters) 하나만 든 메뉴가 있을 뿐입니다. 사용자를 파일로 받으려면 Firebase CLI(firebase auth:export), Admin SDK, 또는 그 탭에 내보내기 버튼을 추가하는 브라우저 확장 프로그램이 필요합니다.
Firebase에서 모든 사용자의 이메일 목록을 얻으려면 어떻게 하나요?
사용자를 내보낸 뒤 이메일 열만 남기면 됩니다. Firexport의 무료 내보내기에서는 identifier 열에 콘솔에 보이는 값이 그대로 들어갑니다. 이메일이고, 전화번호로 로그인하는 사용자라면 전화번호입니다. Admin SDK 스크립트에서는 listUsers에서 user.email을 모읍니다.
내보낸 파일에 사용자의 비밀번호가 들어 있나요?
평문 비밀번호는 어떤 방법으로도 얻을 수 없습니다. Firebase가 비밀번호를 저장하지 않기 때문입니다. firebase auth:export에는 비밀번호 해시와 솔트가 들어 있고, firebase auth:import는 그것으로 비밀번호가 그대로 동작하게 사용자를 옮깁니다. Firexport는 해시를 전혀 읽지 않으며, Admin SDK는 추가 권한이 있을 때만 해시를 돌려줍니다.
사용자를 다른 Firebase 프로젝트로 옮기려면 어떻게 하나요?
원래 프로젝트에서 firebase auth:export users.json을 실행한 뒤, 새 프로젝트에서 --hash-algo=SCRYPT와 원래 프로젝트의 비밀번호 해시 매개변수(Password hash parameters)에 있는 해시 키, 솔트 구분자, 라운드, 메모리 비용을 넣어 firebase auth:import users.json을 실행합니다. Firexport나 스크립트로 만든, 해시가 없는 파일을 쓰면 비밀번호로 로그인하는 사용자가 모두 비밀번호를 재설정해야 합니다.
내보낸 파일을 Excel이나 Google Sheets에서 열 수 있나요?
네. 여기 나온 방법은 모두 CSV를 쓰고, 두 프로그램 모두 CSV를 엽니다. Firexport의 CSV와 스크립트의 CSV는 바이트 순서 표시(BOM)로 시작하므로 Excel이 어떤 언어의 이름도 제대로 읽습니다. BOM이 없는 CSV에서 이름이 깨져 보이면 데이터 > 텍스트/CSV에서(Data > From Text/CSV)로 가져오면서 파일 원본(File Origin)을 65001: 유니코드(UTF-8)로 설정하세요.
