서버는 클라이언트보다 보안이 좋다.
그렇다고 서버가 모든 것을 완벽히 보안해주진 않는다.
사용자의 비밀번호를 서버에서 그대로 들고 있는 것은 보안에 치명적이다. 만약 해커가 서버를 해킹한다면 사용자의 비밀번호가 그대로 노출되기 때문이다.
암호(Cryptography)란 0과 1로 이루어진 이진수 데이터를 수학적 계산을 통한 비트 변경을 수행하는 것을 말한다. 정상적인 데이터(평문 - Plaintext)의 2진수 데이터를 암호화라는 과정으로 데이터를 변경하고, 복호화라는 과정을 통해 데이터를 원래대로 돌리는 기술을 의미한다.
- 암호화(Encrypt)와 복호화(Decrypt)는 각각 다음과 같이 설명할 수 있다.
- 암호화(Encrypt)는 사용자가 입력한 데이터를 알아볼 수 없는 데이터로 변경하는 과정을 말한다.
- 복호화(Decrypt)는 암호화된 데이터를 정상적인 데이터로 변경하는 과정을 말한다.
bcrypt란?
node.js 혹은 nestJS에서 비밀번호 암호화는 주로 bcrypt를 사용한다.
- 패스워드 해싱 알고리즘
- bcrypt는 사용자의 비밀번호를 안전하게 저장하기 위한 해시 알고리즘이다. 단방향 암호화 방식을 사용해, 비밀번호를 복호화할 수 없도록 해시 값을 생성한다.
- Adaptive Hashing Function
- bcrypt는 연산 비용(cost factor)을 조절할 수 있어, 컴퓨팅 파워가 증가하더라도 적절한 비용을 부여하여 보안을 유지할 수 있다. 이 비용 값이 높아질수록 해시 계산 시간이 길어져, 무차별 대입 공격(brute force attack)을 방지하는 데 효과적이다.
참고로 무차별 대입 공격에는 Dictionary Attack 이라는 것이 있는데, 해쉬라는 것이 항상 같은 값을 나온다는 기준이 있기 때문에 이를 이용하여 사람들이 많이 사용하는 값을 무작위로 선정하여 대입하는 공격이다.
이러한 공격을 막기 위해 탄생한 것이 Salt 이다. 말 그대로 소금 (빛과소금) 이라는 뜻으로, 마치 소금을 추가하듯 기존 패스워드에 특정 문자열을 추가하여 해쉬함수로 만드는 것이다.
정확히는 내부적으로 저장된 해시 문자열에서 salt와 비용 인자를 추출하여 입력된 비밀번호로부터 새 해시를 생성한다.
bcrypt 설치
npm install bcrypt
npm install --save-dev @types/bcrypt
bcrypt 암호화하기
const hash = await bcrypt.hash(
user.password,
HASH_ROUNDS,
);
bcrypt 비밀번호 비교하기
const passOk = await bcrypt.compare(user.password, existingUser.password);
'NestJS' 카테고리의 다른 글
VSC 디버거 사용하기 (0) | 2025.02.26 |
---|---|
Authentication - 로직 구현 (0) | 2025.02.26 |
Authentication - JWT (0) | 2025.02.26 |
TypeORM - Repository 메서드 종류 (0) | 2025.02.25 |
TypeORM - where 유틸리티 (0) | 2025.02.25 |