본문 바로가기
Do it Node.js/EJS BackEnd

19. 회원가입, bcrypt

by 갱생angel 2024. 3. 19.

해시 함수 : 비밀번호를 암호화할 때 쓰는 함수로, 입력값을 받아서 또다른 값으로 반환

  -일방향 함수로, 원래 입력값으로 복원하는 것이 불가능

  -해시가 노출되어도 입력값을 알아낼 수 없음

  -입력값을 조금만 변형해도 완전히 다른 해시가 나오며

  -입력값의 길이에 상관없이 해시의 길이는 항상 일정

 

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