[TIL] Day 79 카카오 로그인 with Firebase Functions + Firestore 권한관리

현서·2026년 3월 20일

[TIL] Flutter 9기

목록 보기
91/102

카카오 로그인 with Firebase Functions + Firestore 권한관리


OIDC vs Functions 비용 비교

Firebase OIDCFirebase Functions
MAU 10,000 기준$150/월무료
무료 기준월 50명 이하연산 200,000초/월

→ MAU 50명 초과 시 Functions 방식이 압도적으로 유리


동작 흐름

1~4: 카카오 서버 → 앱으로 IdToken 발급
5~8: 앱 → Firebase Functions → IdToken 검증 → 커스텀 토큰 반환
9:   앱 → Firebase Auth → 커스텀 토큰으로 로그인

구현 핵심 흐름

1. Functions 세팅

npm install -g firebase-tools
firebase init functions        # 언어: TypeScript, enforce style: No
npm install jsonwebtoken jwks-rsa   # functions 폴더에서
  • Blaze 요금제 필수 (Functions 사용 조건)
  • serviceAccountKey.json → functions 폴더에 위치

2. 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와 일치하는지 확인
  • uid는 kakao{payload.sub} 형태로 prefix 붙임
  • 유저가 없으면 생성, 이미 있으면 uid-already-exists 에러 무시

3. Flutter 코드

// 카카오 로그인 → idToken → Functions 요청 → 커스텀 토큰 → Firebase 로그인
final customTokenResponse = await Client().post(
  Uri.parse('https://{functions-url}'),
  body: {'idToken': kakaoLoginResult.idToken},
);
await FirebaseAuth.instance.signInWithCustomToken(customToken);

4. 에러 대응

package.json에서 버전 충돌 시:

  • firebase-admin → major 12
  • typescript → major 5

Firestore 권한관리

FirebaseAuth 로그인 시 Firestore 요청에 인증 정보가 자동으로 포함됨 → Rules로 제어 가능

로그인된 사용자만 접근

allow read, write: if request.auth != null;

posts 컬렉션 - 내 글만 수정/삭제

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는 클라이언트 단에서 막는 게 아니라 서버 레벨 방어라 꼭 챙겨야 함

0개의 댓글