Home 로그인 페이지 만들기 - 03
Post
X

로그인 페이지 만들기 - 03

fs 모듈을 활용해 로그인 인증 기능을 구현해보자.


fs 모듈

fs 모듈은 파일 처리와 관련된 작업을 하는 모듈로 FileSystem을 줄여서 fs 모듈이라고 말합니다.

  • 설치
    1
    
    npm i fs
    

users 파일 작성

databases 폴더를 만들고 users.json 파일을 만듭니다.

해당 파일은 사용자 정보를 관리하는 파일로 데이터 베이스 역할을 합니다.

1
2
3
4
5
{
  "id": ["123", "1234", "12345"],
  "password": ["123", "1234", "12345"],
  "name": ["가", "나", "다"]
}

Model 작성

models 폴더에 model_fs.js 파일을 만듭니다.

먼저, 로그인 기능으로 사용자가 보낸 id 값을 통해 id, password를 비교해 로그인 기능을 구현해보겠습니다.

fs.promises 는 promise를 사용해 fs 메서드를 동기 처리합니다.

readFile 메서드는 인수로 들어온 파일을 읽어옵니다.

promise로 반환되므로 then 메서드로 데이터를 반환하고 catch 메서드로 에러를 처리합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// fs.promises 를 import해 사용합니다.
import { promises as fs } from "fs";

class UserStorage {
  static getUserInfo(id) {
    return fs
      .readFile("./src/databases/users.json")
      .then((data) => {
        // fs 모듈의 readFile 메서드로 읽어온 데이터를 객체화합니다.
        const users = JSON.parse(data);

        // 사용자가 보낸 id를 찾아 index 값을 저장합니다.
        const idx = users.id.indexOf(id);

        // 반환할 객체의 key 값들을 저장합니다.
        const usersKeys = Object.keys(users); // id, password, name

        // 새로운 객체를 만들어 사용자 정보를 저장합니다.
        const userInfo = {};
        for (let key of usersKeys) {
          userInfo[key] = users[key][idx];
        }

        // 사용자 정보를 반환합니다.
        return userInfo;
      })
      .catch((err) => {
        console.log(err);
      });
  }
}

export default UserStorage;

Controller 작성

작성한 Model 파일을 Controller에 import합니다.

사용자가 입력한 id와 일치하는 사용자 정보가 있는지 확인합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import UserStorage from "../models/model_fs.js";

const output = {
  login: (req, res) => {
    res.render("user/login");
  },

  register: (req, res) => {
    res.render("user/register");
  },
};

const process = {
  login: async (req, res) => {
    try {
      // req.body로 넘어온 사용자가 보낸 id로 사용자 정보를 받아옵니다.
      const user = await UserStorage.getUserInfo(req.body.id);

      var response = {};

      // 사용자의 입력 정보에 따라 로그인 성공, 비밀번호 불일치, 아이디 존재 X 등 기능을 처리하겠습니다.
      if (user) {
        if (password === req.body.password) {
          // id와, password 가 일치
          response = { success: true };
        } else {
          // 비밀번호 불일치
          response = { success: false, msg: "비밀번호가 틀렸습니다." };
        }
      } else {
        // 아이디 존재 X
        response = { success: false, msg: "존재하지 않는 아이디입니다." };
      }

      res.json(response);
    } catch (err) {
      // 에러 발생
      return { success: false, msg: "에러 발생" };
    }
  },

  register: (req, res) => {
    res.send("회원가입 완료");
  },
};

export default { output, process };

Js 파일 수정

서버로부터 받은 정보에 따른 처리를 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//login.js
"use strict";

const id = document.querySelector("#id"),
  password = document.querySelector("#password"),
  loginBtn = document.querySelector("#button");

loginBtn.addEventListener("click", login);

async function login() {
  if (!id.value) return alert("아이디를 입력해주세요.");
  if (!password.value) return alert("비밀번호를 입력해주세요.");

  const req = {
    id: id.value,
    password: password.value,
  };

  try {
    const res = await axios({
      url: "/user/login",
      method: "post",
      data: req,
    });

    if (res.data.success) {
      alert("로그인 성공");
    } else {
      // 로그인 실패 시 msg를 알림창에 띄웁니다.
      alert(res.data.msg);
    }
  } catch (err) {
    // 에러 처리
    alert(res.data.msg);
  }
}

결론

다음 포스트에선 AWS RDS를 연동해 데이터 베이스를 이용해 사용자 정보를 관리해보겠습니다.

또한 로그인, 회원가입, 로그아웃 기능을 구현해보겠습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.