[NEST.JS] Bcrypt를 이용하여 비밀번호 암호화하기

JUNHO YEOM·2022년 10월 20일
0

Nest.JS

목록 보기
5/7
post-thumbnail

사용자의 비밀번호를 암호화 하는것은 매우 중요하다.
암호화 방법에는 단방향 암호화와 양방향 암호화 방법이 있는데,
사용자의 비밀번호를 DB에 저장할 때는 단방향 암호화를 이용한다.

단방향 암호화는 암호화된 비밀번호를 다시 원상태로 복구하는 복호화가 불가능한 암호화 방식을 말한다.

이렇게 단방향 암호화된 비밀번호는 만약 비밀번호가 DB에서 유출 되더라도 원래 비밀번호를 찾는것이 불가능하여 사용자의 비밀번호를 보호할 수 있다.
bcrypt를 이용하여 단방향 암호화를 적용한다.

모듈 설치해주기

bcrypt 모듈 다운 받기

yarn add bcrypt

TypeScript의 Bcrypt 모듈 다운 받기

yarn add -D @types/bcrypt

TypeScript기반인 Nest 프레임워크에서 사용해 줄 것이기 때문에 TypeScript Bcrypt모듈도 함께 다운받아준다.


Bcrypt 적용하기

서비스에 Bcrypt를 import해준다.

import * as bcrypt from 'bcrypt';

hash 적용하기

예시

bcrypt.hash(myPlaintextPassword, saltRounds) // 입력한 password와 salt를 입력해준다.

Salt는 보안 수준을 더 높이기 위해서 문자열을 추가해 주는 것을 말한다.
number 형식으로 추가할 문자열의 길이를 입력해주면 자동으로 해당 길이의 문자열이 생성된다.

적용하기

const hashedPassword = await bcrypt.hash(password, 10);

npm Technique 2 (auto-gen a salt and hash) 예제를 참고했다.


결과

코드

import { ConflictException, Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateUserInput } from './dto/createUserInput';
import { UpdateUserInput } from './dto/updateUserInput';
import { User } from './entities/user.entity';
import * as bcrypt from 'bcrypt'; // Bcrypt 추가 해주기

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly usersRepository: Repository<User>,
  ) {}
  async create({ createUserInput }: { createUserInput: CreateUserInput }): Promise<User> {
    const { email, name, password } = createUserInput;
    const points = 500;

    // 비밀번호 암호화 하기
    const hashedPassword = await bcrypt.hash(password, 10)); // 암호화 해주기

    // email 존재하는지 확인하기
    const isValidEmail = await this.usersRepository.findOne({
      where: { email: email },
    });
    if (isValidEmail) throw new ConflictException('이미 존재하는 email 입니다.');

    return await this.usersRepository.save({
      email,
      name,
      password: hashedPassword,
      points,
    });
  }

DB

암호화가 잘 적용된 것을 알 수 있다.

마치며

const hashedPassword = await bcrypt.hash(password, Number(process.env.BCRYPT_SALT));

다음과 같이 .env를 사용하여 salt를 적용 하는 방법도 생각해봤는데 Salt는 랜덤으로 생성되고,
단지 자릿수만 적용해 주는 것이기 때문에 해당 방법으로 적용하지는 않았다.

bcrypt를 적용한 다른 예시로는 로그인 API를 사용하며 bcrypt.compare()로 비밀번호를
확인해야 하기 때문에, 로그인을 만들면서 다시 사용하게 될 것 같다.

0개의 댓글