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에서 검색한다.
그 다음으로 컨트롤러 파일에서 불러온 값들로 쿠키를 생성해 로그인 과정이 종료된다.