Dev

로그인 기능 구현

Wermut 2025. 2. 27. 02:21

 

로그인 필수 기능

 

로그인에서 구현해야 할 기능은 다음과 같다.

 

1. DB에서 사용자가 입력한 id와 pw가 일치하는 자료를 찾아 이를 반환

2. DB에서 사용자의 권한 정보를 조회해 최종적으로 jwt 형식의 쿠키 생성.


 

기능 구현

 

//login.route.js

const express = require("express");
const loginController = require("../controllers/login.controller.js");

const router = express.Router();

router.get("/", loginController.renderLoginPage);

router.post("/", loginController.handleLogin);

module.exports = router;

 

따라서 라우터 파일은 주소창으로 접근하는 get 요청을 처리하는 라우터와

입력을 통한 요청인 post를 처리하는 라우터로 그 역할을 분배해야 한다. 

 

//login.controller.js

const LoginModel = require('../models/login.js');
const jwt = require("jsonwebtoken");

const SECRET_key = process.env.SECRET_key;

exports.renderLoginPage = (req, res) => {
    res.render("login");
};

exports.handleLogin = async (req, res) => {
    const { id, pw } = req.body;

    LoginModel.loginUser({ id, pw }, async (err, results) => {
        if (err) {
            console.error(err);
            return res.send(`<script>alert("Invalid ID/PW"); window.location.href = '/login';</script>`);
        };

        const userClass = await LoginModel.classCheck({id});

        const token = jwt.sign({ id: `${id}`, class : userClass }, SECRET_key);
        res.cookie("session", `${token}`)
        res.send(`<script>alert("Login Success"); window.location.href = '/wargame';</script>`);
    
    });
};

 

post로 접근했을때의 실행할 함수를 컨트롤러 파일에서 정의해 주고,

컨트롤러 파일에선 유저가 입력한 값을 req.body를 통해 파싱 한 뒤, 모듈 파일로 넘기게 된다.

 

const mysql = require("mysql2");
const md5 = require('md5');

require("dotenv").config({ path: __dirname + "/config/.env" });

const user = process.env.MySQL_user;
const pass = process.env.MySQL_pass;

const conn = mysql.createConnection({
    host: "localhost",
    port: 3306,
    user: user,
    password: pass,
    database: "wargame",
});

conn.connect((err) => {
    if (err) {
        console.error('Database connection failed: ', err);
        return;
    }
    console.log('Connected to the Login DB');
});


exports.loginUser = (userData, callback) => {
    const login_query = 'SELECT * FROM users WHERE id = ? AND pw = ?;';

    conn.query(login_query, [userData.id, md5(userData.pw)], (err, results) => {
        if (err) {
            return callback(err); 
        }
        callback(null, results);
    });
};

exports.classCheck = async(userData) => {
    const class_query = 'SELECT class FROM users WHERE id = ?;';

    const userClass = await conn.promise().query(class_query, [userData.id]);
    return userClass[0][0].class;
};

 

모듈 파일의 loginUser 함수에선 SQL 쿼리를 통해 사용자의 입력에 해당하는 자료를 조회하고,

classCheck는 id와 pw가 정상적으로 입력되었을 때 그에 해당하는 권한정보를 DB에서 검색한다.

 

그 다음으로 컨트롤러 파일에서 불러온 값들로 쿠키를 생성해 로그인 과정이 종료된다.