해시 함수 : 비밀번호를 암호화할 때 쓰는 함수로, 입력값을 받아서 또다른 값으로 반환
-일방향 함수로, 원래 입력값으로 복원하는 것이 불가능
-해시가 노출되어도 입력값을 알아낼 수 없음
-입력값을 조금만 변형해도 완전히 다른 해시가 나오며
-입력값의 길이에 상관없이 해시의 길이는 항상 일정
bcrypt : 비밀번호를 해시로 변환해서 데이터베이스에 저장하는 모듈
>> npm install bcrypt
views - <register.ejs> : 회원가입 페이지
<%- include('./include/_header') %>
<main id="site-main">
<h3>사용자 등록</h3>
<form action="/register" method="POST" class="register">
<label for="username"><b>아이디</b></label>
<input type="text" placeholder="아이디" name="username" id="username" />
<label for="password"><b>비밀번호</b></label>
<input
type="password"
placeholder="비밀번호"
name="password"
id="password"
/>
<label for="password2"><b>비밀번호 확인</b></label>
<input
type="password"
placeholder="비밀번호 확인"
name="password2"
id="password2"
/>
<input type="submit" value="등록" class="register-btn" />
</form>
</main>
<%- include('./include/_footer') %>
models - <userModel.js> : User 스키마 생성
const mongoose = require("mongoose"); //몽구스 모듈 가져오기
const Schema = mongoose.Schema; //스키마 생성
const UserSchema = new Schema({
username: {
type: String,
require: true,
unique: true, //중복할 수 없음
},
password: {
type: String,
require: true,
},
});
module.exports = mongoose.model("User", UserSchema);
controllers - <loginController.js> : user 컨트롤러 생성
※bcrypt.hash(data, saltRounds, callback) : 입력값을 해시
-data : 입력값
-saltRounds : 해시할 횟수
-callback : 콜백 함수
const asynchHandler = require("express-async-handler");
const User = require("../models/userModel"); //스키마 불러오기
const bcrypt = require("bcrypt"); //bcrypt 모듈 불러오기
//Get Register Page, /register
const getRegister = (req, res) => { //회원가입 페이지 불러오기
res.render("register");
};
//Post Register User, /register
const registerUser = asynchHandler(async (req, res) => { //회원가입 기능
const { username, password, password2 } = req.body;
//사용자 이름, 비밀번호, 비밀번호 확인을 req.body에 넣음
if (password === password2) { //비밀번호, 비밀번호 확인이 같을 경우
const hashedPassword = await bcrypt.hash(password, 10); //비밀번호를 10번 해시
const user = await User.create({ username, password: hashedPassword });
//사용자 이름, 해시 비밀번호를 데이터베이스에 추가
res.status(201).json({ message: "Register Success", user });
} else { //비밀번호, 비밀번호 확인이 틀릴 경우
res.status(400).send("Register Failed");
}
});
module.exports = { getRegister, registerUser };
routes - <loginRoutes.js> : user 라우터 생성
const express = require("express");
const router = express.Router();
const { getRegister,cregisterUser } = require("../controllers/loginController");
router.route("/register").get(getRegister).post(registerUser); //GET, POST 지정
module.exports = router;
app.js
const express = require("express");
const dbConnect = require("./config/dbConnect");
const methodOverride = require("method-override");
const app = express();
app.set("view engine", "ejs");
app.set("views", "./views");
dbConnect();
app.use(express.static("./public"));
app.use(methodOverride("_method"));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/", require("./routes/loginRoutes")); //loginRoutes 추가
app.use("/contact", require("./routes/contactRoutes"));
app.listen(3000, () => {
console.log("3000 포트에서 서버 실행 중");
});
'Do it Node.js > EJS BackEnd' 카테고리의 다른 글
20. 로그인, 토큰 (0) | 2024.03.19 |
---|---|
18. 연락처 추가, 삭제 (0) | 2024.03.16 |
17. 연락처 추가 (0) | 2024.03.15 |
16. include, 연락처 표시 (0) | 2024.03.14 |
15. EJS (0) | 2024.03.13 |