React

[TIL/React] 2023/08/02

Authentication in ReactJS Using Firebase ๐ŸŸ  ํ”„๋กœ์ ํŠธ์˜ ์ง„ํ–‰์„ ์œ„ํ•ด, ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ(Authentication)์— ๋Œ€ํ•œ ํ•™์Šต์€ ํ•„์ˆ˜๋ถˆ๊ฐ€๊ฒฐํ•˜๋‹ค. ์™ธ๊ตญ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ˆ„๋‹˜์˜ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. reference: https://w

2023๋…„ 8์›” 2์ผ2min read

Authentication in ReactJS Using Firebase ๐ŸŸ 

ํ”„๋กœ์ ํŠธ์˜ ์ง„ํ–‰์„ ์œ„ํ•ด, ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ(Authentication)์— ๋Œ€ํ•œ ํ•™์Šต์€ ํ•„์ˆ˜๋ถˆ๊ฐ€๊ฒฐํ•˜๋‹ค. ์™ธ๊ตญ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ˆ„๋‹˜์˜ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

reference: https://www.youtube.com/watch?v=Vv_Oi7zPPTw

src/App.js ๐ŸŸก

code
import React from "react";
import SignIn from "./components/auth/SignIn";
import SignUp from "./components/auth/SignUp";
import AuthDetail from "./components/AuthDetail";

function App() {
  return (
    <div>
      <SignIn />
      <SignUp />
      <AuthDetail />
    </div>
  );
}

export default App;

์ตœ์ƒ๋‹จ App ํŒŒ์ผ์—์„œ๋Š” SignIn, SignUp, AuthDetail ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ๋‹ค. ํฅ๋ฏธ์ง„์ง„ํ•˜๊ตฌ๋งŒ!

src/components/auth/SignIn.js ๐ŸŸก

code
import { signInWithEmailAndPassword } from "firebase/auth";
import React, { useState } from "react";
import { auth } from "../../firebase";

const SignIn = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const signIn = (e) => {
    e.preventDefault();
    signInWithEmailAndPassword(auth, email, password)
      .then((userCredential) => {
        console.log(userCredential);
      })
      .catch((error) => {
        console.log(error);
      });
  };
  return (
    <div>
      <form onSubmit={signIn}>
        <h1>Log In to your Account</h1>
        <input
          type="email"
          placeholder="Enter your email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        ></input>
        <input
          type="password"
          placeholder="Enter your password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
        ></input>
        <button>LogIn</button>
      </form>
    </div>
  );
};

export default SignIn;

SignIn ์ปดํฌ๋„ŒํŠธ๋Š” ์šฐ์„  'Log In to your Account'๋ผ๋Š” ์ œ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ ๋‘ ๊ฐœ์˜ input ํ•„๋“œ์™€ ํ•œ ๊ฐœ์˜ ๋ฒ„ํŠผ์„ ๋ณด์—ฌ์ค€๋‹ค. return ๋ถ€๋ถ„์€ ๋”ฑํžˆ ์–ด๋ ค์šด ์ ์ด ์—†๋‹ค. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋Š” ์ˆœ๊ฐ„ form ํƒœ๊ทธ์—์„œ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ signIn ํ•จ์ˆ˜์— event ๊ฐ์ฒด๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์ง„์งœ๋กœ? ใ…‡ใ…‡ console ์ฐ์–ด๋ด„!

signIn ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ๋จผ์ € preventDefault ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. form ์ œ์ถœ ์‹œ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

signInWithEmailAndPassword๋Š” firebase์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋‹ค. ์ด ํ•จ์ˆ˜๋Š” auth๋ผ๋Š” firebase์˜ ์ธ์ฆ ๊ฐ์ฒด์™€ email, password๋ฅผ ๋ฐ›์•„์„œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋Š” ํ•จ์ˆ˜์ธ๊ฐ€ ๋ณด๋‹ค. ๋‚˜๋Š” ๋งํ•˜๋Š” ๊ฐ์ž๋‹ˆ๊นŒ ์ผ๋‹จ ์ด ์ •๋„๋งŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

then์€ ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด์ฃผ์–ด์กŒ์„ ๋•Œ, 'userCredential' ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ์‹คํ–‰๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๋‹ค. 'userCredential' ๊ฐ์ฒด์—๋Š” ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

catch๋Š” ์—๋Ÿฌ๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ์ฝ˜์†”๋กœ ํ•ด๋‹น ์—๋Ÿฌ๋ฅผ returnํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.

์š”์•ฝ ๐ŸŸข

1. ์ œ๋ชฉ, input, button ๋ฆฌํ„ด 2. ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด onSubmit์— ์˜ํ•ด form์—์„œ ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ event ๊ฐ์ฒด๋กœ signIn ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋จ 3. signIn ํ•จ์ˆ˜์—์„œ๋Š” ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ฐฉ์ง€ํ•˜๊ณ  signInWithEmailAndPassword ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•จ 4. ์„ฑ๊ณตํ•˜๋ฉด userCredential์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ console์— returnํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด error๋ฅผ returnํ•จ

ํšŒ๊ณ  ๐Ÿ”ต

๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๋‚ด์ผ ์ •๋ฆฌํ•˜๊ณ , ์‹œ๊ฐ„์ด ํ—ˆ๋ฝํ•˜๋ฉด crud์— ๊ด€ํ•œ ์ž๋ฃŒ๋ฅผ ํ•™์Šตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ด๋ฒˆ์— ์ž˜ํ•˜๋ƒ ๋ชป ํ•˜๋ƒ ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๊ธฐํšŒ๊ฐ€ ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๋ฒˆ ๋” ์žˆ๋‹ค๋ฉด ๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ง€๊ธˆ ์ž˜ํ•˜๋ƒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€๊ธˆ ์ž๋ผ๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ”๊นฅ์„ธ์ƒ์—์„œ๋Š” ํ•œ ๋ฒˆ์˜ ํŒ๊ฐ€๋ฆ„์œผ๋กœ ๋‚˜์˜ ๋ฏธ๋ž˜๊ฐ€, ์šฐ๋ฆฌ์˜ ๋ฏธ๋ž˜๊ฐ€ ๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค๋Š” ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๋ฒˆ์˜ ๋ˆ„์  ์œ„์— ์„œ์„œํžˆ ์ •ํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

-ํ•จ๊ป˜ ์ž๋ผ๊ธฐ: ์• ์ž์ผ๋กœ ๊ฐ€๋Š” ๊ธธ ไธญ

More to read

Amazon VPC

Amazon VPC Architecture ์ดํ•ดํ•˜๊ธฐ

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์—์„œ ๋ฌด์—‡์„ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ๋Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.ํ•œ๋•Œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ชจ๋“  ์„ค๊ณ„์˜ ์ถœ๋ฐœ์ ์ด๋ผ๊ณ  ๋ฏฟ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ €๊ฐ€ ๋ฌด์—‡์„ ๋ณด๊ณ , ์–ด๋–ค ํ๋ฆ„์—์„œ ๋จธ๋ฌด๋ฅด๊ณ  ์ดํƒˆํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ

'์›์‚ฌ์ดํŠธ'

ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดํ•ดํ•˜๊ธฐ

์˜ค๋žœ๋งŒ์— ๋ฐฉ๋ฒ•๋ก ์— ๊ด€ํ•œ ๊ธ€์„ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ์ƒํ™ฉ์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค. SSAFY์—์„œ๋Š” ํ•˜๋ฃจ์— ์—„์ฒญ๋‚œ ์–‘์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์„ ๊ณผ์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ, '๊ตฌํ˜„๋ ฅ'์ด ๋งค์šฐ ๋–จ์–ด์ง„๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์–ด๋ ค์šด ๋ฌธ์ œ๋ผ๋ฉด '์•„์‰ฌ์›€'์ด๋ผ๋Š” ๊ฐ์ •์กฐ์ฐจ ๋А๋ผ์ง€

Subnet

VPC ์„ค๊ณ„์˜ ์‹œ์ž‘: IP์™€ Subnet

๋ฐ˜๋ณต๋˜๋Š” ๋ฃจํ‹ด ์†์—์„œ ์–ป์€ ์•ˆ์ •๊ฐ์„ ๋ฐœํŒ ์‚ผ์•„, ์ด์ œ๋Š” ๊ธฐ์ˆ ์  ์ŠคํŽ™ํŠธ๋Ÿผ์„ ๋„“ํžˆ๊ธฐ ์œ„ํ•œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ์ฐฉ์ˆ˜ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•œ ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์ถ•์„ ๋„˜์–ด, ์‹ค์ œ ์„œ๋น„์Šค ์ˆ˜์ค€์˜ ๋ธ”๋กœ๊ทธ ์‹œ์Šคํ…œ ๊ตฌํ˜„๊ณผ ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ ์ ์šฉ ๋“ฑ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์—ญ๋Ÿ‰์„ ํ•œ ๋‹จ๊ณ„