반응형

다음은 이 글의 동영상 강의 입니다.

https://youtu.be/LbyfF6ALMo0

 

비밀번호 암호와의 필요성

회원 가입시 비밀번호를 그대로 저장하면 보안사고의 위험이 있습니다.
만약 고객의 정보가 노출되었을 경우 해당 비밀번호를 이용하여 다른 사이트를 해킹할 경우 많은 피해가 발생할 수 있습니다.
따라서 실제 프로젝트에서 비밀번호는 반드시 암호화하여 저장해야만 합니다.
이번 글에서는 비밀번호를 암호화하는 방법에 대해 알아보겠습니다.
 

BCrypt

여기서는 nodejs에서 비밀번호 암호화시 많이 사용하는 bcrypt라는 패키지를 사용합니다.
다음은 npmjs.com의 bcrypt 설명페이지입니다.
 
bcrypt는 비밀번호를 암호화하는 키방식의 암호화 함수 입니다.

 

예제 소스 다운로드

여기서 사용하는 예제 소스는 아래 URL에서 받으실 수 있습니다.

https://github.com/CodeGearGit/nest-sample

 

GitHub - CodeGearGit/nest-sample: nestjs sample program

nestjs sample program. Contribute to CodeGearGit/nest-sample development by creating an account on GitHub.

github.com

 

bcrypt  추가

기존 프로젝트에 bcrypt 패키지를 설치합니다.
nestjs가 typescript 기반이므로 @types/bcrypt를 사용합니다.
npm install --save bcrypt @types/bcrypt
 

회원 가입 시 비밀번호 암호화

비밀번호 암호화 소스를 아래와 같이 작성합니다.
auth/user.service.ts
import * as bcrypt from 'bcrypt';

async transformPassword(user: UserDTO): Promise<void> {
	user.password = await bcrypt.hash(
		user.password, 10,
	);
	return Promise.resolve();
}

 

회원 정보를 저장하기 전에 패스워드 암호화 로직을 추가합니다.
auth/user.service.ts
async save(userDTO: UserDTO): Promise<UserDTO | undefined> {
	await this.transformPassword(userDTO);
	console.log(userDTO);
	return await this.userRepository.save(userDTO);
}

 

포스트맨을 이용해 사용자를 생성하는 API를 호출합니다.

결과

Database에는 다음과 같이 들어가 있는 것을 볼 수 있습니다.

 

 

로그인시 패스워드 체크 로직 수정

로그인시 패스워드 확인하는 부분을 수정합니다.
이때 bcrypt의 compare를 사용하여 입력받은 password와 저장된 password를 비교합니다.
auth.service.ts
import * as bcrypt from 'bcrypt';

async validateUser(userDTO: UserDTO): Promise<string | undefined> {
	let userFind: UserDTO = await this.userService.findByFields({
		where: { username: userDTO.username }
	});
	const validatePassword = await bcrypt.compare(userDTO.password, userFind.password)
	if(!userFind || !validatePassword) {
		throw new UnauthorizedException();
	}
	return "Login Success!";
}
포스트맨을 이용해 로그인을 테스트합니다.
 

결과

로그인 정보를 잘못 입력한 경우의 결과
이상으로 비밀번호 암호화 하는 방법에 대해 알아보았습니다.
반응형

+ Recent posts