-> localhost에 바로 뒤에 나오는 "/"들은 root라고 한다.
import express from "express";
import { join, login } from "../controllers/userController";
import { home, search } from "../controllers/videoController";
const rootRouter = express.Router();
rootRouter.get("/",home);
rootRouter.get("/join",join);
rootRouter.get("/login",login);
rootRouter.get("/search", search);
export default rootRouter;
모든 globalRouter -> rootRouter로 바꾸어주기
-> Schema는 mongoose를 이용해 만듦.
-> Unique: 다른 유저와의 동일한 것을 막기 위한 것임. 아이디나 유저네임이 겹치면 안돼서.
import mongoose from "mongoose";
const userSchema = new mongoose.Schema({
email:{ type:String, required: true, unique:true },//unique: 딱 하나만 존재하게 해주려고.
username:{ type:String, required: true, unique:true },
password:{ type:String, required: true },
name:{ type:String, required:true },
location: String,
})
const User = mongoose.model("User",userSchema);
export default User;
import User from "./models/User";
//추가
li
a(href="/join") Join
//원래
rootRouter.get("/join",join);
//수정
import { getJoin, postJoin, login } from "../controllers/userController";
rootRouter.route("/join").get(getJoin).post(postJoin);
extends base
block content
form(method="POST")
input(name="name", type="text", required, placeholder="Name")
input(name="email", type="email", required, placeholder="Email")
input(name="username", type="text", required, placeholder="User name")
input(name="password", type="password", required, placeholder="Password")
input(name="location", type="text", required, placeholder="Location")
input(type="submit", value="Join")
-> form에서 post해준 내용을 받고, User를 생성해준뒤, 유저를 login페이지로 보낼 것임.
-> console.log(req.body)
{
name: '이원규',
email: 'fovert@khu.ac.kr',
username: 'LeeWonKyu',
password: 'dnjsrb123@',
location: '홍천'
}
-> DB에 접근했을 떄, 이런 식으로 뜸. 이 때 password가 보이면 해킹 위험성이 굉장히 높으므로, 이를 보안처리 해줘야함. 패스워드를 가리는 걸 해줌. 가려도 패스워드가 일치하는지 안하는지를 알 수 있는 방법이 있음.(password hashing을 해줄 것임.)
hashing test사이트
hashing fn강의
-> hashing은 일방향(일대일) 함수인데, x->y로만 갈 수 있음. 거꾸로는 갈 수 X.
-> 같은 입력값으로 같은 hashing출력값이 나옴.
-> 만약 password를 함수에 넣어주면 그거에 대응하는 요상한 문자열(id같은거)을 출력하고 DB에는 이 요상한 문자열이 저장될 것임. (121212->afoiehf&Zkrwo23#aofnzsifn)이런식으로.
-> 하지만 이 hash도 레인보우 테이블이라는 것이 있어서 해킹 당할 수 있음.
이 때문에 생긴 것이 Salt라는 것임.
-> Salt(랜덤한 문자열)는 password와 같이 조합되어 hashing fn에 들어가게 되는데 이렇게 되면 레인보우 테이블을 이용해 hashing을 풀어도 password를 알 수 없음.
About bcrypt
-> 우리가 hashing할 때 사용할 건, bcrypt임. Blowfish cipher를 기반으로 만들어짐. 여러 언어에서 이를 사용할 수 있음.
-> bcrypt에는 salt가 내장돼 있어서 해킹 당하지 않음.
npm i bcrypt
bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
// Store hash in your password DB.
});
//saltRounds: hashing을 몇번 해줄 것인지.
-> User.js(model)있는곳으로 ㄱ ㄱ
-> Schema와 model사이에 작성
import bcrypt from "bcrypt";
userSchema.pre("save", async function() {//save: fn에 있는 값으로 update해서 저장해줌.
//console.log("befor hash: ",this.password) -> hash되기 전
this.password = await bcrypt.hash(this.password, 5);//callback fn 공백 이유: await을 써주고 있기 때문
//console.log("after hash: ",this.password) -> hash된 후
});
password: 12345넣었는데, hashing과정을 통해 DB에서는 이렇게 나타남.
//원래
export const join = (req, res) => res.send("join");
//수정 및 추가
import User from "../models/User";
export const getJoin = (req, res) => res.render("join",{pageTitle:"Join");
export const postJoin = async(req, res) => {
//console.log(req.body);-> 이걸로 post로 받아온거 확인해보삼
const { name, username, email, password, location } = req.body;
await User.create({
name,
username,
email,
password,
location,
})//User 생성
return res.redirect("/login");//회원가입하고 login창으로 보내주기
};
-> 이건 오래된 기능을 쓰고 있으니, 다른 코드로 바꾸라는 얘기임. 나중에 오류날 가능성이 있다는 얘기.
-> 대처법: 경고창에 뜨는 걸 그대로 하면댐.
여기서는 unique: true가 오래된 코드이니 다음의 코드를 추가하라고 함.
userCreateIndex : true를 db.js에 mongoose.connection 쪽에 추가 ㄱ ㄱ