Skip to content

nineto6/FE-Login

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

31 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ› οΈNINETO6 μ‚¬μ΄λ“œν”„λ‘œμ νŠΈ λ§Œλ“€κΈ°

μ‹œμž‘ν•˜κΈ° 전에...


  • ν˜„μž¬ Front-End 와 Back-end λŠ” λ‹€λ₯Έ ν™˜κ²½μ—μ„œ κ°œλ°œν•˜κ³  있음
  • Proxy λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒ


20230502

Form μˆ˜μ • ν›„ Internal Server Error 500

μ›λž˜ μ“°λ˜ νšŒμ›κ°€μž… Form 을 μˆ˜μ •ν•˜λ‹ˆ Internal Server Error 500 κ°€ 났닀.




function App() {
  // const { data, isLoading, refetch } = useQuery("userData", getData, {
  //   onSuccess: (data) => {
  //     console.log(data);
  //   },

  //   onError: (error) => {
  //     console.log(error);
  //   },
  // }); // 2023.05.02 ν˜„μž¬ GET μš”μ²­λΆ€λΆ„μ΄ μ—†μœΌλ―€λ‘œ μ£Όμ„μ²˜λ¦¬

  const { mutate } = OnPostData();

ν•΄λ‹Ή μ‚¬μœ λ₯Ό μ•Œκ³ λ³΄λ‹ˆ Back-End μ—μ„œ GET μš”μ²­μ„ λ°›λŠ” 뢀뢄을 아직 λ§Œλ“€μ§€ μ•Šμ•„ 생긴 문제

κ°„λ‹¨ν•˜κ²Œ GET μš”μ²­μ„ μ£Όμ„μ²˜λ¦¬ ν•˜μ—¬ ν•΄κ²° 함


Log-In μš”μ²­


둜그인 μš”μ²­μ„ μ œλŒ€λ‘œ λ°›μ•„μ˜€λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ Form 을 μ±„μ›Œ POST μš”μ²­μ„ 함





ν•΄λ‹Ήν•˜λŠ” 데이터 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μ‹œ failMsg λ₯Ό 톡해 "둜그인 정보가 μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€." λΌλŠ” λ©”μ„Έμ§€λ₯Ό λ°›μŒ

Database 에 μΌμΉ˜ν•˜λŠ” 데이터λ₯Ό λ„£κ³  λ‹€μ‹œ POST μš”μ²­



μΌμΉ˜ν•˜λŠ” 데이터가 μžˆμ„ 경우 ν•΄λ‹Ή 아이디 λΉ„λ°€λ²ˆν˜Έ 뿐만 μ•„λ‹ˆλΌ λ‹€λ₯Έ 정보도 μ •μƒμ μœΌλ‘œ λ³΄μ΄λŠ” 것을 확인

μΆ”ν›„ 토큰화 μ˜ˆμ •



https 둜 λ³€κ²½ν•˜κΈ°


  • 기쑴의 localhost λŠ” http λ₯Ό 기반으둜 λ™μž‘ν•˜λŠ”λ°, http λ₯Ό μ‚¬μš©ν•˜λ©΄ μΏ ν‚€ μ‚¬μš©μ— λ²ˆκ±°λ‘œμ›€μ΄ μžˆμœΌλ―€λ‘œ λ³€κ²½
  • https 둜 λ³€κ²½ν•˜κΈ° μœ„ν•΄ window λŠ” choco, mac 은 brew λ₯Ό μ‚¬μš©ν•΄ mksert λ₯Ό μ‚¬μš©
  • 참고자료 1 참고자료 2

  "scripts": {
    "start": "set HTTPS=true&&react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  } // λ‹¨μˆœνžˆ set HTTPS λ₯Ό μ΄μš©ν•΄ https λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.



ν•˜μ§€λ§Œ μΈμ¦μ„œκ°€ μ—†μ–΄μ„œ μœ„ν—˜ν•˜λ‹€λŠ” κ²½κ³  λ©”μ„Έμ§€κ°€ 좜λ ₯

κ°œλ°œν•˜λŠ”λ°μ—λŠ” μ§€μž₯이 μ—†μ§€λ§Œ 해결해보도둝 ν•˜μž


choco install mkcert // choco λ₯Ό μ‚¬μš©ν•΄ mkcert λ₯Ό μ„€μΉ˜
mkcert -install // μΈμ¦μ„œ λ°œκΈ‰μ„ μœ„ν•΄ ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ μ΅œμƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ 이동 ν›„ μ„€μΉ˜

ν•΄λ‹Ήν•˜λŠ” key 와 cert νŒŒμΌμ„ 생성해 μ£Όμ–΄μ•Ό ν•˜λ―€λ‘œ

mkcert -key-file ./key.pem -cert-file ./cert.pem "localhost"


κ·Έ 이후 SSL_CRT_FILE κ³Ό SSL_KEY_FILE 을 각각 cert.pem, key.pem 으둜 맀치 μ‹œμΌœμ€Œ

  "scripts": {
    "start": "set HTTPS=true&&set SSL_CRT_FILE=cert.pem&&set SSL_KEY_FILE=key.pem&&react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

npm start



경고창이 사라지고 localhost κ°€ https 둜 정상 좜λ ₯ λ˜λŠ” 것을 λ³Ό 수 있음



20230509

Header Autorization λ°›μ•„μ˜€κΈ°


Back-end μ—μ„œ header 의 Authorization 을 λ‹΄μ•„ μ£ΌκΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ.

ν…ŒμŠ€νŠΈ url 에 POST μš”μ²­μ„ λ³΄λƒˆμœΌλ©° request:200 이 μ •μƒμ μœΌλ‘œ λœ¨λŠ” 것을 확인




μ‘λ‹΅μœΌλ‘œ 받은 result 에 Bearer + TOKEN 값이 μ œλŒ€λ‘œ 담겨 온 것을 확인 ν•  수 있음

이제 ν•΄λ‹Ή ν…ŒμŠ€νŠΈ url 이 μ•„λ‹Œ 기쑴에 μ‚¬μš©ν•˜λ˜ api/user/login url 에 μ—°κ²°



λ³Έ url 인 api/user/login url 의 request-header 에 authorization 이 μ œλŒ€λ‘œ λ‹΄κΈ΄ 것을 확인 ν•  수 있음

이제 ν•΄λ‹Ήν•˜λŠ” TOKEN 값을 localStorage 에 λ‹΄μ•„ μ‚¬μš© ν•  것




localStorage 에 λ‹΄κΈ°


  • localStorage λŠ” λΈŒλΌμš°μ € λ‚΄ token 을 μ €μž₯ν•΄ λ‹€μ‹œ μΌœλ„ ν•΄λ‹Ή 값을 μ‚¬μš©ν•˜κΈ° μœ„ν•¨ (login, logout)
  • μ‘λ‹΅μ˜ header (response.header) λŠ” JSON ν˜•μ‹μ΄λ―€λ‘œ κ·Έλƒ₯ μ ‘κ·Όν•˜λ©΄ null or undefined 였λ₯˜κ°€ λ‚˜λ―€λ‘œ JSON.stringify 둜 μˆ˜μ •ν•΄ μ ‘κ·Όν•΄μ•Ό 함

// api.ts
export const postData = async (data: IFormData) => {
  return await axios.post(API_URL, data).then((response) => {
    if (response.status === 200) {
      axios
        .post(API_URL, data)
        .then((response) => {
          console.log(response);
          let ACCESS_TOKEN = JSON.stringify(response.headers["authorization"]);
          // JSON ν˜•μ‹μ΄λ―€λ‘œ JSON.stringify λ₯Ό μ‚¬μš©ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€. (*λŒ€μ†Œλ¬Έμž 주의*)
          // ACCESS_TOKEN 으둜 μ΄ˆκΈ°ν™”
          console.log(ACCESS_TOKEN);
          localStorage.setItem("loginToken", ACCESS_TOKEN);

          console.log(localStorage.getItem("loginToken"));
          // localStorage 에 μ œλŒ€λ‘œ 값이 λ‹΄κ²ΌλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©
        })
        .catch((error) => {
          console.log(error);
        });
    }
  });
};



F12 > application > local storage λ₯Ό 확인해보면 ν•΄λ‹Ή localStorage 에 μ •μƒμ μœΌλ‘œ Token 값이 적재 된 것을 λ³Ό 수 있음


//api.ts

// Header 에 κ°’ λ„£μ–΄μ£ΌλŠ” 방법 1.
  export async function getData() {
    const request: HeadersInit = new Headers();
    // Headers 둜 직접 헀더λ₯Ό 생성
    let token = await JSON.parse(localStorage.getItem("loginToken") || "{}");
    // μƒˆ Header 에 λ°›μ•„μ„œ JSON ν˜•μ‹μœΌλ‘œ λ°”κΏ” μ‚¬μš©
    // JSON.parse λŠ” ts λ‚΄μ—μ„œ || 둜 빈 {} 값을 보내주어야 type errorκ°€ λ‚˜μ§€μ•ŠμŒ

    if (!token) {
      throw new Error("error");
    } else {
      request.set("authorization", token);
      // header 에 authorization 으둜 값을 μ„ΈνŒ… ν›„
    }

    return await fetch(BOARD_URL, {
      method: "GET",
      headers: request, // λ„£μ–΄μ€Œ
    }).then((response) => {
      ...

// Header 에 κ°’ λ„£μ–΄μ£ΌλŠ” 방법 2
  export const axiosPostData = async (data: IBoardData) => {
    return await axios.post(BOARD_URL, data, {
      headers: {
        Authorization: await JSON.parse(
          localStorage.getItem("loginToken") || "{}"
        ),
      },
    });
  };


20230511

get-board (GET)


  • κ²Œμ‹œκΈ€ μž„μ‹œμ •λ³΄μΈ board λ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ axios λ₯Ό μ‚¬μš©
  • header > Authorization 에 localStorage λ₯Ό μ μž¬ν•΄ μš”μ²­ν•˜λŠ” 것이 관건
  • header 의 토큰이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μ‹œ μš”μ²­μ„ 거뢀함

  export async function axiosGetData() {
    const request: HeadersInit = new Headers();
    let token = await JSON.parse(localStorage.getItem("loginToken") || "{}");
    // μƒˆ Header 에 λ°›μ•„μ„œ JSON ν˜•μ‹μœΌλ‘œ λ°”κΏ” μ‚¬μš©
    // JSON.parse λŠ” ts λ‚΄μ—μ„œ || 둜 빈 {} 값을 보내주어야 type errorκ°€ λ‚˜μ§€μ•ŠμŒ

    if (!token) {
      throw new Error("error");
    } else {
      request.set("authorization", token);
    }

    return axios.get(BOARD_URL, {
      headers: {
        Authorization: token,
      },
    });
  }



write-board (POST)


  • κ²Œμ‹œκΈ€μ„ μž‘μ„±ν•˜κΈ° μœ„ν•΄ μž„μ‹œ form 을 생성
  • μ›λž˜ μ‚¬μš©ν•˜λ˜ 둜그인의 useQuery 와 κ²ΉμΉ˜λ―€λ‘œ rename ν•„μš”
  • localStorage 에 λ‹΄κΈ΄ 토큰이 λ‹€λ₯΄λ©΄ κΈ€ μž‘μ„± μ‹œ Back-End μ—μ„œ ꡭ적이 λ°”λ€Œκ²Œ μ„€μ •

//api.ts
  export const OnAxiosPostData = () => {
    return useMutation(axiosPostData);
  };

  export const axiosPostData = async (data: IBoardData) => {
    return await axios.post(BOARD_URL, data, {
      headers: {
        Authorization: await JSON.parse(
          localStorage.getItem("loginToken") || "{}"
        ),
      },
    });
  };

//App.tsx
  const {
    register: boardReg,
    handleSubmit: boardHandle,
    setError: boardSetError,
    formState: { errors: boardErrors },
  } = useForm<IBoardData>();

  ...

  return (

  )


λ‹€λ₯Έ ν† ν°μœΌλ‘œ 둜그인 ν›„ 글을 μž‘μ„± μ‹œ μ •μƒμ μœΌλ‘œ ꡭ적이 λ°”λ€ŒλŠ” λͺ¨μŠ΅

About

front-end login form test

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published