해당 글은 프론트엔드를 공부하면서 기록 목적으로 작성한 내용입니다.
잘못된 내용이 있다면 제보 부탁드립니다. 🙇♂️
오늘은 미니 프로젝트를 진행하면서 Firebase
를 이용한 로그인, 회원가입, 로그아웃 기능을 구현한 내용에 대해 기록을 남기고자 한다.
.src
├── App.css
├── App.js
├── components
│ ├── Footer.js
│ ├── Header.js
│ └── index.js
├── elements
│ ├── Button.js
│ ├── Grid.js
│ ├── Input.js
│ ├── Text.js
│ └── index.js
├── index.css
├── index.js
├── pages
│ ├── Home.js
│ ├── Login.js
│ ├── Post.js
│ ├── SignUp.js
│ └── index.js
├── redux
│ ├── actions
│ │ └── authAction.js
│ ├── configureStore.js
│ └── reducers
│ ├── authReducer.js
│ └── index.js
├── result.md
└── shared
├── Cookie.js
├── Permit.js
└── firebase.js
src/shared/firebase.js
import firebase from "firebase/app";
import "firebase/auth";
const firebaseConfig = {
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_FIREBASE_APP_ID,
};
firebase.initializeApp(firebaseConfig);
export const apiKey = firebaseConfig.apiKey;
export const authService = firebase.auth();
src/redux/configureStore.js
import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";
import thunk from "redux-thunk";
import rootReducer from "./reducers";
import { history } from "./reducers";
let store = createStore(
rootReducer,
composeWithDevTools(
applyMiddleware(thunk.withExtraArgument({ history: history }))
)
);
export default store;
src/redux/reducers/index.js
import { combineReducers } from "redux";
import authReducer from "./authReducer";
import { createBrowserHistory } from "history";
import {connectRouter} from "connected-react-router";
export const history = createBrowserHistory();
export default combineReducers({
auth: authReducer,
router: connectRouter(history),
});
상세 코드 확인하기
https://github.com/Kyoo130/fitgoing/tree/main/src/redux
firebase.js
에 만들어둔 authService
가져오기signUpFB
회원가입 함수 만들기authService.createUserWithEmailAndPassword()
로 회원가입 시키기SignUp.js
컴포넌트에서 signUpFB
를 호출하기display_name
업데이트하기user
정보 업데이트 후 메인 페이지'/'
로 이동하기firebase.js
에 만들어둔 authService
가져오기loginFB
로그인 함수 만들기authService.signInWithEmailAndPassword()
로 로그인 시키기Login.js
컴포넌트에서 loginFB
를 호출하기user
정보 업데이트 후 메인 페이지'/'
로 이동하기firebase.js
에 만들어둔 auth
가져오기logOutFB
로그인 함수 만들기authService.signOut()
로 로그아웃 시키기Header.js
컴포넌트에서 logOutFB
를 호출하기is_login
정보 업데이트 후 메인 페이지'/'
로 이동하기위 방법을 통해 회원가입, 로그인, 로그아웃 기능을 구현하였지만,
로그인 후 새로고침 시 로그인 정보가 유지가 안되는 문제가 발생하였다.
이 문제를 해결하기 위해 Firebase 공식 문서를 찾아보니,
local
과 session
을 이용하여 인증 상태를 유지하는 방법을 찾았다.
하지만, local
의 경우 브라이저를 닫아도 인증 상태가 유지되고, 사용자가
직접 로그아웃 버튼을 눌러 인증 정보를 삭제해야하기 때문에 적합하지 않았고,
session
의 경우 현재의 세션이나 탭에서만 상태가 유지되며, 사용자가 직접
로그아웃을 하거나, 브라우저를 닫으면 인증 정보가 삭제되므로 이를 선택하였다.
Firebase 공식 문서 참고
https://firebase.google.com/docs/auth/web/auth-state-persistence?hl=ko&authuser=0
firebase.js
에 만들어둔 authService
가져오기loginFB
로그인 함수 만들기authService.setPersistence(firebase.auth.Auth.Persistence.SESSION)
로 세션 정보 생성authService.signInWithEmailAndPassword()
로 로그인 시키기Login.js
컴포넌트에서 loginFB
를 호출하기user
정보 업데이트 후 메인 페이지'/'
로 이동하기logInCheckFB
로그인 체크 함수 만들기user
정보가 있을 경우 onAuthStateChanged()
로 사용자 정보 업데이트user
정보가 없을 경우 로그아웃 함수 호출useEffect
를 활용하여 session
체크 후 logInCheckFB
호출session
정보가 있을 경우 Header.js
로그아웃 버튼만 노출 시키기상세 코드 확인하기
https://github.com/Kyoo130/fitgoing/blob/main/src/redux/actions/authAction.js
회원가입, 로그인, 로그아웃 기능을 기존에도 구현해 봤지만, 새로운 프로젝트를 시작할 때마다 새롭게 느껴지고, 특히 이번에는 로그인 유지 뿐만 아니라, 처음 session
대신 cookie
를 사용하였는데, history
가 정상적으로 작동되지 않아 여러번 코드를 뜯어고치면서 문제를 해결하였다.
역시, 끝까지 문제를 물고 늘어지니 시간이 걸릴 뿐, 안되는 일은 없는 것 같다!
아직 미니 프로젝트가 끝난 게 아니니 다음 난관에 부딪혀 보자!