본문 바로가기
개발 기초 다지기

내일배움캠프 27일차 : bcrypt 암호화

by 너의고래 2024. 5. 23.
반응형

요즘 Node.js로 게시판을 만드는 공부를하며 회원가입, 로그인과 같은 Node.js의 인증, 인가 개념에 대해 배우고있다. 오늘은 이중에 회원가입과 로그인에서는 절대 빠질 수 없는 bcrypt 암호화에 대해 정리해보려한다.

 

! 일반적으로, 사용자의 비밀번호를 데이터베이스에 저장할 때, 보안을 위해 비밀번호를 평문으로 저장하지 않고 암호화 하여 저장

 

 

bcrypt란?

bcrypt 비밀번호와 같은 민감한 데이터를 안전하게 저장하기 위해 사용하는 해시 함수로 단방향 암호화 방식을 사용하여 원래의 비밀번호를 복구할 없도록 한다.

bcrypt 해시 함수의 출력값이 일정하지 않고, 같은 입력값이라도 매번 다른 해시값을 생성하므로 보안이 강화된다.

 

bcrypt 모듈이란?

bcrypt 모듈은 입력받은 데이터를 특정 암호화 알고리즘을 이용하여 암호화 검증을 도와주는 모듈

원래의 비밀번호를 복구할 수는 없지만, 입력된 비밀번호가 암호화된 문자열과 일치하는지는 비교할 수 있다.

이를 통해 사용자의 비밀번호가 올바른지, 아닌지 검증할  있다.

 

 

bcrypt 사용방법

1. 설치

# yarn을 이용해 bcrypt를 설치한다.
yarn add bcrypt

 

 

2. 비밀번호 암호화 (회원가입 시)

#import를 통해 설치한 bcrypt를 사용할 수 있게 해준다.
import bcrypt from 'bcrypt';

.
.
.

// 사용자 비밀번호를 암호화합니다.
  const hashedPassword = await bcrypt.hash(password, 10);

  // Users 테이블에 사용자를 추가합니다.
  const user = await prisma.users.create({
    data: {
      email,
      password: hashedPassword, // 암호화된 비밀번호를 저장합니다.
    },
  });

 

  • hash 함수를 통해 body에서 가져온 'password'를 암호화한다. (뒤에 10은 암호화 강도로 이해하면 된다.)
  • Users 테이블에 사용자를 추가하는 과정에서 암호화 시킨 hashedPassword를 저장한다.

 

3. 비밀번호가 암호화된 문자열과 일치하는지는 비교 (로그인 시)

로그인 API는 클라이언트가 전달한 정보를 바탕으로 사용자를 확인.
클라이언트로부터 받은 email과 password를 사용하여 데이터베이스에 저장된 사용자를 검증하고,
검증에 성공하면 JWT를 담고있는 쿠키를 생성하여 반환하게됨

 

** JWT(JSON Web Token)은 클라이언트와 서버 간의 보안성 있는 정보를 교환하기 위해 사용되는 컴팩트하고 독립적인 토큰. JWT는 주로 인증 및 권한 부여를 위한 용도로 많이 사용.

 

import jwt from 'jsonwebtoken';

/** 로그인 API **/
router.post('/sign-in', async (req, res, next) => {
  const { email, password } = req.body;
  const user = await prisma.users.findFirst({ where: { email } });

  if (!user)
    return res.status(401).json({ message: '존재하지 않는 이메일입니다.' });
  // 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
  else if (!(await bcrypt.compare(password, user.password)))
    return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });

  // 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
  const token = jwt.sign(
    {
      userId: user.userId,
    },
    'custom-secret-key',
  );

  // authotization 쿠키에 Berer 토큰 형식으로 JWT를 저장합니다.
  res.cookie('authorization', `Bearer ${token}`);
  return res.status(200).json({ message: '로그인 성공' });
});

 

  • prisma를 통해 DB에 body에서 가져온 email과 일치하는 user가 있는 찾아본 후 없으면, 오류 메세지를 전달한다.
  • compare 함수를 통해 body에서 가져온 password와 DB의 password를 비교 후 일치하지 않으면 오류 메세지를 전달한다.

 

 

 

이후 클라이언트는 로그인 이후 요청부터 쿠키를 함께 보내면, 이를 통해 서버에서는 해당 사용자를 식별하고, 인증(Authentication), 인가(Authorization) 과정을 거친다. 오늘은 bcrypt 암호화에 대해 정리할 것이기 때문에 여기까지 정리할 것이지만, 다음번에 미들웨어를 정리하며 인증, 인가에 대해서도 정리해보려한다. 지금 하나씩 웹을 구성하는 것들을 하나씩 구현해내고 있는데, 내가 온전한 웹사이트 하나를 만들 수 있게된다면 정말 뿌듯할 것 같다. 파이팅

반응형

댓글