๐ŸŒŸ Firebase Auth: ๊ณ„์ • ๋งŒ๋“ค๊ณ  ๋กœ๊ทธ์ธ ํ•˜๊ธฐ

summereuna๐Ÿฅยท2022๋…„ 3์›” 28์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
7/42

firebase.auth์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฒˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ๋กœ๊ทธ์ธํ•˜๊ธฐ


๐ŸŽฏ ๋ชฉํ‘œ

์ด๋ฉ”์ผ๊ณผ ๋น„๋ฒˆ์„ ์‚ฌ์šฉํ•˜๋Š” firebase.auth์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ๋กœ๊ทธ์ธ ํ•ด๋ณด์ž!

firebase.auth > Auth์— ๊ฐ€๋ฉด ๋งŽ์€ auth provider๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ(facebook provider, google provider, github provider...etc.) EmailAuthProvider(์ด๋ฉ”์ผ ์–ด์Šค ํ”„๋กœ๋ฐ”์ด๋”)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ํŒจ์Šค์›Œ๋“œ๋กœ ์ƒˆ๋กœ์šด ์œ ์ € ๊ณ„์ • ๋งŒ๋“ค๊ณ , ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. createUserWithEmailAndPassword()๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ๊ณ„์ • ๋งŒ๋“ค๊ธฐ

์‚ฌ์šฉ์ž๊ฐ€ ์–‘์‹์„ ์ž‘์„ฑํ•˜๋ฉด, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ฑฐ์ณ createUserWithEmailAndPassword ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

โœ… createUserWithEmailAndPassword() ๋ฉ”์„œ๋“œ

createUserWithEmailAndPassword()๋Š” firebase์˜ Auth ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ ๋ฐ ์•”ํ˜ธ์™€ ์—ฐ๊ฒฐ๋œ ์ƒˆ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ด ์‚ฌ์šฉ์ž๋„ ์•ฑ์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ„์ •์ด ์ด๋ฏธ ์žˆ๊ฑฐ๋‚˜ ์•”ํ˜ธ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๋งŒ๋“ค์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด ๋ฉ”์„œ๋“œ๋Š” promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— await์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

v.9์—์„œ createUserWithEmailAndPassword()๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ๊ณ„์ • ๋งŒ๋“ค๊ธฐ

import { getAuth, createUserWithEmailAndPassword } from "firebase/auth";
//
const auth = getAuth();
createUserWithEmailAndPassword(auth, email, password)
  .then((userCredential) => {
    // Signed in 
    const user = userCredential.user;
    // ...
  })
  .catch((error) => {
    const errorCode = error.code;
    const errorMessage = error.message;
    // ..
  });

2. signInWithEmailAndPassword() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ํ•˜๊ธฐ

โœ… signInWithEmailAndPassword() ๋ฉ”์„œ๋“œ

signInWithEmailAndPassword()๋Š” firebase์˜ Auth ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์ด๋ฉ”์ผ ๋ฐ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ์•”ํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์ด ๋ฉ”์„œ๋“œ๋Š” promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— await์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

v.9์—์„œ signInWithEmailAndPassword()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ํ•˜๊ธฐ

import { getAuth, signInWithEmailAndPassword } from "firebase/auth";
//
const auth = getAuth();
signInWithEmailAndPassword(auth, email, password)
  .then((userCredential) => {
    // Signed in 
    const user = userCredential.user;
    // ...
  })
  .catch((error) => {
    const errorCode = error.code;
    const errorMessage = error.message;
  });

3. ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ๋กœ๊ทธ์ธ ํ•ด๋ณด์ž.

1. ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“œ๋Š” useState๋ฅผ ๋งŒ๋“ค๊ณ , ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉด ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋Œ€์‹  ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ

const Auth = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  //๐Ÿ”ฅ ์ƒˆ๋กœ์šด ๊ณ„์ • ๋งŒ๋“ค๊ธฐ
  const [newAccount, setNewAccount] = useState(true);
  
  //์ƒ๋žต
  
     {/*๐Ÿ”ฅ ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉด ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋Œ€์‹  ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ*/}
        <input type="submit" value={newAccount ? "Create Account" : "Login"} />
      </form>

2. ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ž„ํฌํŠธํ•˜๊ธฐ

//๐Ÿ”ฅ ์ด๋ฉ”์ผ, ๋น„๋ฒˆ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๋กœ๊ทธ์ธ ํ•˜๊ธฐ์œ„ํ•ด ์•„๋ž˜ ๋ฉ”์„œ๋“œ ์ž„ํฌํŠธํ•˜๊ธฐ
import {
  getAuth,
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
} from "firebase/auth";

3. getAuth()๋ฅผ auth๋กœ ๋ช…๋ช…

//๐Ÿ”ฅ getAuth()๋ฅผ auth๋กœ ๋ช…๋ช…
  const auth = getAuth();

4. form submitํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” onSubmit ํ•ธ๋“ค๋Ÿฌ์— ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

newAccount์˜ state๋กœ newAccount๊ฐ€ ์ฐธ์ด๋ฉด ์ƒˆ๋กœ์šด ๊ณ„์ •์„ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฑฐ์ง“์ด๋ฉด ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

//form์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  //๐Ÿ”ฅ createUserWithEmailAndPassword() ๋ฉ”์„œ๋“œ์™€ signInWithEmailAndPassword()๋ฉ”์„œ๋“œ๊ฐ€ promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— async await์„ ์‚ฌ์šฉํ•˜์ž!
  const onSubmit = async (event) => {
    event.preventDefault();
    //๐Ÿ”ฅ form submitํ•˜๋ฉด newAccount ์Šคํ…Œ์ดํŠธ๋กœ ํ™•์ธํ•˜์ž!
    //๐Ÿ”ฅ newAccount๊ฐ€ ์ฐธ์ด๋ฉด ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , ๊ฑฐ์ง“์ด๋ฉด ๋กœ๊ทธ์ธํ•˜๊ธฐ
    //๐Ÿ”ฅ๐Ÿ”ฅ ๊ทธ๋ฆฌ๊ณ  ํŠธ๋ผ์ด ์บฃ์น˜ ๊ตฌ๋ฌธ ์‚ฌ์šฉํ•ด์„œ ํ˜น์‹œ ๋ชจ๋ฅผ ์˜ค๋ฅ˜๋ฅผ ๋Œ€๋น„ํ•˜์ž.
    try {
      //๐Ÿ”ฅ ์–ป๊ฒŒ๋˜๋Š” dataํ™•์ธ ์œ„ํ•ด data๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •ํ•˜๊ณ  newAccount๊ฐ€ ์ฐธ์ผ ๋• data์— ๊ณ„์ •์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋„ฃ๊ณ ,
      //newAccount๊ฐ€ ๊ฑฐ์ง“์ผ ๋• data์— ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋„ฃ์ž.
      let data;
      if (newAccount) {
        //๐Ÿ”ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ auth, email, password๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.
        data = await createUserWithEmailAndPassword(auth, email, password);
      } else {
        data = await signInWithEmailAndPassword(auth, email, password);
      }
      console.log(data);
    } catch (error) {
      console.log(error);
    }
  };

๐Ÿ“ Auth.js ์ตœ์ข… ์ฝ”๋“œ

//๐Ÿ”ฅ ์ด๋ฉ”์ผ, ๋น„๋ฒˆ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๋กœ๊ทธ์ธ ํ•˜๊ธฐ์œ„ํ•ด ์•„๋ž˜ ๋ฉ”์„œ๋“œ ์ž„ํฌํŠธํ•˜๊ธฐ
//๐Ÿ”ฅ getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword
import {
  getAuth,
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
} from "firebase/auth";

import { useState } from "react";

const Auth = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  //๐Ÿ”ฅ ์ƒˆ๋กœ์šด ๊ณ„์ • ๋งŒ๋“ค๊ธฐ
  const [newAccount, setNewAccount] = useState(true);
  //๐Ÿ”ฅ getAuth()๋ฅผ auth๋กœ ๋ช…๋ช…
  const auth = getAuth();
  //email, password์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  const onChange = (event) => {
    const {
      target: { name, value },
    } = event;
    if (name === "email") {
      setEmail(value);
    } else if (name === "password") {
      setPassword(value);
    }
  };
  //form์— ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ
  //c๐Ÿ”ฅ reateUserWithEmailAndPassword() ๋ฉ”์„œ๋“œ์™€ signInWithEmailAndPassword()๋ฉ”์„œ๋“œ๊ฐ€ promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— async await์„ ์‚ฌ์šฉํ•˜์ž!
  const onSubmit = async (event) => {
    event.preventDefault();
    //๐Ÿ”ฅ form submitํ•˜๋ฉด newAccount ์Šคํ…Œ์ดํŠธ๋กœ ํ™•์ธํ•˜์ž!
    //๐Ÿ”ฅ newAccount๊ฐ€ ์ฐธ์ด๋ฉด ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , ๊ฑฐ์ง“์ด๋ฉด ๋กœ๊ทธ์ธํ•˜๊ธฐ
    //๐Ÿ”ฅ๐Ÿ”ฅ ๊ทธ๋ฆฌ๊ณ  ํŠธ๋ผ์ด ์บฃ์น˜ ๊ตฌ๋ฌธ ์‚ฌ์šฉํ•ด์„œ ํ˜น์‹œ ๋ชจ๋ฅผ ์˜ค๋ฅ˜๋ฅผ ๋Œ€๋น„ํ•˜์ž.
    try {
      //๐Ÿ”ฅ ์–ป๊ฒŒ๋˜๋Š” dataํ™•์ธ ์œ„ํ•ด data๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •ํ•˜๊ณ  newAccount๊ฐ€ ์ฐธ์ผ ๋• data์— ๊ณ„์ •์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋„ฃ๊ณ ,
      //newAccount๊ฐ€ ๊ฑฐ์ง“์ผ ๋• data์— ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋„ฃ์ž.
      let data;
      if (newAccount) {
        //๐Ÿ”ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ auth, email, password๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.
        data = await createUserWithEmailAndPassword(auth, email, password);
      } else {
        data = await signInWithEmailAndPassword(auth, email, password);
      }
      console.log(data);
    } catch (error) {
      console.log(error);
    }
  };
  return (
    <div>
      <h1>๋กœ๊ทธ์ธ ํŽ˜์ด์ง€</h1>
      <p>๋กœ๊ณ  ๋„ฃ๊ธฐ</p>
      <form onSubmit={onSubmit}>
        <input
          type="email"
          placeholder="Email"
          required
          value={email}
          name="email"
          onChange={onChange}
        ></input>
        <input
          type="password"
          placeholder="Password"
          required
          value={password}
          name="password"
          onChange={onChange}
        ></input>
        {/*๐Ÿ”ฅ ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉด ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋Œ€์‹  ๊ณ„์ • ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ*/}
        <input type="submit" value={newAccount ? "Create Account" : "Login"} />
      </form>
      <div>
        <button>Continue with Google</button>
        <button>Continue with GitHub</button>
      </div>
    </div>
  );
};

export default Auth;

๊ฒฐ๊ณผ

์œ ํ›„~! ^3^~
์ƒˆ๋กœ์šด ๊ณ„์ •์ด ๋งŒ๋“ค์–ด ์กŒ๊ณ  ๋กœ๊ทธ์ธ๋„ ๋˜์–ด ์žˆ๋‹ค.

4. setPersistence() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•ด ์œ ์ € ๊ธฐ์–ตํ•˜๊ธฐ

โœ… setPersistence() ๋ฉ”์„œ๋“œ

setPersistence() ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ธฐ์–ตํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒํ•ด์ค€๋‹ค.

  • ํ˜„์žฌ ์ €์žฅ๋œ Auth ์„ธ์…˜์˜ Auth ์ธ์Šคํ„ด์Šค(์‚ฌ๋ก€)์—์„œ ์ง€์†์„ฑ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์š”์ฒญ์„ ์‚ฌ์šฉํ•œ ์‚ฌ์ธ์ธ์„ ํฌํ•จํ•˜์—ฌ ํ–ฅํ›„ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ์ด ์œ ํ˜•์˜ ์ง€์†์„ฑ์„ ์ ์šฉํ•œ๋‹ค.

  • ์ด๊ฒƒ์— ์˜ํ•ด, ์œ ์ €๋Š” ์„œ๋ช…ํ•˜๊ณ  ์žˆ๋Š” ์œ ์ €์˜ ์„ธ์…˜์˜ ๊ธฐ์–ต ์—ฌ๋ถ€๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๊ธฐ๋ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Auth ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

  • React Native ์•ฑ๊ณผ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ดˆ๊ธฐ ๊ฐ’์€ local์ด๋‹ค.

    value์„ค๋ช…
    local๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ๋”๋ผ๋„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ์–ต
    sessionํƒญ(tab)์ด ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ์—๋งŒ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ์–ต
    none์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Œ(๋กœ๊ทธ์ธ์€ ๋˜์ง€๋งŒ ํŽ˜์ด์ง€ ์ƒˆ๊ณ ํ•˜๋ฉด ๋กœ๊ทธ์•„์›ƒ๋˜์„œ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•จ)

์ธ์ŠคํŽ™์…˜์—์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

  • Inspection > Application > IndexedDB > firebaseLocalStorageDb๋กœ ๊ฐ€๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ๋ณด์ธ๋‹ค.

  • ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋Š” ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, firebase๊ฐ€ ์ ‘์†ํ•œ ์œ ์ €๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค. ์˜ค์ผ€์ด ใ…‡ใ…‡!

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€