728x90
저번시간에는 salt를 통한 단방향 암호화로 데이터베이스에 사용자의 비밀번호를 저장했다.
해당 비밀번호는 해독이 불가능하기에 해당 비밀번호를 풀어서는 비밀번호가 맞는지 확인할 수 없다.
사용자가 입력한 비밀번호를 암호화해서 비교하는 방식을 사용해야 한다.
우선 사용자에게 로그인 정보를 받는 컨트롤러를 만들어보자.
@Post("/signIn")
signIn(@Body() loginUserDto: LoginUserDto): Promise<Users>{
return this.authService.signIn(loginUserDto)
}
loginUserDto에는 당연히 email, password를 받고 있다.
우선 입력받은 email을 바탕으로 사용자를 데이터베이스에서 찾아온다.
해당 사용자가 존재하지 않으면 에러를 반환한다.
const {email, password} = loginUserDto;
const user = await this.usersService.findByEmail(email);
if(!user)
throw new UnauthorizedException();
이 user class 안에는 암호화된 비밀번호와 salt값이 결합되어 있을 것이다.
그거를 분리해서 salt와 hashedPassword로 가져온다.
const [salt, hashedPassword] = user.password.split('.');
그리고 사용자가 입력한 비밀번호를 salt로 암호화하고 데이터베이스의 비밀번호와 비교한다.
const hashed = (await scrypt(password, salt, 32)) as Buffer;
if(hashedPassword != hashed.toString('hex'))
throw new UnauthorizedException();
return user;
일치하면 성공, 불일치하면 에러이다.
한 번 테스트를 해보자.
우선 다음과 같이 사용자를 생성한다.
그럼 다음과 같이 데이터가 생성된다.
해당 암호화값으로는 비밀번호를 알 수 없기에 로그인 API를 호출해보자.
우선 잘못된 값을 넣어보았다.
그러면 당연히 비밀번호가 일치하지 않아 인증 오류가 발생한다.
이번에는 제대로된 데이터를 넣어보자.
이렇게 제대로 유저가 응답되는 것을 볼 수 있다.
아마 이게 가장 정석적인 암호화 방법이라고 생각된다.
salt를 추가한 방법으로 로그인들을 구현하도록 하자.
'Node > Nest' 카테고리의 다른 글
Nest에서 세션으로 사용자 정보 가져오기 (0) | 2025.07.12 |
---|---|
Nest에서 세션 사용하기 (0) | 2025.07.10 |
Nest에서 비밀번호 암호화해서 보관하기 (4) | 2025.07.10 |
Nest에서 response json 커스텀하기 (0) | 2025.07.08 |
Nest에서 repository를 이용해 CRUD 구현하기 (0) | 2025.07.07 |