본문 바로가기

일::개발

Flutter: Firebase를 이용한 사용자 인증 (1)

이전 프로젝트에서는 사용자 인증에 Firebase를 사용하지 않았다.

Custom Backend 에서 별도로 사용자의 부가 정보를 관리해야 할 필요가 있었고, 백엔드에서 사용하는 legacy 회원 정보 테이블과 Firebase의 사용자 정보 간 동기화 문제 등등 복잡함이 예상되는 부분이 있어서 Firebase를 사용하지 않고, 개별 플랫폼 (이메일/암호, 구글, 애플, 네이버, 카카오)에 각각 연동해서 인증 정보를 받아오는 방식으로 구현했다.

 

이렇게 해도 큰 어려움은 없었는데, 사실 제일 복잡한 부분은 인증 공급자의 인증을 거친 사용자가 백엔드에 REST API로 요청할 때 어떻게 인증할 것인가 하는 문제였다.

 

인증 공급자별로 제대로 된 인증을 거친 사용자인지 다시 확인해야 했는데, 자세한 내용은 설명하지 않지만, 이게 아주 귀찮았다.

 

그래서 다음 프로젝트는 인증에 Firebase Auth를 사용하기로 했다.

 

요구사항은 구글, 애플, 네이버, 카카오 인증 제공. 이메일 가입은 필요 없음. 백엔드 시스템에 사용자 연관 정보 테이블은 존재하지만 사용자 테이블은 별도로 관리하지 않음.

 

Flutter 앱과 별도의 백엔드 시스템을 개발할 때 Firebase Auth 를 사용하면 가장 편리한 점은 

백엔드에서 API를 호출하는 클라이언트가 인증을 거친 유효한 상태인지 간단히 검증할 수 있다는 것이다.

 

사실 프로바이더 연동은 어차피 Firebase 안 써도 크게 어렵지 않고, Firebase에서 기본 제공하지 않는 것들 (네이버, 카카오)은 어차피 복잡하기 때문에 크게 장점이 없다고 생각한다.

 

하지만 백엔드에서의 인증은 백엔드쪽 손을 크게 줄여준다. (백엔드 개발자에게 일이 몰리는 경우에 중요한 부분이다.)

 

상세한 내용은 다음에 다루기로 하고,

일단 이번에는 Firebase Auth 를 사용하기 전에 알아둬야 할 것을 좀 정리해두기로 한다.

 

지원하는 인증 방식

1. Firebase 는 이메일/암호 방식을 지원한다.

여기에는 이메일 주소 확인 메일 발송, 가입 확인 메일 등의 기능이 포함되어 있기 때문에, 별도의 메일 발송 서버를 준비하지 않아도 되는 장점이 있다. 이번 프로젝트에는 이메일 가입이 빠지므로 일단 가능하다 까지만 하고 패스

 

2. 구글, 애플, 페이스북, 트위터, 깃헙은 Firebase가 기본 지원한다.

기본 지원한다고 해도 모든 것이 다 되어 있는 것은 아니고, 구글 외에는 경우에 따라 플랫폼 설정이나 별도의 웹 백엔드를 만들 필요가 있다.

 

3. 전화번호로 인증

된다는데 안 써봤다.

 

4. 커스텀 인증 시스템

내 프로젝트에 필요한 네이버나 카카오의 경우는 Firebase Auth와의 연동을 구현해야 한다. Firebase DB같은 FIrebase Service에 사용자 접근 권한을 줄 필요가 있으면 꼭 필요한데, 사실 그게 아니라 인증만 사용하는 경우라면 굳이 Firebase Auth와 연동해야만 하는 것은 아니다. 위에서 설명했듯이 백엔드와의 간편한 연동을 위해 Firebase의 커스텀 인증을 사용했다.

 

5. 익명 인증

로그인 하지 않은 사용자의 정보를 관리하다가 나중에 인증하면 새로 만든 계정에 연결할 수 있는데, 이것도 이번에는 사용하지 않기로 함

 

사용자

Firebase에서 사용자(user)는 내 서비스에 등록한 계정을 나타낸다.

Firebase가 제공하는 사용자 레코드는 꽤(너무) 심플한데, unique id, primary email, name, photo URL 이 전부이다.

사용자와 관련된 다른 필드를 저장할 필요가 있으면 별도로 관리해야 한다.

Firebase 가 지원하는 플랫폼을 통해 사용자 계정을 만들면 플랫폼에서 제공하는 정보로 위의 필드가 채워지지만, 이메일이나 커스텀 공급자를 연동하는 경우에는 (당연히) 정보를 받아와서 수동으로 넣어줘야 한다.

 

추가로 Firebase이 User 객체는 인증을 제공한 공급자의 리스트도 가지고 있다.

공급자의 리스트임을 잘 기억하자. 하나의 사용자는 여러 개의 공급자와 1:N으로 매칭될 수 있다.

 

인증 토큰

잘 알아둬야 하는 내용이다. Firebase 인증과 관련해서 3가지 인증 토큰이 등장하는데 각각에 대한 설명은 여기에 있고, 간단하게 정리하면 다음과 같다.

 

1. Firebase ID token

사용자가 인증을 거치면 Firebase가 생성한다. 사인된 JWT 형식이기 때문에 API 호출할 때 이 토큰을 전달하면 백엔드는 이 토큰을 검증하여 FIrebase 인증된 사용자임을 확인할 수 있다.

2. Identity provider token

구글, 애플처럼 Firebase와 연동된 공급자가 생성하는 토큰. 대부분 OAuth 2.0 Access Token 이고, 앱에서 이 토큰을 이용해서 사용자가 공급자 인증을 정상적으로 거쳤음을 확인할 수 있고, 이 토큰을 이용해서 Firebase 인증을 진행할 수 있다.

3. Firebase custom token

custom 공급자를 연동할 때 공급자가 생성하는 토큰으로 이 토큰을 이용해서 Firebase 인증을 진행한다. JWT 형식이어야 함.

 

결국, 2번이나 3번을 이용해서 Firebase 인증한 후에 만들어지는 1번을 이용해서 백엔드 인증을 처리하면 되는 것이다.

 

 

다음에는

'확인된 이메일'

'사용자 객체 생성'

'하나의 사용자에 다수의 공급자 연결'