๐Ÿ“œ authentication ํšŒ๊ณ ๋ก

๊น€์ฒ ์ค€ยท2022๋…„ 2์›” 16์ผ
0

ํšŒ๊ณ ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
1/2

ํšŒ๊ณ ๋ก๊ฐ™์€ ๊ฒƒ์„ ์จ๋ณด๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ์ ์ด ์—†์ง€๋งŒ ์ฒ˜์Œ์œผ๋กœ ํ•œ๋ฒˆ ์จ๋ณด๊ณ ์žํ•œ๋‹ค.

์ด์œ ๋Š” ์–ด๋– ํ•œ ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ ๊นŠ์ด ์ƒ๊ฐํ•˜๋ฉฐ ํ•ด๊ฒฐํ•˜๋ คํ–ˆ๋˜ ๊ณผ์ •๋“ค์„ ๊ธฐ๋กํ•ด๋‘๊ณ ์‹ถ์–ด์„œ์ด๋‹ค.
(์–ผํ•๋ณด๋ฉด ๋ณ„ ๊ฒƒ์ด ์•„๋‹Œ ๋ฌธ์ œ์ด์ง€๋งŒ ํ•˜๋ฃจ๋ฅผ ๊ฑฐ์˜ ๋‹ค ๋ฐ”์ณ์ผ์Œ)

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

react-router๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์— ์˜ˆ์ œ๋“ค์„ ๊ณต๋ถ€ํ•˜๋ คํ–ˆ๋‹ค.
react router์˜ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์˜ Auth Example์ธ๋ฐ ์ด๋Š” ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•˜์ง€์•Š์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์ด ์„ž์—ฌ์žˆ์–ด ๊ณต๋ถ€ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํŒ๋‹จ์ด ๋“ค์—ˆ๋‹ค.

๋‚˜๋Š” react router version 6๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ์ค‘์ด์—ˆ๊ธฐ์— v6์œผ๋กœ authentication๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ๊ณ  ์‹ถ์—ˆ๋‹ค.

์—ฌ๊ธฐ์ €๊ธฐ ์ฐพ์•„๋ณด๋‹ค version6 authentication์„ ์ฐพ๊ฒŒ ๋˜์–ด ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฌธ์ œ์ ์ด ํ•˜๋‚˜ ์ƒ๊ฒผ๋‹ค.
๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

useAuth.js


function useAuth() {
  const [authed, setAuthed] = React.useState(false);

  return {
    authed,
    login() {
      return new Promise((res) => {
        setAuthed(true);
        res();
      });
    },
    logout() {
      return new Promise((res) => {
        setAuthed(false);
        res();
      });
    },
  };
}

export function AuthProvider({ children }) {
  const auth = useAuth();

  return <authContext.Provider value={auth}>{children}</authContext.Provider>;
}

export default function AuthConsumer() {
  return React.useContext(authContext);
}

Login.js

import { useNavigate } from "react-router-dom";
import useAuth from "./useAuth";

function Nav() {
  const { authed, logout } = useAuth();
  const navigate = useNavigate();

  const handleLogout = () => {
    logout();
    navigate("/");
  };

  return (
    <nav>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/pricing">Pricing</Link>
        </li>
      </ul>
      {authed && <button onClick={handleLogout}>Logout</button>}
    </nav>
  );
}

useAuth๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์ƒํƒœ,๋กœ๊ทธ์ธ,๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์„ ๋‚ด์žฌํ•œ ํ•จ์ˆ˜์ธ๋ฐ ์ด๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์˜๋„์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ์„œ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๋‹ค.

์ด ๋ฌธ์ œ์ ์— ๋Œ€ํ•˜์—ฌ ๋‚˜๋Š” 2๊ฐ€์ง€ ์˜๋ฌธ์ ์„ ๊ฐ€์กŒ๋‹ค.
1. useAuth๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ exportํ•˜์ง€์•Š๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ useAuth๋ฅผ ๊ฐ€์ ธ๋‹ค์“ธ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ธ๊ฐ€?
2. export default function useAuth๋ฅผ ํ•˜์˜€๋‹คํ•˜๋”๋ผ๋„ ๋ชจ๋“ˆ๋งˆ๋‹ค์˜ ์Šค์ฝ”ํ”„๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํ•ด๋‹น๊ฐ’์ด ๋‹ค๋ฅผํ…๋ฐ ์–ด๋–ป๊ฒŒ ์ „์—ญ์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ธ๊ฐ€?

1๋ฒˆ ์˜๋ฌธ์ ์— ๋Œ€ํ•˜์—ฌ ๋‹ต์„ ์ฐพ์ง€๋ชปํ•ด 2๋ฒˆ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์˜€๋Š”๋ฐ ์ด์กฐ์ฐจ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

useAuth๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค.
๊ทธ๋ฆฌํ•˜์—ฌ useAuth๊ฐ’์„ ์ „์—ญ์ ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ด ์žˆ์„๊นŒ๋ผ๊ณ  ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ(App)์—์„œ useAuthํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ฐ˜ํ™˜๊ฐ’๋“ค์„ prop drilling(ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ prop์œผ๋กœ ๋‚ด๋ ค์ฃผ๊ธฐ)ํ•˜์˜€๋‹ค.

์ด๊ฒƒ์ด ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ผ๋‹จ ํ•ด๊ฒฐํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ธฐ๋ปค๋‹ค.

์–ด์จ‹๋“  ์ง€๊ธˆ๋„ ์˜๋ฌธ์ ์ด ์žˆ๋Š” ์ฝ”๋“œ์ด์ง€๋งŒ ๊พธ์ค€ํžˆ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉฐ ๋ฌด์—‡์ด ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ์ธ์ง€ ํ™•์ธํ•˜๋ฉฐ ๋ณธ ์˜ˆ์ œ์—์„œ๋Š” ์™œ ์ €๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผ๊ฒ ๋‹ค.

์ž‘์€ ๋ฌธ์ œ์˜€์ง€๋งŒ ์˜ค๋žœ ์‹œ๊ฐ„ ๊ณต๋“ค์—ฌ์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค๋Š”๊ฒƒ์ด ๋ญ”๊ฐ€ ๋ฟŒ๋“ฏํ•˜๋‹ค.

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