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를 추가한 방법으로 로그인들을 구현하도록 하자.

+ Recent posts