Firebase Custom Claims 사용법: 관리자 권한 구분하기

2026.01.26·수정 2026.09.13·약 5분·작성: 해비·블로그 소개

학습 목표와 사전 지식

목표: 관리자 claim의 부여·전파·집행·회수를 서로 다른 단계로 설계합니다.
사전 지식: Firebase Auth ID token, Admin SDK 서버 환경, Security Rules

Custom Claims는 서버가 서명한 ID token에 담는 작은 권한 정보입니다. 화면의 isAdmin 값은 표시용이고 실제 허용은 Rules나 서버 verifyIdToken 이후에 결정합니다. 프로필 데이터나 비밀값을 claim에 넣지 않습니다.

권한을 부여할 수 있는 사람부터 정하기

다음 스크립트는 신뢰 관리자만 실행하는 서버 관리 도구입니다. 사용자가 UID를 보내면 누구나 claim을 부여하는 공개 API로 옮기면 안 됩니다. applicationDefault 자격 증명은 신뢰 실행 환경에서 공급하고 클라이언트 번들에 Admin SDK 키를 넣지 않습니다.

scripts/admin-role.mjs · 전체 관리 모듈; 실제 권한 변경 명령이므로 개발 사용자에 한해 실행

import { applicationDefault, initializeApp } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';

initializeApp({ credential: applicationDefault() });
const uid = process.env.TARGET_USER_UID;
const action = process.argv[2];
if (!uid || !['grant', 'revoke'].includes(action)) {
  throw new Error('대상 UID와 grant 또는 revoke가 필요합니다.');
}
const auth = getAuth();
const user = await auth.getUser(uid);
const claims = { ...(user.customClaims ?? {}) };
if (action === 'grant') claims.admin = true;
else delete claims.admin;
await auth.setCustomUserClaims(uid, claims);
if (action === 'revoke') await auth.revokeRefreshTokens(uid);
console.log('권한 변경 요청을 완료했습니다.');
관리자 역할을 Admin SDK에서 부여하고 ID token, Security Rules와 서버 검증으로 전달하는 흐름

덮어쓰기와 경쟁 조건

setCustomUserClaims는 전체 claim 객체를 교체합니다. 기존 객체를 복사하면 다른 키의 단순 누락은 막지만 두 관리 작업이 동시에 읽고 쓰는 경쟁까지 해결되지는 않습니다. 권한 변경을 한 서버 경로로 모으고 변경 주체·사유를 기록하세요. claim은 1000바이트 제한이 있고 접근 제어에 필요한 작은 값만 넣습니다.

토큰 전파와 즉시 회수를 혼동하지 않기

기존 ID token은 즉시 바뀌지 않습니다. 클라이언트가 getIdTokenResult(true)로 새 토큰을 받거나 재로그인해야 새 claim이 보입니다. revokeRefreshTokens는 기존 ID token을 모든 서비스에서 즉시 무효화하는 스위치가 아닙니다. 자체 API는 verifyIdToken(idToken, true)로 취소를 검사하고, Rules에는 필요한 경우 공식 문서의 취소 시각 검사 패턴을 별도로 설계합니다. 민감 권한의 즉시 회수에는 이 경계가 중요합니다.

서버 requireAdmin 함수 · 부분 예제; Admin 초기화와 HTTP 401/403 변환은 호출 서버에서 처리

import { getAuth } from 'firebase-admin/auth';

export async function requireAdmin(idToken) {
  const decoded = await getAuth().verifyIdToken(idToken, true);
  if (decoded.admin !== true) throw new Error('forbidden');
  return decoded.uid;
}
Firebase Custom Claims를 Firestore Rules와 백엔드 ID token 검증에서 강제하는 구조

개발 계정 세 개로 비교하기

비로그인·일반 사용자·관리자를 분리합니다. 일반 사용자가 자신의 프로필 role을 admin으로 바꾸더라도 관리자 API가 거부되어야 합니다. 관리자 부여 전·새 토큰 발급 후·회수 후를 나누고 기존 토큰을 재사용하는 경우도 검사합니다. claim이 없는 경우 false로 취급하며 브라우저 상태를 임의 변경해도 서버 권한은 달라지지 않아야 합니다.

직접 확인할 결과

관리 모듈 Node 문법 확인
부여/회수/기존 토큰 시나리오 기록
실제 관리자 계정·서버 검증 미실행

검증 범위와 기준일

공식 문서 확인일: 2026-09-13. 웹 SDK 예제는 모듈형 API 기준입니다. 이 글의 코드·구조 정적 검토와 실제 클라우드 인증·저장·배포 검증을 구분합니다. 본인 개발 Firebase 프로젝트의 실제 인증·권한·배포 요청은 이 편집 환경에서 실행하지 않았습니다.

이어서 학습하기

공식 문서

이 글이 도움이 되었나요?

조회 중

Firebase 학습 순서

필수 13개 · 전체 19개

읽음 기록 관리

전체 과정 목차 (19개)
  1. 필수 길잡이 · Firebase 실무 로드맵: Auth, Firestore, Storage, Functions
  2. 필수 학습 · Firebase 초기화 구조: Next.js firebase.ts 설계 기준
  3. 필수 학습 · Firebase Authentication 사용 기준: 로그인 유지와 비밀번호 재설정
  4. 필수 학습 · Firebase 보안 규칙 설계: Firestore와 Storage 권한 관리하기
  5. 필수 학습 · Firestore CRUD 사용법: 컬렉션 구조와 읽기 쓰기 흐름
  6. 필수 학습 · Firebase Auth Context 설계: 로그인 권한과 라우팅 관리하기
  7. 필수 학습 · Firebase Storage 이미지 업로드 사용법: 상품 이미지 관리 흐름 만들기
  8. 필수 학습 · Firebase Custom Claims 사용법: 관리자 권한 구분하기 현재 글
  9. 필수 학습 · Firebase Functions v2 사용법: 트리거 배포 Secret 처리
  10. 필수 학습 · Firestore seed data 설계: 리뷰 더미 데이터 구조 잡기
  11. 선택 참고 · Firebase 배포 제외 파일 설정: firebase.json의 ignore 사용법
  12. 선택 참고 · Firebase Firestore 인덱스 삭제 질문 해결: 배포 중 안전하게 판단하기
  13. 선택 참고 · Firebase Auth unauthorized-domain 오류 해결: 로그인 도메인 설정 확인
  14. 선택 참고 · Firebase permission-denied 오류 해결: Firestore Rules 체크리스트
  15. 선택 참고 · Firebase Storage 이미지 오류 해결: 403·404·token·Rules 확인법
  16. 선택 참고 · Firebase CORS 오류 해결: Storage 이미지 업로드가 막힐 때 확인할 설정
  17. 필수 선수 · Firebase 실무 오류 해결 모음: Storage, Firestore, Auth 체크리스트
  18. 필수 학습 · Firestore undefined 오류 해결: 선택 필드가 저장을 막을 때
  19. 필수 학습 · Firestore arrayUnion 중첩 배열 오류: 배열을 그대로 넘기면 실패하는 이유

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기