2 분 소요

인증 인가

Bcrypt 암호화

npm install bcryptjs --save-dev  //bcrpt 설치

회원가입을 할 때 비밀번호를 암호화를 해서 DB 에 저장해 준다.

각종 에러를 처리하고 마지막에 데이터를 삽입하고 회원가입을 성공 시킨다.

암호화 진행 과정

image-20220321202451959

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 };

image-20220322093408710

이런식으로 해쉬를 이용해 비밀번호를 암호화하고 저장이 가능하다.

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에서 아이디와 비밀번호를 입력해주면 로그인이 성공하여 토큰을 보내주는걸 확인할 수 있다.

image-20220322094418694

카테고리:

업데이트:

댓글남기기