ํ”„๋กœ์ ํŠธ

[Firebase] ์ธ์ฆ ์ƒํƒœ ์œ ์ง€, ์ ‘๊ทผ ๋ณดํ˜ธ

Yuuuki 2024. 6. 27. 13:49

๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€

 

๋กœ๊ทธ์ธ ์ƒํƒœ ์ „์—ญ ๊ด€๋ฆฌ

firebase๋Š” ๋กœ๊ทธ์ธ์ด๋‚˜ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ฉด, ์ด์™€ ๊ฐ™์ด user์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
์ด ์œ ์ € ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ƒํƒœ์™€, ํ”„๋กœํ•„, ๋ณธ์ธ์˜ ๊ฒŒ์‹œ๊ธ€/๋Œ“๊ธ€ ์—ฌ๋ถ€๊ฐ™์€ ์ž‘์—…๋“ค์„ ํ• ๊ฒƒ์ด๋ฏ€๋กœ ์ „์—ญ(zustand)์œผ๋กœ user์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
์ฒ˜์Œ์—” ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒํ•ด๋„ ์ „์—ญ ์ƒํƒœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก, zustand์˜ persist ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ localStorage์— ๋‹ด์•„ ์ด ๋กœ๊ทธ์ธ ์ƒํƒœ(์œ ์ € ์ •๋ณด ์กด์žฌ ์—ฌ๋ถ€)๋ฅผ ์œ ์ง€๊ฐ€ ๋˜๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ฐพ์•„๋ณด๋‹ˆ firebase ์ธ์ฆ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ์ธ์ฆ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ด ์ธ์ฆํ† ํฐ์˜ ์‹œ๊ฐ„์ด ์•ฝ 1์‹œ๊ฐ„ ์ •๋„์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ์— ์‹คํŒจํ•˜๋ฉด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์—๋Š” ๋กœ๊ทธ์ธ์ƒํƒœ์ด์ง€๋งŒ, ์‹ค์งˆ์ ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
๋˜ํ•œ, ์•Œ์•„๋ณด๋‹ˆ firebase์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ธ์ฆ ์ƒํƒœ๋ฅผ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ persist๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. onAuthStateChanged โœ…
onAuthStateChanged๋Š” ์ธ์ฆ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํƒœ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ์ธ์ฆ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
๋˜ํ•œ, ๋งŒ๋ฃŒ๋œ ์ธ์ฆ ํ† ํฐ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋˜๋ฉด onAuthStateChanged ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ null๋กœ ์ „๋‹ฌ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

2. firebase JS SDK๋กœ ์ธ์ฆ์ƒํƒœ ์œ ์ง€ ๋ฐฉ์‹ ์ง€์ •ํ•˜๊ธฐ

 

  • local : ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒํ•  ๋•Œ๊นŒ์ง€ ๋ฌด๊ธฐํ•œ ์œ ์ง€ํ• ์ง€ → ์ž๋™ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ?!
  • session : ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ์ƒํƒœ๋ฅผ ์‚ญ์ œ → ๋กœ๊ทธ์ธ ์œ ์ง€

 

useAuthํ›…์œผ๋กœ ๊ถŒํ•œ ์ œ์–ด ๋ฐ ๋ณดํ˜ธ

์œ ์ € ํ”„๋กœํ•„์ด๋‚˜ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •ํŽ˜์ด์ง€๊ฐ™์€ ๊ฒฝ์šฐ, ๋ณธ์ธ์ด ์•„๋‹Œ ํƒ€์ธ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
 
  • profile update : /profiles/update/:userId
  • post update : /posts/update/:postId
 
route ๊ฒฝ๋กœ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, userId, postId๋งŒ ์•Œ์•„๋‚ธ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ํƒ€์ธ์ด ์ˆ˜์ •ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.
 
๐Ÿ‘‰๐Ÿป userId์™€ ๋กœ๊ทธ์ธํ•œ user์˜ id๊ฐ’์„ ๋น„๊ตํ•ด์„œ ์ผ์น˜ํ•˜์ง€ ์•Š๋‹ค → ์ ‘๊ทผ์ œํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
๐Ÿ”’ firebase์˜ ๋ณด์•ˆ๊ทœ์น™์„ ํ†ตํ•ด, 2์ฐจ์ ์œผ๋กœ DB์˜ write ๊ถŒํ•œ์„ ๋ง‰์„์ˆ˜๋„ ์žˆ๋‹ค.
 
 
type CheckPermission = (user: User) => boolean;

export const useAuth = (checkPermission?: CheckPermission) => {
  const { user, loading } = useAuthStore();
  const navigate = useNavigate();

  useEffect(() => {
    if (!loading) {
      if (!user) {
        navigate(PATHS.logIn);
      } else if (checkPermission && !checkPermission(user)) {
        toast.error("์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.");
        navigate(-1);
      }
    }
  }, [loading, user, navigate, checkPermission]);

  return { user, loading };
};