| Firebase OIDC | Firebase Functions | |
|---|---|---|
| MAU 10,000 기준 | $150/월 | 무료 |
| 무료 기준 | 월 50명 이하 | 연산 200,000초/월 |
→ MAU 50명 초과 시 Functions 방식이 압도적으로 유리
1~4: 카카오 서버 → 앱으로 IdToken 발급
5~8: 앱 → Firebase Functions → IdToken 검증 → 커스텀 토큰 반환
9: 앱 → Firebase Auth → 커스텀 토큰으로 로그인
npm install -g firebase-tools
firebase init functions # 언어: TypeScript, enforce style: No
npm install jsonwebtoken jwks-rsa # functions 폴더에서
serviceAccountKey.json → functions 폴더에 위치// IdToken 검증 → Firebase uid 생성 → 커스텀 토큰 발급
export const kakaoLogin = onRequest(async (request, response) => {
const idToken = request.body["idToken"];
const uid = await verifyKakaoIdToken(idToken); // 카카오 공개키로 검증
const customToken = await createUserAndCustomtoken(uid); // Firebase 커스텀 토큰 발급
response.send(customToken);
});
jwks-rsa로 카카오 공개키 가져와서 IdToken 서명 검증payload.aud가 내 앱 NativeAppKey와 일치하는지 확인kakao{payload.sub} 형태로 prefix 붙임uid-already-exists 에러 무시// 카카오 로그인 → idToken → Functions 요청 → 커스텀 토큰 → Firebase 로그인
final customTokenResponse = await Client().post(
Uri.parse('https://{functions-url}'),
body: {'idToken': kakaoLoginResult.idToken},
);
await FirebaseAuth.instance.signInWithCustomToken(customToken);
package.json에서 버전 충돌 시:
firebase-admin → major 12typescript → major 5FirebaseAuth 로그인 시 Firestore 요청에 인증 정보가 자동으로 포함됨 → Rules로 제어 가능
allow read, write: if request.auth != null;
allow read: if true;
allow create: if request.auth.uid == request.resource.data.uid; // 파라미터 변조 방지
allow update, delete: if request.auth.uid == resource.data.uid; // 본인 글만
OIDC는 구현이 단순하지만 MAU 늘어나면 비용이 바로 나옴
Functions 방식은 초기 세팅이 조금 더 있지만 무료 구간이 넓어서 실서비스엔 이쪽이 맞는 선택
Firestore Rules는 클라이언트 단에서 막는 게 아니라 서버 레벨 방어라 꼭 챙겨야 함