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

 
 
 

Contributors