인증 & 인가 [Bcrypt, JWT]
인증 인가
Bcrypt 암호화
npm install bcryptjs --save-dev //bcrpt 설치
회원가입을 할 때 비밀번호를 암호화를 해서 DB 에 저장해 준다.
각종 에러를 처리하고 마지막에 데이터를 삽입하고 회원가입을 성공 시킨다.
암호화 진행 과정
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
const bcrypt = require("bcrypt");
const salt = bcrypt.genSaltSync();
const userSignup = async (req, res) => {
try {
const { email, password } = req.body;
console.log("email : ", email, "\n", "name : ", password);
//둘중에 하나의 입력값이라도 없을 때
if (email === undefined || password === undefined) {
return res.status(400).json({ message: "KEY_ERROR" });
}
// 비밀번호가 짧을 때
if (password.length < 8) {
return res.status(400).json({ message: "PASSWORD_TOO_SHORT" });
}
//이미 가입했는지 확인 //CUSTOM_ERROR
const selectUser = await prisma.$queryRaw`
SELECT email FROM users`;
for (let i in selectUser) {
if (selectUser[i].email == email) {
return res.status(409).json({ message: "EXSITING_USER" });
}
}
//hash 이용해서 비번 암호화
const makeHash = async (password) => {
return await bcrypt.hash(password, salt);
};
const hashedPassword = await makeHash(password);
// const hashedPassword = bcrypt.hashSync(password, salt); //이렇게 작성 가능
//해쉬된 비밀번호를 insert
const createdUser = await prisma.$queryRaw`
INSERT INTO users(email, password) VALUES (${email}, ${hashedPassword});`;
return res.status(201).json({ message: "SIGNUP_SUCCESS" });
} catch (err) {
console.log(err);
return res.status(err.statusCode || 500).json({ message: err.message });
}
};
module.exports = { userSignup };
이런식으로 해쉬를 이용해 비밀번호를 암호화하고 저장이 가능하다.
JWT 발행
npm install jsonwebtoken --save-dev //jsonwebtoken 설치
회원 로그인에 성공하면 권한이 필요한 화면에서 매번 로그인 하지 않고 토큰을 이용해서 대신한다.
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const salt = bcrypt.genSalt();
const userLogin = async (req, res) => {
try {
const { email, password } = req.body;
if (email === undefined || password === undefined) {
const error = new Error("KEY_ERROR");
error.statusCode = 400;
throw error;
}
const selectUser = await prisma.$queryRaw`
SELECT * FROM users WHERE email = ${email}`;
//유저정보에 이메일 없음
if (selectUser[0] == undefined) {
const error = new Error("NOT_A_USER");
error.statusCode = 404;
throw error;
}
//비밀번호 체크
const checkpw = bcrypt.compareSync(password, selectUser[0].password); //사용자가 입력한 비밀번호와 DB에 저장된 암호화된
//비밀번호를 비교해서 일치하는지 확인한다.
console.log(checkpw);
//if(true) -> Token 생성
if (checkpw) {
const user = { user_id: selectUser[0].id };
const token = jwt.sign(user, process.env.SECRET);
// const token = jwt.sign({ user_id: selectUser[0].id }, process.env.SECRET); //이런식으로도 사용가능
//const user_info = jwt.verify(token, process.env.SECRET, { //토큰을 이용해 유저정보를 확인
//expiresIn: "1h",
//});
return res.status(200).json({ message: token });
} else {
const error = new Error("WRONG_PASSWORD");
error.statusCode = 400;
throw error;
}
} catch (error) {
return res.status(error.statusCode || 500).json({ message: error.message });
}
};
module.exports = { userLogin };
.env 파일에 process.env.SECRET 변수가 숨겨져 있다.
process.env.SECRET 변수는 회사의 비밀 키이기 때문에 github 나 외부에 노출되는 것을 방지한다.
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB (Preview) and CockroachDB (Preview).
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
DATABASE_URL = "mysql://root:nk708802@localhost:3306/we_starbucks_3"
SECRET = "my_scret_key"
postman에서 아이디와 비밀번호를 입력해주면 로그인이 성공하여 토큰을 보내주는걸 확인할 수 있다.
댓글남기기